X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=plugins%2FQnA%2Factions%2Fqnanewanswer.php;h=5543cba06c623dbff942744d3401abcff7b8e6b2;hb=d6b28c64830f632bb2f4b6f3c9369b9e56ad217a;hp=09d111040d15634c4522bf4f360e369b3b3fe884;hpb=1e73ba00bdd37f46415eb45b1b904dc894fb801c;p=quix0rs-gnu-social.git diff --git a/plugins/QnA/actions/qnanewanswer.php b/plugins/QnA/actions/qnanewanswer.php index 09d111040d..5543cba06c 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. @@ -49,7 +49,7 @@ class QnanewanswerAction extends Action protected $error = null; protected $complete = null; - protected $question = null; + public $question = null; protected $content = null; /** @@ -74,14 +74,14 @@ class QnanewanswerAction extends Action { parent::prepare($argarray); if ($this->boolean('ajax')) { - StatusNet::setApi(true); + GNUsocial::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 ); @@ -93,13 +93,11 @@ class QnanewanswerAction extends Action $id = substr($this->trimmed('id'), 9); - common_debug("XXXXXXXXXXXXXXXXXX id = " . $id); - - $this->question = QnA_Question::staticGet('id', $id); + $this->question = QnA_Question::getKV('id', $id); if (empty($this->question)) { - // TRANS: Client exception thrown trying to respond to a non-existing question. throw new ClientException( + // TRANS: Client exception thrown trying to respond to a non-existing question. _m('Invalid or missing question.'), 404 ); @@ -124,7 +122,7 @@ class QnanewanswerAction extends Action if ($this->isPost()) { $this->newAnswer(); } else { - $this->showPage(); + $this->showForm(); } return; @@ -137,32 +135,39 @@ 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"); - header('Content-Type: text/xml;charset=utf-8'); - $this->xw->startDocument('1.0', 'UTF-8'); - $this->elementStart('html'); + $answer = $this->question->getAnswer($profile); + + $this->startHTML('text/xml;charset=utf-8'); $this->elementStart('head'); // TRANS: Page title after sending an answer. $this->element('title', null, _m('Answers')); $this->elementEnd('head'); + $this->elementStart('body'); - $this->raw() + + $nli = new NoticeAnswerListItem($notice, $this, $this->question, $answer); + $nli->show(); + $this->elementEnd('body'); - $this->elementEnd('html'); + $this->endHTML(); } else { - common_redirect($this->question->bestUrl(), 303); + common_debug("not ajax"); + common_redirect($this->question->getUrl(), 303); } } @@ -177,7 +182,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; @@ -192,7 +197,7 @@ class QnanewanswerAction extends Action * * @return boolean is read only action? */ - function isReadOnly($args) + function isReadOnly(array $args=array()) { if ($_SERVER['REQUEST_METHOD'] == 'GET' || $_SERVER['REQUEST_METHOD'] == 'HEAD') { @@ -201,4 +206,137 @@ 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->endHTML(); + } + + /** + * 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->endHTML(); + } + + /** + * @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' => 'e-content answer-content')); + $this->out->raw($this->notice->getRendered()); + + 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'); + } }