From 8e086d5a90b2775a2aa0b44fad160086cb206922 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Fri, 1 Apr 2011 23:59:35 -0700 Subject: [PATCH] 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); } /** -- 2.39.5