public function handleRequest(AphrontRequest $request) { $viewer = $request->getViewer(); $id = $request->getURIData('id'); if ($id) { $initiative = id(new FundInitiativeQuery())->setViewer($viewer)->withIDs(array($id))->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT))->executeOne(); if (!$initiative) { return new Aphront404Response(); } $is_new = false; } else { $initiative = FundInitiative::initializeNewInitiative($viewer); $is_new = true; } if ($is_new) { $title = pht('Create Initiative'); $button_text = pht('Create Initiative'); $cancel_uri = $this->getApplicationURI(); } else { $title = pht('Edit %s %s', $initiative->getMonogram(), $initiative->getName()); $button_text = pht('Save Changes'); $cancel_uri = '/' . $initiative->getMonogram(); } $e_name = true; $v_name = $initiative->getName(); $e_merchant = null; $v_merchant = $initiative->getMerchantPHID(); $v_desc = $initiative->getDescription(); $v_risk = $initiative->getRisks(); if ($is_new) { $v_projects = array(); } else { $v_projects = PhabricatorEdgeQuery::loadDestinationPHIDs($initiative->getPHID(), PhabricatorProjectObjectHasProjectEdgeType::EDGECONST); $v_projects = array_reverse($v_projects); } $validation_exception = null; if ($request->isFormPost()) { $v_name = $request->getStr('name'); $v_desc = $request->getStr('description'); $v_risk = $request->getStr('risks'); $v_view = $request->getStr('viewPolicy'); $v_edit = $request->getStr('editPolicy'); $v_merchant = $request->getStr('merchantPHID'); $v_projects = $request->getArr('projects'); $type_name = FundInitiativeTransaction::TYPE_NAME; $type_desc = FundInitiativeTransaction::TYPE_DESCRIPTION; $type_risk = FundInitiativeTransaction::TYPE_RISKS; $type_merchant = FundInitiativeTransaction::TYPE_MERCHANT; $type_view = PhabricatorTransactions::TYPE_VIEW_POLICY; $type_edit = PhabricatorTransactions::TYPE_EDIT_POLICY; $xactions = array(); $xactions[] = id(new FundInitiativeTransaction())->setTransactionType($type_name)->setNewValue($v_name); $xactions[] = id(new FundInitiativeTransaction())->setTransactionType($type_desc)->setNewValue($v_desc); $xactions[] = id(new FundInitiativeTransaction())->setTransactionType($type_risk)->setNewValue($v_risk); $xactions[] = id(new FundInitiativeTransaction())->setTransactionType($type_merchant)->setNewValue($v_merchant); $xactions[] = id(new FundInitiativeTransaction())->setTransactionType($type_view)->setNewValue($v_view); $xactions[] = id(new FundInitiativeTransaction())->setTransactionType($type_edit)->setNewValue($v_edit); $proj_edge_type = PhabricatorProjectObjectHasProjectEdgeType::EDGECONST; $xactions[] = id(new FundInitiativeTransaction())->setTransactionType(PhabricatorTransactions::TYPE_EDGE)->setMetadataValue('edge:type', $proj_edge_type)->setNewValue(array('=' => array_fuse($v_projects))); $editor = id(new FundInitiativeEditor())->setActor($viewer)->setContentSourceFromRequest($request)->setContinueOnNoEffect(true); try { $editor->applyTransactions($initiative, $xactions); return id(new AphrontRedirectResponse())->setURI('/' . $initiative->getMonogram()); } catch (PhabricatorApplicationTransactionValidationException $ex) { $validation_exception = $ex; $e_name = $ex->getShortMessage($type_name); $e_merchant = $ex->getShortMessage($type_merchant); $initiative->setViewPolicy($v_view); $initiative->setEditPolicy($v_edit); } } $policies = id(new PhabricatorPolicyQuery())->setViewer($viewer)->setObject($initiative)->execute(); $merchants = id(new PhortuneMerchantQuery())->setViewer($viewer)->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT))->execute(); $merchant_options = array(); foreach ($merchants as $merchant) { $merchant_options[$merchant->getPHID()] = pht('Merchant %d %s', $merchant->getID(), $merchant->getName()); } if ($v_merchant && empty($merchant_options[$v_merchant])) { $merchant_options = array($v_merchant => pht('(Restricted Merchant)')) + $merchant_options; } if (!$merchant_options) { return $this->newDialog()->setTitle(pht('No Valid Phortune Merchant Accounts'))->appendParagraph(pht('You do not control any merchant accounts which can receive ' . 'payments from this initiative. When you create an initiative, ' . 'you need to specify a merchant account where funds will be paid ' . 'to.'))->appendParagraph(pht('Create a merchant account in the Phortune application before ' . 'creating an initiative in Fund.'))->addCancelButton($this->getApplicationURI()); } $form = id(new AphrontFormView())->setUser($viewer)->appendChild(id(new AphrontFormTextControl())->setName('name')->setLabel(pht('Name'))->setValue($v_name)->setError($e_name))->appendChild(id(new AphrontFormSelectControl())->setName('merchantPHID')->setLabel(pht('Pay To Merchant'))->setValue($v_merchant)->setError($e_merchant)->setOptions($merchant_options))->appendChild(id(new PhabricatorRemarkupControl())->setUser($viewer)->setName('description')->setLabel(pht('Description'))->setValue($v_desc))->appendChild(id(new PhabricatorRemarkupControl())->setUser($viewer)->setName('risks')->setLabel(pht('Risks/Challenges'))->setValue($v_risk))->appendControl(id(new AphrontFormTokenizerControl())->setLabel(pht('Projects'))->setName('projects')->setValue($v_projects)->setDatasource(new PhabricatorProjectDatasource()))->appendChild(id(new AphrontFormPolicyControl())->setName('viewPolicy')->setPolicyObject($initiative)->setCapability(PhabricatorPolicyCapability::CAN_VIEW)->setPolicies($policies))->appendChild(id(new AphrontFormPolicyControl())->setName('editPolicy')->setPolicyObject($initiative)->setCapability(PhabricatorPolicyCapability::CAN_EDIT)->setPolicies($policies))->appendChild(id(new AphrontFormSubmitControl())->setValue($button_text)->addCancelButton($cancel_uri)); $crumbs = $this->buildApplicationCrumbs(); if ($is_new) { $crumbs->addTextCrumb(pht('Create Initiative')); } else { $crumbs->addTextCrumb($initiative->getMonogram(), '/' . $initiative->getMonogram()); $crumbs->addTextCrumb(pht('Edit')); } $box = id(new PHUIObjectBoxView())->setValidationException($validation_exception)->setHeaderText($title)->appendChild($form); return $this->buildApplicationPage(array($crumbs, $box), array('title' => $title)); }
public function processRequest() { $request = $this->getRequest(); $viewer = $request->getUser(); if ($this->id) { $initiative = id(new FundInitiativeQuery())->setViewer($viewer)->withIDs(array($this->id))->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT))->executeOne(); if (!$initiative) { return new Aphront404Response(); } $is_new = false; } else { $initiative = FundInitiative::initializeNewInitiative($viewer); $is_new = true; } if ($is_new) { $title = pht('Create Initiative'); $button_text = pht('Create Initiative'); $cancel_uri = $this->getApplicationURI(); } else { $title = pht('Edit %s %s', $initiative->getMonogram(), $initiative->getName()); $button_text = pht('Save Changes'); $cancel_uri = '/' . $initiative->getMonogram(); } $e_name = true; $v_name = $initiative->getName(); $v_desc = $initiative->getDescription(); if ($is_new) { $v_projects = array(); } else { $v_projects = PhabricatorEdgeQuery::loadDestinationPHIDs($initiative->getPHID(), PhabricatorProjectObjectHasProjectEdgeType::EDGECONST); $v_projects = array_reverse($v_projects); } $validation_exception = null; if ($request->isFormPost()) { $v_name = $request->getStr('name'); $v_desc = $request->getStr('description'); $v_view = $request->getStr('viewPolicy'); $v_edit = $request->getStr('editPolicy'); $v_projects = $request->getArr('projects'); $type_name = FundInitiativeTransaction::TYPE_NAME; $type_desc = FundInitiativeTransaction::TYPE_DESCRIPTION; $type_view = PhabricatorTransactions::TYPE_VIEW_POLICY; $type_edit = PhabricatorTransactions::TYPE_EDIT_POLICY; $xactions = array(); $xactions[] = id(new FundInitiativeTransaction())->setTransactionType($type_name)->setNewValue($v_name); $xactions[] = id(new FundInitiativeTransaction())->setTransactionType($type_desc)->setNewValue($v_desc); $xactions[] = id(new FundInitiativeTransaction())->setTransactionType($type_view)->setNewValue($v_view); $xactions[] = id(new FundInitiativeTransaction())->setTransactionType($type_edit)->setNewValue($v_edit); $proj_edge_type = PhabricatorProjectObjectHasProjectEdgeType::EDGECONST; $xactions[] = id(new FundInitiativeTransaction())->setTransactionType(PhabricatorTransactions::TYPE_EDGE)->setMetadataValue('edge:type', $proj_edge_type)->setNewValue(array('=' => array_fuse($v_projects))); $editor = id(new FundInitiativeEditor())->setActor($viewer)->setContentSourceFromRequest($request)->setContinueOnNoEffect(true); try { $editor->applyTransactions($initiative, $xactions); return id(new AphrontRedirectResponse())->setURI('/' . $initiative->getMonogram()); } catch (PhabricatorApplicationTransactionValidationException $ex) { $validation_exception = $ex; $e_name = $ex->getShortMessage($type_name); $initiative->setViewPolicy($v_view); $initiative->setEditPolicy($v_edit); } } $policies = id(new PhabricatorPolicyQuery())->setViewer($viewer)->setObject($initiative)->execute(); if ($v_projects) { $project_handles = $this->loadViewerHandles($v_projects); } else { $project_handles = array(); } $form = id(new AphrontFormView())->setUser($viewer)->appendChild(id(new AphrontFormTextControl())->setName('name')->setLabel(pht('Name'))->setValue($v_name)->setError($e_name))->appendChild(id(new PhabricatorRemarkupControl())->setName('description')->setLabel(pht('Description'))->setValue($v_desc))->appendChild(id(new AphrontFormTokenizerControl())->setLabel(pht('Projects'))->setName('projects')->setValue($project_handles)->setDatasource(new PhabricatorProjectDatasource()))->appendChild(id(new AphrontFormPolicyControl())->setName('viewPolicy')->setPolicyObject($initiative)->setCapability(PhabricatorPolicyCapability::CAN_VIEW)->setPolicies($policies))->appendChild(id(new AphrontFormPolicyControl())->setName('editPolicy')->setPolicyObject($initiative)->setCapability(PhabricatorPolicyCapability::CAN_EDIT)->setPolicies($policies))->appendChild(id(new AphrontFormSubmitControl())->setValue($button_text)->addCancelButton($cancel_uri)); $crumbs = $this->buildApplicationCrumbs(); if ($is_new) { $crumbs->addTextCrumb(pht('Create Initiative')); } else { $crumbs->addTextCrumb($initiative->getMonogram(), '/' . $initiative->getMonogram()); $crumbs->addTextCrumb(pht('Edit')); } $box = id(new PHUIObjectBoxView())->setValidationException($validation_exception)->setHeaderText($title)->appendChild($form); return $this->buildApplicationPage(array($crumbs, $box), array('title' => $title)); }