X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=plugins%2FQnA%2Factions%2Fqnanewanswer.php;h=e565b3e93ade336e0e559ad875f61cdcd820478e;hb=9758134d1afb44be2376efb8a560d3ce02d89fd3;hp=781ded36e6b96427c972b1b35e89114519f268ab;hpb=7669bed9f3e975548c9269d245f120ea180c6f78;p=quix0rs-gnu-social.git diff --git a/plugins/QnA/actions/qnanewanswer.php b/plugins/QnA/actions/qnanewanswer.php index 781ded36e6..e565b3e93a 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. @@ -45,12 +45,12 @@ if (!defined('STATUSNET')) { */ class QnanewanswerAction extends Action { - protected $user = null; - protected $error = null; - protected $complete = null; + protected $user = null; + protected $error = null; + protected $complete = null; - protected $question = null; - protected $content = null; + public $question = null; + protected $content = null; /** * Returns the title of the action @@ -76,12 +76,12 @@ class QnanewanswerAction extends Action if ($this->boolean('ajax')) { StatusNet::setApi(true); } - + common_debug("in qnanewanswer"); $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( + // TRANS: Client exception thrown trying to answer a question while not logged in. _m("You must be logged in to answer to a question."), 403 ); @@ -91,19 +91,20 @@ class QnanewanswerAction extends Action $this->checkSessionToken(); } - $id = $this->trimmed('id'); + $id = substr($this->trimmed('id'), 9); + $this->question = QnA_Question::staticGet('id', $id); - + if (empty($this->question)) { - // TRANS: Client exception thrown trying to respond to a non-existing question. throw new ClientException( - _m('Invalid or missing question.'), + // TRANS: Client exception thrown trying to respond to a non-existing question. + _m('Invalid or missing question.'), 404 ); } $this->answerText = $this->trimmed('answer'); - + return true; } @@ -121,7 +122,7 @@ class QnanewanswerAction extends Action if ($this->isPost()) { $this->newAnswer(); } else { - $this->showPage(); + $this->showForm(); } return; @@ -134,32 +135,40 @@ class QnanewanswerAction extends Action */ function newAnswer() { + $profile = $this->user->getProfile(); + try { $notice = QnA_Answer::saveNew( - $this->user->getProfile(), + $profile, $this->question, $this->answerText ); } catch (ClientException $ce) { $this->error = $ce->getMessage(); - $this->showPage(); + $this->showForm($this->error); return; } - 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'); $this->elementStart('head'); // TRANS: Page title after sending an answer. $this->element('title', null, _m('Answers')); $this->elementEnd('head'); + $this->elementStart('body'); - $form = new QnaanswerForm($this->question, $this); - $form->show(); + + $nli = new NoticeAnswerListItem($notice, $this, $this->question, $answer); + $nli->show(); + $this->elementEnd('body'); $this->elementEnd('html'); } else { + common_debug("not ajax"); common_redirect($this->question->bestUrl(), 303); } } @@ -175,8 +184,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; @@ -200,4 +208,144 @@ class QnanewanswerAction extends Action return false; } } + + /** + * Show an Ajax-y error message + * + * Goes back to the browser, where it's shown in a popup. + * + * @param string $msg Message to show + * + * @return void + */ + function ajaxErrorMsg($msg) + { + $this->startHTML('text/xml;charset=utf-8', true); + $this->elementStart('head'); + // TRANS: Page title after an AJAX error occurs on the post answer page. + $this->element('title', null, _m('Ajax Error')); + $this->elementEnd('head'); + $this->elementStart('body'); + $this->element('p', array('id' => 'error'), $msg); + $this->elementEnd('body'); + $this->elementEnd('html'); + } + + /** + * Show an Ajax-y answer form + * + * Goes back to the browser, where it's shown in a popup. + * + * @param string $msg Message to show + * + * @return void + */ + function ajaxShowForm() + { + common_debug('ajaxShowForm()'); + $this->startHTML('text/xml;charset=utf-8', true); + $this->elementStart('head'); + // TRANS: Title for form to send answer to a question. + $this->element('title', null, _m('TITLE','Your answer')); + $this->elementEnd('head'); + $this->elementStart('body'); + + $form = new QnanewanswerForm($this, $this->question); + $form->show(); + + $this->elementEnd('body'); + $this->elementEnd('html'); + } + + /** + * @param string $msg An error message, if any + * + * @return void + */ + function showForm($msg = null) + { + common_debug("show form - msg = $msg"); + if ($this->boolean('ajax')) { + if ($msg) { + $this->ajaxErrorMsg($msg); + } else { + $this->ajaxShowForm(); + } + return; + } + + $this->msg = $msg; + $this->showPage(); + } +} + +class NoticeAnswerListItem extends NoticeListItem +{ + protected $question; + protected $answer; + + /** + * constructor + * + * Also initializes the profile attribute. + * + * @param Notice $notice The notice we'll display + */ + function __construct($notice, $out=null, $question, $answer) + { + parent::__construct($notice, $out); + $this->question = $question; + $this->answer = $answer; + + } + + function show() + { + if (empty($this->notice)) { + common_log(LOG_WARNING, "Trying to show missing notice; skipping."); + return; + } else if (empty($this->profile)) { + common_log(LOG_WARNING, "Trying to show missing profile (" . $this->notice->profile_id . "); skipping."); + return; + } + + $this->showStart(); + $this->showNotice(); + $this->showNoticeInfo(); + $notice = $this->question->getNotice(); + $this->out->hidden('inreplyto', $notice->id); + $this->showEnd(); + } + + /** + * show the content of the notice + * + * Shows the content of the notice. This is pre-rendered for efficiency + * at save time. Some very old notices might not be pre-rendered, so + * they're rendered on the spot. + * + * @return void + */ + function showContent() + { + $this->out->elementStart('p', array('class' => 'entry-content answer-content')); + if ($this->notice->rendered) { + $this->out->raw($this->notice->rendered); + } else { + // XXX: may be some uncooked notices in the DB, + // we cook them right now. This should probably disappear in future + // versions (>> 0.4.x) + $this->out->raw(common_render_content($this->notice->content, $this->notice)); + } + + if (!empty($this->answer)) { + $form = new QnashowanswerForm($this->out, $this->answer); + $form->show(); + } else { + // TRANS: Error message displayed when an answer has no content. + $out->text(_m('Answer data is missing.')); + } + + $this->out->elementEnd('p'); + } }