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 .= '%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