Changeset View
Changeset View
Standalone View
Standalone View
src/applications/ponder/controller/PonderQuestionEditController.php
<?php | <?php | ||||
final class PonderQuestionEditController extends PonderController { | final class PonderQuestionEditController extends PonderController { | ||||
public function handleRequest(AphrontRequest $request) { | public function handleRequest(AphrontRequest $request) { | ||||
$user = $request->getViewer(); | $viewer = $request->getViewer(); | ||||
$id = $request->getURIData('id'); | $id = $request->getURIData('id'); | ||||
if ($id) { | if ($id) { | ||||
$question = id(new PonderQuestionQuery()) | $question = id(new PonderQuestionQuery()) | ||||
->setViewer($user) | ->setViewer($viewer) | ||||
->withIDs(array($id)) | ->withIDs(array($id)) | ||||
->requireCapabilities( | ->requireCapabilities( | ||||
array( | array( | ||||
PhabricatorPolicyCapability::CAN_VIEW, | PhabricatorPolicyCapability::CAN_VIEW, | ||||
PhabricatorPolicyCapability::CAN_EDIT, | PhabricatorPolicyCapability::CAN_EDIT, | ||||
)) | )) | ||||
->executeOne(); | ->executeOne(); | ||||
if (!$question) { | if (!$question) { | ||||
return new Aphront404Response(); | return new Aphront404Response(); | ||||
} | } | ||||
$v_projects = PhabricatorEdgeQuery::loadDestinationPHIDs( | $v_projects = PhabricatorEdgeQuery::loadDestinationPHIDs( | ||||
$question->getPHID(), | $question->getPHID(), | ||||
PhabricatorProjectObjectHasProjectEdgeType::EDGECONST); | PhabricatorProjectObjectHasProjectEdgeType::EDGECONST); | ||||
$v_projects = array_reverse($v_projects); | $v_projects = array_reverse($v_projects); | ||||
} else { | } else { | ||||
$question = id(new PonderQuestion()) | $question = PonderQuestion::initializeNewQuestion($viewer); | ||||
->setStatus(PonderQuestionStatus::STATUS_OPEN) | |||||
->setAuthorPHID($user->getPHID()) | |||||
->setVoteCount(0) | |||||
->setAnswerCount(0) | |||||
->setHeat(0.0); | |||||
$v_projects = array(); | $v_projects = array(); | ||||
} | } | ||||
$v_title = $question->getTitle(); | $v_title = $question->getTitle(); | ||||
$v_content = $question->getContent(); | $v_content = $question->getContent(); | ||||
$v_view = $question->getViewPolicy(); | |||||
$v_edit = $question->getEditPolicy(); | |||||
$errors = array(); | $errors = array(); | ||||
$e_title = true; | $e_title = true; | ||||
if ($request->isFormPost()) { | if ($request->isFormPost()) { | ||||
$v_title = $request->getStr('title'); | $v_title = $request->getStr('title'); | ||||
$v_content = $request->getStr('content'); | $v_content = $request->getStr('content'); | ||||
$v_projects = $request->getArr('projects'); | $v_projects = $request->getArr('projects'); | ||||
$v_view = $request->getStr('viewPolicy'); | |||||
$v_edit = $request->getStr('editPolicy'); | |||||
$len = phutil_utf8_strlen($v_title); | $len = phutil_utf8_strlen($v_title); | ||||
if ($len < 1) { | if ($len < 1) { | ||||
$errors[] = pht('Title must not be empty.'); | $errors[] = pht('Title must not be empty.'); | ||||
$e_title = pht('Required'); | $e_title = pht('Required'); | ||||
} else if ($len > 255) { | } else if ($len > 255) { | ||||
$errors[] = pht('Title is too long.'); | $errors[] = pht('Title is too long.'); | ||||
$e_title = pht('Too Long'); | $e_title = pht('Too Long'); | ||||
} | } | ||||
if (!$errors) { | if (!$errors) { | ||||
$template = id(new PonderQuestionTransaction()); | $template = id(new PonderQuestionTransaction()); | ||||
$xactions = array(); | $xactions = array(); | ||||
$xactions[] = id(clone $template) | $xactions[] = id(clone $template) | ||||
->setTransactionType(PonderQuestionTransaction::TYPE_TITLE) | ->setTransactionType(PonderQuestionTransaction::TYPE_TITLE) | ||||
->setNewValue($v_title); | ->setNewValue($v_title); | ||||
$xactions[] = id(clone $template) | $xactions[] = id(clone $template) | ||||
->setTransactionType(PonderQuestionTransaction::TYPE_CONTENT) | ->setTransactionType(PonderQuestionTransaction::TYPE_CONTENT) | ||||
->setNewValue($v_content); | ->setNewValue($v_content); | ||||
$xactions[] = id(clone $template) | |||||
->setTransactionType(PhabricatorTransactions::TYPE_VIEW_POLICY) | |||||
->setNewValue($v_view); | |||||
$xactions[] = id(clone $template) | |||||
->setTransactionType(PhabricatorTransactions::TYPE_EDIT_POLICY) | |||||
->setNewValue($v_edit); | |||||
$proj_edge_type = PhabricatorProjectObjectHasProjectEdgeType::EDGECONST; | $proj_edge_type = PhabricatorProjectObjectHasProjectEdgeType::EDGECONST; | ||||
$xactions[] = id(new PonderQuestionTransaction()) | $xactions[] = id(new PonderQuestionTransaction()) | ||||
->setTransactionType(PhabricatorTransactions::TYPE_EDGE) | ->setTransactionType(PhabricatorTransactions::TYPE_EDGE) | ||||
->setMetadataValue('edge:type', $proj_edge_type) | ->setMetadataValue('edge:type', $proj_edge_type) | ||||
->setNewValue(array('=' => array_fuse($v_projects))); | ->setNewValue(array('=' => array_fuse($v_projects))); | ||||
$editor = id(new PonderQuestionEditor()) | $editor = id(new PonderQuestionEditor()) | ||||
->setActor($user) | ->setActor($viewer) | ||||
->setContentSourceFromRequest($request) | ->setContentSourceFromRequest($request) | ||||
->setContinueOnNoEffect(true); | ->setContinueOnNoEffect(true); | ||||
$editor->applyTransactions($question, $xactions); | $editor->applyTransactions($question, $xactions); | ||||
return id(new AphrontRedirectResponse()) | return id(new AphrontRedirectResponse()) | ||||
->setURI('/Q'.$question->getID()); | ->setURI('/Q'.$question->getID()); | ||||
} | } | ||||
} | } | ||||
$policies = id(new PhabricatorPolicyQuery()) | |||||
->setViewer($viewer) | |||||
->setObject($question) | |||||
->execute(); | |||||
$form = id(new AphrontFormView()) | $form = id(new AphrontFormView()) | ||||
->setUser($user) | ->setUser($viewer) | ||||
->appendChild( | ->appendChild( | ||||
id(new AphrontFormTextControl()) | id(new AphrontFormTextControl()) | ||||
->setLabel(pht('Question')) | ->setLabel(pht('Question')) | ||||
->setName('title') | ->setName('title') | ||||
->setValue($v_title) | ->setValue($v_title) | ||||
->setError($e_title)) | ->setError($e_title)) | ||||
->appendChild( | ->appendChild( | ||||
id(new PhabricatorRemarkupControl()) | id(new PhabricatorRemarkupControl()) | ||||
->setUser($user) | ->setUser($viewer) | ||||
->setName('content') | ->setName('content') | ||||
->setID('content') | ->setID('content') | ||||
->setValue($v_content) | ->setValue($v_content) | ||||
->setLabel(pht('Description')) | ->setLabel(pht('Description')) | ||||
->setUser($user)); | ->setUser($viewer)) | ||||
->appendControl( | |||||
id(new AphrontFormPolicyControl()) | |||||
->setName('viewPolicy') | |||||
->setPolicyObject($question) | |||||
->setPolicies($policies) | |||||
->setValue($v_view) | |||||
->setCapability(PhabricatorPolicyCapability::CAN_VIEW)) | |||||
->appendControl( | |||||
id(new AphrontFormPolicyControl()) | |||||
->setName('editPolicy') | |||||
->setPolicyObject($question) | |||||
->setPolicies($policies) | |||||
->setValue($v_edit) | |||||
->setCapability(PhabricatorPolicyCapability::CAN_EDIT)); | |||||
$form->appendControl( | $form->appendControl( | ||||
id(new AphrontFormTokenizerControl()) | id(new AphrontFormTokenizerControl()) | ||||
->setLabel(pht('Projects')) | ->setLabel(pht('Projects')) | ||||
->setName('projects') | ->setName('projects') | ||||
->setValue($v_projects) | ->setValue($v_projects) | ||||
->setDatasource(new PhabricatorProjectDatasource())); | ->setDatasource(new PhabricatorProjectDatasource())); | ||||
Show All 37 Lines |