public function processRequest() { $request = $this->getRequest(); if (!$request->isFormPost()) { return new Aphront400Response(); } $user = $request->getUser(); $question_id = $request->getInt('question_id'); $question = PonderQuestionQuery::loadSingle($user, $question_id); if (!$question) { return new Aphront404Response(); } $answer = $request->getStr('answer'); // Only want answers with some non whitespace content if (!strlen(trim($answer))) { $dialog = new AphrontDialogView(); $dialog->setUser($request->getUser()); $dialog->setTitle('Empty answer'); $dialog->appendChild('<p>Your answer must not be empty.</p>'); $dialog->addCancelButton('/Q' . $question_id); return id(new AphrontDialogResponse())->setDialog($dialog); } $content_source = PhabricatorContentSource::newForSource(PhabricatorContentSource::SOURCE_WEB, array('ip' => $request->getRemoteAddr())); $res = new PonderAnswer(); $res->setContent($answer)->setAuthorPHID($user->getPHID())->setVoteCount(0)->setQuestionID($question_id)->setContentSource($content_source); id(new PonderAnswerEditor())->setUser($user)->setQuestion($question)->setAnswer($res)->saveAnswer(); return id(new AphrontRedirectResponse())->setURI(id(new PhutilURI('/Q' . $question->getID()))); }
public function loadPage() { $answer = new PonderAnswer(); $conn_r = $answer->establishConnection('r'); $data = queryfx_all($conn_r, 'SELECT a.* FROM %T a %Q %Q %Q', $answer->getTableName(), $this->buildWhereClause($conn_r), $this->buildOrderClause($conn_r), $this->buildLimitClause($conn_r)); return $answer->loadAllFromArray($data); }
public function handleRequest(AphrontRequest $request) { $viewer = $request->getViewer(); if (!$request->isFormPost()) { return new Aphront400Response(); } $question_id = $request->getInt('question_id'); $question = id(new PonderQuestionQuery())->setViewer($viewer)->withIDs(array($question_id))->needAnswers(true)->executeOne(); if (!$question) { return new Aphront404Response(); } $content = $request->getStr('answer'); if (!strlen(trim($content))) { $dialog = id(new AphrontDialogView())->setUser($viewer)->setTitle(pht('Empty Answer'))->appendChild(phutil_tag('p', array(), pht('Your answer must not be empty.')))->addCancelButton('/Q' . $question_id); return id(new AphrontDialogResponse())->setDialog($dialog); } $answer = PonderAnswer::initializeNewAnswer($viewer, $question); // Question Editor $xactions = array(); $xactions[] = id(new PonderQuestionTransaction())->setTransactionType(PonderQuestionTransaction::TYPE_ANSWERS)->setNewValue(array('+' => array(array('answer' => $answer)))); $editor = id(new PonderQuestionEditor())->setActor($viewer)->setContentSourceFromRequest($request); $editor->applyTransactions($question, $xactions); // Answer Editor $template = id(new PonderAnswerTransaction()); $xactions = array(); $xactions[] = id(clone $template)->setTransactionType(PonderAnswerTransaction::TYPE_QUESTION_ID)->setNewValue($question->getID()); $xactions[] = id(clone $template)->setTransactionType(PonderAnswerTransaction::TYPE_CONTENT)->setNewValue($content); $editor = id(new PonderAnswerEditor())->setActor($viewer)->setContentSourceFromRequest($request)->setContinueOnNoEffect(true); $editor->applyTransactions($answer, $xactions); return id(new AphrontRedirectResponse())->setURI(id(new PhutilURI('/Q' . $question->getID()))); }
public function processRequest() { $request = $this->getRequest(); $user = $request->getUser(); $question_id = $request->getInt('question_id'); $question = PonderQuestionQuery::loadSingle($user, $question_id); if (!$question) { return new Aphront404Response(); } $author_phid = $user->getPHID(); $object_phids = array($author_phid); $handles = id(new PhabricatorObjectHandleData($object_phids))->loadHandles(); $answer = new PonderAnswer(); $answer->setContent($request->getStr('content')); $answer->setAuthorPHID($author_phid); $view = new PonderCommentBodyView(); $view->setQuestion($question)->setTarget($answer)->setPreview(true)->setUser($user)->setHandles($handles)->setAction(PonderConstants::ANSWERED_LITERAL); return id(new AphrontAjaxResponse())->setContent($view->render()); }
public function processRequest() { $request = $this->getRequest(); if (!$request->isFormPost()) { return new Aphront400Response(); } $user = $request->getUser(); $question_id = $request->getInt('question_id'); $question = PonderQuestionQuery::loadSingle($user, $question_id); if (!$question) { return new Aphront404Response(); } $answer = $request->getStr('answer'); $content_source = PhabricatorContentSource::newForSource(PhabricatorContentSource::SOURCE_WEB, array('ip' => $request->getRemoteAddr())); $res = new PonderAnswer(); $res->setContent($answer)->setAuthorPHID($user->getPHID())->setVoteCount(0)->setQuestionID($question_id)->setContentSource($content_source); id(new PonderAnswerEditor())->setQuestion($question)->setAnswer($res)->saveAnswer(); PhabricatorSearchPonderIndexer::indexQuestion($question); return id(new AphrontRedirectResponse())->setURI(id(new PhutilURI('/Q' . $question->getID()))->setFragment('A' . $res->getID())); }
public function execute() { $answer = new PonderAnswer(); $conn_r = $answer->establishConnection('r'); $select = qsprintf($conn_r, 'SELECT r.* FROM %T r', $answer->getTableName()); $where = $this->buildWhereClause($conn_r); $order_by = $this->buildOrderByClause($conn_r); $limit = $this->buildLimitClause($conn_r); return $answer->loadAllFromArray(queryfx_all($conn_r, '%Q %Q %Q %Q', $select, $where, $order_by, $limit)); }
private function buildAnswerActions(PonderAnswer $answer) { $viewer = $this->getViewer(); $request = $this->getRequest(); $id = $answer->getID(); $can_edit = PhabricatorPolicyFilter::hasCapability($viewer, $answer, PhabricatorPolicyCapability::CAN_EDIT); $view = id(new PhabricatorActionListView())->setUser($viewer)->setObject($answer)->setObjectURI($request->getRequestURI()); $view->addAction(id(new PhabricatorActionView())->setIcon('fa-pencil')->setName(pht('Edit Answer'))->setHref($this->getApplicationURI("/answer/edit/{$id}/"))->setDisabled(!$can_edit)->setWorkflow(!$can_edit)); $view->addAction(id(new PhabricatorActionView())->setIcon('fa-list')->setName(pht('View History'))->setHref($this->getApplicationURI("/answer/history/{$id}/"))); return $view; }
private function buildJoinsClause(AphrontDatabaseConnection $conn_r) { $joins = array(); if ($this->answererPHIDs) { $answer_table = new PonderAnswer(); $joins[] = qsprintf($conn_r, 'JOIN %T a ON a.questionID = q.id AND a.authorPHID IN (%Ls)', $answer_table->getTableName(), $this->answererPHIDs); } return implode(' ', $joins); }
<?php $map = array(); echo pht('Merging duplicate answers by authors...') . "\n"; $atable = new PonderAnswer(); $conn_w = $atable->establishConnection('w'); $conn_w->openTransaction(); $answers = new LiskMigrationIterator(new PonderAnswer()); foreach ($answers as $answer) { $aid = $answer->getID(); $qid = $answer->getQuestionID(); $author_phid = $answer->getAuthorPHID(); echo pht('Processing answer ID #%d...', $aid) . "\n"; if (empty($map[$qid][$author_phid])) { echo pht('Answer is unique.') . "\n"; $map[$qid][$author_phid] = $answer; continue; } else { echo pht('Merging answer.') . "\n"; $target = $map[$qid][$author_phid]; queryfx($conn_w, 'UPDATE %T SET content = %s WHERE id = %d', $target->getTableName(), $target->getContent() . "\n\n" . "---" . "\n\n" . "> (This content was automatically merged from another answer by the " . "same author.)" . "\n\n" . $answer->getContent(), $target->getID()); queryfx($conn_w, 'DELETE FROM %T WHERE id = %d', $target->getTableName(), $answer->getID()); queryfx($conn_w, 'UPDATE %T SET targetPHID = %s WHERE targetPHID = %s', 'ponder_comment', $target->getPHID(), $answer->getPHID()); } } $conn_w->saveTransaction(); echo pht('Done.') . "\n";
<?php $table = new PonderAnswer(); $conn_w = $table->establishConnection('w'); $iterator = new LiskMigrationIterator($table); foreach ($iterator as $answer) { $id = $answer->getID(); echo pht('Adding mail key for Answer %d...', $id); echo "\n"; queryfx($conn_w, 'UPDATE %T SET mailKey = %s WHERE id = %d', $table->getTableName(), Filesystem::readRandomCharacters(20), $id); }
protected function buildJoinClauseParts(AphrontDatabaseConnection $conn) { $joins = parent::buildJoinClauseParts($conn); if ($this->answererPHIDs) { $answer_table = new PonderAnswer(); $joins[] = qsprintf($conn, 'JOIN %T a ON a.questionID = q.id AND a.authorPHID IN (%Ls)', $answer_table->getTableName(), $this->answererPHIDs); } return $joins; }