From 8e086d5a90b2775a2aa0b44fad160086cb206922 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Fri, 1 Apr 2011 23:59:35 -0700 Subject: [PATCH 1/4] QnA - save answer revisions and show # of revisions --- plugins/QnA/QnAPlugin.php | 4 + plugins/QnA/actions/qnanewanswer.php | 4 +- plugins/QnA/actions/qnareviseanswer.php | 205 ++++++++++++++++++++++++ plugins/QnA/classes/QnA_Answer.php | 12 +- plugins/QnA/classes/QnA_Question.php | 4 +- plugins/QnA/lib/qnareviseanswerform.php | 11 +- 6 files changed, 229 insertions(+), 11 deletions(-) create mode 100644 plugins/QnA/actions/qnareviseanswer.php diff --git a/plugins/QnA/QnAPlugin.php b/plugins/QnA/QnAPlugin.php index 9a05eeb0b2..5740054a5f 100644 --- a/plugins/QnA/QnAPlugin.php +++ b/plugins/QnA/QnAPlugin.php @@ -124,6 +124,10 @@ class QnAPlugin extends MicroAppPlugin 'main/qna/newanswer', array('action' => 'qnanewanswer') ); + $m->connect( + 'main/qna/reviseanswer', + array('action' => 'qnareviseanswer') + ); $m->connect( 'question/vote/:id', array('action' => 'qnavote', 'type' => 'question'), diff --git a/plugins/QnA/actions/qnanewanswer.php b/plugins/QnA/actions/qnanewanswer.php index 09d111040d..a91ae9ad39 100644 --- a/plugins/QnA/actions/qnanewanswer.php +++ b/plugins/QnA/actions/qnanewanswer.php @@ -20,7 +20,7 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * - * @category QuestonAndAnswer + * @category QnA * @package StatusNet * @author Zach Copley * @copyright 2011 StatusNet, Inc. @@ -158,7 +158,7 @@ class QnanewanswerAction extends Action $this->element('title', null, _m('Answers')); $this->elementEnd('head'); $this->elementStart('body'); - $this->raw() + $this->raw($this->answer->asHTML()); $this->elementEnd('body'); $this->elementEnd('html'); } else { diff --git a/plugins/QnA/actions/qnareviseanswer.php b/plugins/QnA/actions/qnareviseanswer.php new file mode 100644 index 0000000000..686cf8d46d --- /dev/null +++ b/plugins/QnA/actions/qnareviseanswer.php @@ -0,0 +1,205 @@ +. + * + * @category QnA + * @package StatusNet + * @author Zach Copley + * @copyright 2011 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ +if (!defined('STATUSNET')) { + // This check helps protect against security problems; + // your code file can't be executed directly from the web. + exit(1); +} + +/** + * Revise an answer + * + * @category QnA + * @package StatusNet + * @author Zach Copley + * @copyright 2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ +class QnareviseanswerAction extends Action +{ + protected $user = null; + protected $error = null; + protected $question = null; + protected $answer = null; + protected $content = null; + + /** + * Returns the title of the action + * + * @return string Action title + */ + function title() + { + // TRANS: Page title for revising a question + return _m('Revise answer'); + } + + /** + * For initializing members of the class. + * + * @param array $argarray misc. arguments + * + * @return boolean true + */ + function prepare($argarray) + { + parent::prepare($argarray); + if ($this->boolean('ajax')) { + StatusNet::setApi(true); + } + + $this->user = common_current_user(); + + if (empty($this->user)) { + // TRANS: Client exception thrown trying to answer a question while not logged in. + throw new ClientException( + _m("You must be logged in to answer to a question."), + 403 + ); + } + + if ($this->isPost()) { + $this->checkSessionToken(); + } + + $id = substr($this->trimmed('id'), 7); + + common_debug("XXXXXXXXXXXXXXXXXX id = " . $id); + + $this->answer = QnA_Answer::staticGet('id', $id); + $this->question = $this->answer->getQuestion(); + + if (empty($this->answer) || empty($this->question)) { + // TRANS: Client exception thrown trying to respond to a non-existing question. + throw new ClientException( + _m('Invalid or missing answer.'), + 404 + ); + } + + $this->answerText = $this->trimmed('answer'); + + return true; + } + + /** + * Handler method + * + * @param array $argarray is ignored since it's now passed in in prepare() + * + * @return void + */ + function handle($argarray=null) + { + parent::handle($argarray); + + if ($this->isPost()) { + $this->reviseAnswer(); + } else { + $this->showPage(); + } + + return; + } + + /** + * Revise the answer + * + * @return void + */ + function reviseAnswer() + { + $answer = $this->answer; + + try { + $orig = clone($answer); + $answer->content = $this->answerText; + $answer->revisions++; + $result = $answer->update($orig); + } catch (ClientException $ce) { + $this->error = $ce->getMessage(); + $this->showPage(); + return; + } + if ($this->boolean('ajax')) { + common_debug("ajaxy part"); + header('Content-Type: text/xml;charset=utf-8'); + $this->xw->startDocument('1.0', 'UTF-8'); + $this->elementStart('html'); + $this->elementStart('head'); + // TRANS: Page title after sending an answer. + $this->element('title', null, _m('Answer')); + $this->elementEnd('head'); + $this->elementStart('body'); + $this->raw($answer->asHTML()); + $this->elementEnd('body'); + $this->elementEnd('html'); + } else { + common_redirect($this->answer->bestUrl(), 303); + } + } + + /** + * Show the revise answer form + * + * @return void + */ + function showContent() + { + if (!empty($this->error)) { + $this->element('p', 'error', $this->error); + } + + $form = new QnareviseanswerForm($this->answer, $this); + $form->show(); + + return; + } + + /** + * Return true if read only. + * + * MAY override + * + * @param array $args other arguments + * + * @return boolean is read only action? + */ + function isReadOnly($args) + { + if ($_SERVER['REQUEST_METHOD'] == 'GET' || + $_SERVER['REQUEST_METHOD'] == 'HEAD') { + return true; + } else { + return false; + } + } +} diff --git a/plugins/QnA/classes/QnA_Answer.php b/plugins/QnA/classes/QnA_Answer.php index 5727411a80..79970dc1df 100644 --- a/plugins/QnA/classes/QnA_Answer.php +++ b/plugins/QnA/classes/QnA_Answer.php @@ -205,8 +205,16 @@ class QnA_Answer extends Managed_DataObject { $notice = $question->getNotice(); - $fmt = 'answer by %3$s'; - $fmt .= '%4$s'; + $fmt = '

'; + $fmt .= 'answer by %3$s'; + $fmt .= '%4$s'; + if (!empty($answer->revisions)) { + $fmt .= '' + . $answer->revisions + . _m('revisions') + . ''; + } + $fmt .= '

'; return sprintf( $fmt, diff --git a/plugins/QnA/classes/QnA_Question.php b/plugins/QnA/classes/QnA_Question.php index 2403857d28..0446128ea0 100644 --- a/plugins/QnA/classes/QnA_Question.php +++ b/plugins/QnA/classes/QnA_Question.php @@ -221,11 +221,11 @@ class QnA_Question extends Managed_DataObject { $notice = $question->getNotice(); - $fmt = '
'; + $fmt = '

'; $fmt .= '%2$s'; $fmt .= '%3$s'; $fmt .= 'asked by %5$s'; - $fmt .= '

'; + $fmt .= '

'; $q = sprintf( $fmt, diff --git a/plugins/QnA/lib/qnareviseanswerform.php b/plugins/QnA/lib/qnareviseanswerform.php index 48f47e5e98..f9ebae132c 100644 --- a/plugins/QnA/lib/qnareviseanswerform.php +++ b/plugins/QnA/lib/qnareviseanswerform.php @@ -91,7 +91,7 @@ class QnareviseanswerForm extends Form */ function action() { - return common_local_url('qnareviseanswer', array('id' => $this->question->id)); + return common_local_url('qnareviseanswer'); } /** @@ -101,12 +101,13 @@ class QnareviseanswerForm extends Form */ function formData() { - $question = $this->question; $out = $this->out; - $id = "question-" . $question->id; - $out->element('p', 'Your answer to:', $question->title); - $out->textarea('answerText', 'You said:', $this->answer->content); + $out->element('p', 'Your answer to:', $this->question->title); + + $id = "answer-" . $this->answer->id; + $out->hidden('id', $id); + $out->textarea('answer', 'You said:', $this->answer->content); } /** From bac112c244b6c9a311110e920912ebfb84fab7d5 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Sun, 3 Apr 2011 16:57:59 -0700 Subject: [PATCH 2/4] QnA - Better display of questions and answers in streams --- plugins/QnA/QnAPlugin.php | 92 ++++++++++++++++++++++++---- plugins/QnA/actions/qnanewanswer.php | 7 ++- 2 files changed, 85 insertions(+), 14 deletions(-) diff --git a/plugins/QnA/QnAPlugin.php b/plugins/QnA/QnAPlugin.php index 5740054a5f..e53d56928c 100644 --- a/plugins/QnA/QnAPlugin.php +++ b/plugins/QnA/QnAPlugin.php @@ -290,6 +290,50 @@ class QnAPlugin extends MicroAppPlugin return true; } + /** + * Output our CSS class for QnA notice list elements + * + * @param NoticeListItem $nli The item being shown + * + * @return boolean hook value + */ + + function onStartOpenNoticeListItemElement($nli) + { + + $type = $nli->notice->object_type; + + switch($type) + { + case QnA_Question::OBJECT_TYPE: + $id = (empty($nli->repeat)) ? $nli->notice->id : $nli->repeat->id; + $nli->out->elementStart( + 'li', array( + 'class' => 'hentry notice question', + 'id' => 'notice-' . $id + ) + ); + Event::handle('EndOpenNoticeListItemElement', array($nli)); + return false; + break; + case QnA_Answer::OBJECT_TYPE: + $id = (empty($nli->repeat)) ? $nli->notice->id : $nli->repeat->id; + $nli->out->elementStart( + 'li', array( + 'class' => 'hentry notice answer', + 'id' => 'notice-' . $id + ) + ); + Event::handle('EndOpenNoticeListItemElement', array($nli)); + return false; + break; + default: + return true; + } + + return true; + } + /** * Custom HTML output for our notices * @@ -323,23 +367,34 @@ class QnAPlugin extends MicroAppPlugin $nli = new NoticeListItem($notice, $out); $nli->showNotice(); - $out->elementStart('div', array('class' => 'entry-content question-content')); + + + $out->elementStart('div', array('class' => 'entry-content question-desciption')); + $question = QnA_Question::getByNotice($notice); - if ($question) { - if ($user) { - $profile = $user->getProfile(); - $answer = $question->getAnswer($profile); - if ($answer) { - // User has already answer; show the results. - $form = new QnareviseanswerForm($answer, $out); - } else { - $form = new QnaanswerForm($question, $out); + if (!empty($question)) { + + $short = $question->description; + $out->raw($question->description); + + // Don't prompt user for an answer if the question is closed or + // the current user posed the question in the first place + if (empty($question->closed)) { + if (!empty($user) && ($user->id != $question->profile_id)) { + $profile = $user->getProfile(); + $answer = $question->getAnswer($profile); + if ($answer) { + // User has already answered; show the results. + $form = new QnareviseanswerForm($answer, $out); + } else { + $form = new QnaanswerForm($question, $out); + } + $form->show(); } - $form->show(); } } else { - $out->text(_m('Question data is missing')); + $out->text(_m('Question data is missing.')); } $out->elementEnd('div'); @@ -355,6 +410,19 @@ class QnAPlugin extends MicroAppPlugin $nli = new NoticeListItem($notice, $out); $nli->showNotice(); + $out->elementStart('div', array('class' => 'entry-content answer-content')); + + $answer = QnA_Answer::staticGet('uri', $notice->uri); + + if (!empty($answer)) { + $short = $answer->content; + $out->raw($answer->content); + } else { + $out->text(_m('Answer data is missing.')); + } + + $out->elementEnd('div'); + // @fixme $out->elementStart('div', array('class' => 'entry-content')); } diff --git a/plugins/QnA/actions/qnanewanswer.php b/plugins/QnA/actions/qnanewanswer.php index a91ae9ad39..b4db9cadda 100644 --- a/plugins/QnA/actions/qnanewanswer.php +++ b/plugins/QnA/actions/qnanewanswer.php @@ -137,9 +137,11 @@ class QnanewanswerAction extends Action */ function newAnswer() { + $profile = $this->user->getProfile(); + try { $notice = QnA_Answer::saveNew( - $this->user->getProfile(), + $profile, $this->question, $this->answerText ); @@ -150,6 +152,7 @@ class QnanewanswerAction extends Action } if ($this->boolean('ajax')) { common_debug("ajaxy part"); + $answer = $this->question->getAnswer($profile); header('Content-Type: text/xml;charset=utf-8'); $this->xw->startDocument('1.0', 'UTF-8'); $this->elementStart('html'); @@ -158,7 +161,7 @@ class QnanewanswerAction extends Action $this->element('title', null, _m('Answers')); $this->elementEnd('head'); $this->elementStart('body'); - $this->raw($this->answer->asHTML()); + $this->raw($answer->asHTML()); $this->elementEnd('body'); $this->elementEnd('html'); } else { From 960aebdbc4c7d8b61ced0e545cc1facc02f7f168 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Sun, 3 Apr 2011 17:25:44 -0700 Subject: [PATCH 3/4] QnA - add best class to best answers --- plugins/QnA/QnAPlugin.php | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/plugins/QnA/QnAPlugin.php b/plugins/QnA/QnAPlugin.php index e53d56928c..f3a07f13c5 100644 --- a/plugins/QnA/QnAPlugin.php +++ b/plugins/QnA/QnAPlugin.php @@ -300,7 +300,6 @@ class QnAPlugin extends MicroAppPlugin function onStartOpenNoticeListItemElement($nli) { - $type = $nli->notice->object_type; switch($type) @@ -318,9 +317,18 @@ class QnAPlugin extends MicroAppPlugin break; case QnA_Answer::OBJECT_TYPE: $id = (empty($nli->repeat)) ? $nli->notice->id : $nli->repeat->id; + + $classes = array('hentry', 'notice', 'answer'); + + $answer = QnA_Answer::staticGet('uri', $notice->uri); + + if (!empty($answer) && (boolean($answer->best))) { + $classes[] = 'best'; + } + $nli->out->elementStart( 'li', array( - 'class' => 'hentry notice answer', + 'class' => implode(' ', $classes), 'id' => 'notice-' . $id ) ); @@ -367,8 +375,6 @@ class QnAPlugin extends MicroAppPlugin $nli = new NoticeListItem($notice, $out); $nli->showNotice(); - - $out->elementStart('div', array('class' => 'entry-content question-desciption')); $question = QnA_Question::getByNotice($notice); From 528d999ae757d382c00a88baac493f3c51e11d3b Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Mon, 4 Apr 2011 01:27:38 -0700 Subject: [PATCH 4/4] QnA - Allow answer revisions and marking a question as "best" --- plugins/QnA/QnAPlugin.php | 61 ++++-- plugins/QnA/actions/qnanewanswer.php | 2 +- plugins/QnA/actions/qnareviseanswer.php | 94 +++++++-- plugins/QnA/classes/QnA_Answer.php | 11 +- ...qnaanswerform.php => qnanewanswerform.php} | 2 +- plugins/QnA/lib/qnashowanswerform.php | 181 ++++++++++++++++++ 6 files changed, 315 insertions(+), 36 deletions(-) rename plugins/QnA/lib/{qnaanswerform.php => qnanewanswerform.php} (98%) create mode 100644 plugins/QnA/lib/qnashowanswerform.php diff --git a/plugins/QnA/QnAPlugin.php b/plugins/QnA/QnAPlugin.php index f3a07f13c5..08a73031a5 100644 --- a/plugins/QnA/QnAPlugin.php +++ b/plugins/QnA/QnAPlugin.php @@ -88,9 +88,11 @@ class QnAPlugin extends MicroAppPlugin . strtolower(mb_substr($cls, 0, -6)) . '.php'; return false; case 'QnaquestionForm': - case 'QnaanswerForm': + case 'QnashowanswerForm': + case 'QnanewanswerForm': case 'QnareviseanswerForm': case 'QnavoteForm': + case 'AnswerNoticeListItem': include_once $dir . '/lib/' . strtolower($cls).'.php'; break; case 'QnA_Question': @@ -318,17 +320,18 @@ class QnAPlugin extends MicroAppPlugin case QnA_Answer::OBJECT_TYPE: $id = (empty($nli->repeat)) ? $nli->notice->id : $nli->repeat->id; - $classes = array('hentry', 'notice', 'answer'); + $cls = array('hentry', 'notice', 'answer'); $answer = QnA_Answer::staticGet('uri', $notice->uri); - if (!empty($answer) && (boolean($answer->best))) { - $classes[] = 'best'; + if (!empty($answer) && !empty($answer->best)) { + $cls[] = 'best'; } $nli->out->elementStart( - 'li', array( - 'class' => implode(' ', $classes), + 'li', + array( + 'class' => implode(' ', $cls), 'id' => 'notice-' . $id ) ); @@ -348,6 +351,7 @@ class QnAPlugin extends MicroAppPlugin * @param Notice $notice * @param HTMLOutputter $out */ + function showNotice($notice, $out) { switch ($notice->object_type) { @@ -381,8 +385,8 @@ class QnAPlugin extends MicroAppPlugin if (!empty($question)) { - $short = $question->description; - $out->raw($question->description); + $short = $this->shorten($question->description, $notice); + $out->raw($short); // Don't prompt user for an answer if the question is closed or // the current user posed the question in the first place @@ -390,14 +394,13 @@ class QnAPlugin extends MicroAppPlugin if (!empty($user) && ($user->id != $question->profile_id)) { $profile = $user->getProfile(); $answer = $question->getAnswer($profile); - if ($answer) { - // User has already answered; show the results. - $form = new QnareviseanswerForm($answer, $out); - } else { - $form = new QnaanswerForm($question, $out); + if (!$answer) { + $form = new QnanewanswerForm($question, $out); + $form->show(); } - $form->show(); } + } else { + $out->element('span', 'closed', _m('This question is closed.')); } } else { $out->text(_m('Question data is missing.')); @@ -411,18 +414,18 @@ class QnAPlugin extends MicroAppPlugin function showNoticeAnswer($notice, $out) { $user = common_current_user(); + + $answer = QnA_Answer::getByNotice($notice); + $question = $answer->getQuestion(); - // @hack we want regular rendering, then just add stuff after that $nli = new NoticeListItem($notice, $out); $nli->showNotice(); $out->elementStart('div', array('class' => 'entry-content answer-content')); - $answer = QnA_Answer::staticGet('uri', $notice->uri); - if (!empty($answer)) { - $short = $answer->content; - $out->raw($answer->content); + $form = new QnashowanswerForm($out, $answer); + $form->show(); } else { $out->text(_m('Answer data is missing.')); } @@ -433,6 +436,26 @@ class QnAPlugin extends MicroAppPlugin $out->elementStart('div', array('class' => 'entry-content')); } + static function shorten($content, $notice) + { + $short = null; + + if (Notice::contentTooLong($content)) { + common_debug("content too long"); + $max = Notice::maxContent(); + $short = mb_substr($content, 0, $max - 1); + $short .= sprintf( + '', + $notice->uri, + _m('more') + ); + } else { + $short = $content; + } + + return $short; + } + /** * Form for our app * diff --git a/plugins/QnA/actions/qnanewanswer.php b/plugins/QnA/actions/qnanewanswer.php index b4db9cadda..94bfc09a39 100644 --- a/plugins/QnA/actions/qnanewanswer.php +++ b/plugins/QnA/actions/qnanewanswer.php @@ -180,7 +180,7 @@ class QnanewanswerAction extends Action $this->element('p', 'error', $this->error); } - $form = new QnaanswerForm($this->question, $this); + $form = new QnanewanswerForm($this->question, $this); $form->show(); return; diff --git a/plugins/QnA/actions/qnareviseanswer.php b/plugins/QnA/actions/qnareviseanswer.php index 686cf8d46d..cea1258e0d 100644 --- a/plugins/QnA/actions/qnareviseanswer.php +++ b/plugins/QnA/actions/qnareviseanswer.php @@ -86,14 +86,8 @@ class QnareviseanswerAction extends Action ); } - if ($this->isPost()) { - $this->checkSessionToken(); - } - $id = substr($this->trimmed('id'), 7); - common_debug("XXXXXXXXXXXXXXXXXX id = " . $id); - $this->answer = QnA_Answer::staticGet('id', $id); $this->question = $this->answer->getQuestion(); @@ -122,12 +116,22 @@ class QnareviseanswerAction extends Action parent::handle($argarray); if ($this->isPost()) { - $this->reviseAnswer(); - } else { - $this->showPage(); + $this->checkSessionToken(); + if ($this->arg('revise')) { + $this->showContent(); + return; + } else if ($this->arg('best')) { + if ($this->user->id == $this->question->profile_id) { + $this->markBest(); + return; + } + } else { + $this->reviseAnswer(); + return; + } } - return; + $this->showPage(); } /** @@ -159,7 +163,52 @@ class QnareviseanswerAction extends Action $this->element('title', null, _m('Answer')); $this->elementEnd('head'); $this->elementStart('body'); - $this->raw($answer->asHTML()); + $form = new QnashowanswerForm($this, $answer); + $form->show(); + $this->elementEnd('body'); + $this->elementEnd('html'); + } else { + common_redirect($this->answer->bestUrl(), 303); + } + } + + /** + * Mark the answer as the "best" answer + * + * @return void + */ + function markBest() + { + $question = $this->question; + $answer = $this->answer; + + try { + // close the question to further answers + $orig = clone($question); + $question->closed = 1; + $result = $question->update($orig); + + // mark this answer an the best answer + $orig = clone($answer); + $answer->best = 1; + $result = $answer->update($orig); + } catch (ClientException $ce) { + $this->error = $ce->getMessage(); + $this->showPage(); + return; + } + if ($this->boolean('ajax')) { + common_debug("ajaxy part"); + header('Content-Type: text/xml;charset=utf-8'); + $this->xw->startDocument('1.0', 'UTF-8'); + $this->elementStart('html'); + $this->elementStart('head'); + // TRANS: Page title after sending an answer. + $this->element('title', null, _m('Answer')); + $this->elementEnd('head'); + $this->elementStart('body'); + $form = new QnashowanswerForm($this, $answer); + $form->show(); $this->elementEnd('body'); $this->elementEnd('html'); } else { @@ -178,12 +227,31 @@ class QnareviseanswerAction extends Action $this->element('p', 'error', $this->error); } - $form = new QnareviseanswerForm($this->answer, $this); - $form->show(); + if ($this->boolean('ajax')) { + $this->showAjaxReviseForm(); + } else { + $form = new QnareviseanswerForm($this->answer, $this); + $form->show(); + } return; } + function showAjaxReviseForm() + { + header('Content-Type: text/xml;charset=utf-8'); + $this->xw->startDocument('1.0', 'UTF-8'); + $this->elementStart('html'); + $this->elementStart('head'); + $this->element('title', null, _m('Answer')); + $this->elementEnd('head'); + $this->elementStart('body'); + $form = new QnareviseanswerForm($this->answer, $this); + $form->show(); + $this->elementEnd('body'); + $this->elementEnd('html'); + } + /** * Return true if read only. * diff --git a/plugins/QnA/classes/QnA_Answer.php b/plugins/QnA/classes/QnA_Answer.php index 79970dc1df..a2333be6dc 100644 --- a/plugins/QnA/classes/QnA_Answer.php +++ b/plugins/QnA/classes/QnA_Answer.php @@ -140,7 +140,7 @@ class QnA_Answer extends Managed_DataObject { $answer = self::staticGet('uri', $notice->uri); if (empty($answer)) { - throw new Exception("No answer with URI {$this->notice->uri}"); + throw new Exception("No answer with URI {$notice->uri}"); } return $answer; } @@ -205,7 +205,14 @@ class QnA_Answer extends Managed_DataObject { $notice = $question->getNotice(); - $fmt = '

'; + $fmt = ''; + + if (!empty($answer->best)) { + $fmt = '

'; + } else { + $fmt = '

'; + } + $fmt .= 'answer by %3$s'; $fmt .= '%4$s'; if (!empty($answer->revisions)) { diff --git a/plugins/QnA/lib/qnaanswerform.php b/plugins/QnA/lib/qnanewanswerform.php similarity index 98% rename from plugins/QnA/lib/qnaanswerform.php rename to plugins/QnA/lib/qnanewanswerform.php index 8d78213d7c..967b27e70c 100644 --- a/plugins/QnA/lib/qnaanswerform.php +++ b/plugins/QnA/lib/qnanewanswerform.php @@ -44,7 +44,7 @@ if (!defined('STATUSNET')) { * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @link http://status.net/ */ -class QnaanswerForm extends Form +class QnanewanswerForm extends Form { protected $question; diff --git a/plugins/QnA/lib/qnashowanswerform.php b/plugins/QnA/lib/qnashowanswerform.php new file mode 100644 index 0000000000..54f3f8fcac --- /dev/null +++ b/plugins/QnA/lib/qnashowanswerform.php @@ -0,0 +1,181 @@ +. + * + * @category Form + * @package StatusNet + * @author Zach Copley + * @copyright 2011 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + exit(1); +} + +require_once INSTALLDIR . '/lib/form.php'; + +/** + * Form for showing / revising an answer + * + * @category Form + * @package StatusNet + * @author Zach Copley + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + * + */ +class QnashowanswerForm extends Form +{ + /** + * The answer to revise + */ + var $answer = null; + + /** + * The question this is an answer to + */ + var $question = null; + + /** + * Constructor + * + * @param HTMLOutputter $out output channel + * @param QnA_Answer $answer answer to revise + */ + function __construct($out = null, $answer = null) + { + parent::__construct($out); + + $this->answer = $answer; + $this->question = $answer->getQuestion(); + } + + /** + * ID of the form + * + * @return int ID of the form + */ + function id() + { + return 'revise-' . $this->answer->id; + } + + /** + * Action of the form + * + * @return string URL of the action + */ + function action() + { + return common_local_url('qnareviseanswer'); + } + + /** + * Include a session token for CSRF protection + * + * @return void + */ + function sessionToken() + { + $this->out->hidden( + 'token', + common_session_token() + ); + } + + /** + * Legend of the Form + * + * @return void + */ + function formLegend() + { + // TRANS: Form legend for revising the answer. + $this->out->element('legend', null, _('Revise your answer')); + } + + /** + * Data elements + * + * @return void + */ + function formData() + { + $this->out->hidden( + 'id', + 'revise-' . $this->answer->id + ); + $this->out->raw($this->answer->asHTML()); + } + + /** + * Action elements + * + * @return void + */ + function formActions() + { + $user = common_current_user(); + if (empty($user)) { + return; + } + + if (empty($this->question->closed)) { + if ($user->id == $this->question->profile_id) { + common_debug("I am the question asker!"); + if (empty($this->answer->best)) { + $this->out->submit( + 'best', + // TRANS: Button text for marking an answer as "best" + _m('BUTTON', 'Best'), + 'submit', + null, + // TRANS: Title for button text marking an answer as "best" + _('Mark as best answer') + ); + + } + } + if ($user->id == $this->answer->profile_id) { + $this->out->submit( + 'revise', + // TRANS: Button text for revising an answer + _m('BUTTON', 'Revise'), + 'submit', + null, + // TRANS: Title for button text for revising an answer + _('Revise your answer') + ); + } + } + } + + /** + * Class of the form. + * + * @return string the form's class + */ + function formClass() + { + return 'form_revise ajax'; + } +}