]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - plugins/QnA/actions/qnanewanswer.php
Merge remote-tracking branch 'upstream/master' into social-master
[quix0rs-gnu-social.git] / plugins / QnA / actions / qnanewanswer.php
index 09d111040d15634c4522bf4f360e369b3b3fe884..5543cba06c623dbff942744d3401abcff7b8e6b2 100644 (file)
@@ -20,7 +20,7 @@
  * You should have received a copy of the GNU Affero General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  *
- * @category  QuestonAndAnswer
+ * @category  QnA
  * @package   StatusNet
  * @author    Zach Copley <zach@status.net>
  * @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');
+    }
 }