[ Index ] |
PHP Cross Reference of Phabricator |
[Summary view] [Print] [Text view]
1 <?php 2 3 final class FundInitiativeEditController 4 extends FundController { 5 6 private $id; 7 8 public function willProcessRequest(array $data) { 9 $this->id = idx($data, 'id'); 10 } 11 12 public function processRequest() { 13 $request = $this->getRequest(); 14 $viewer = $request->getUser(); 15 16 if ($this->id) { 17 $initiative = id(new FundInitiativeQuery()) 18 ->setViewer($viewer) 19 ->withIDs(array($this->id)) 20 ->requireCapabilities( 21 array( 22 PhabricatorPolicyCapability::CAN_VIEW, 23 PhabricatorPolicyCapability::CAN_EDIT, 24 )) 25 ->executeOne(); 26 if (!$initiative) { 27 return new Aphront404Response(); 28 } 29 $is_new = false; 30 } else { 31 $initiative = FundInitiative::initializeNewInitiative($viewer); 32 $is_new = true; 33 } 34 35 if ($is_new) { 36 $title = pht('Create Initiative'); 37 $button_text = pht('Create Initiative'); 38 $cancel_uri = $this->getApplicationURI(); 39 } else { 40 $title = pht( 41 'Edit %s %s', 42 $initiative->getMonogram(), 43 $initiative->getName()); 44 $button_text = pht('Save Changes'); 45 $cancel_uri = '/'.$initiative->getMonogram(); 46 } 47 48 $e_name = true; 49 $v_name = $initiative->getName(); 50 51 $e_merchant = null; 52 $v_merchant = $initiative->getMerchantPHID(); 53 54 $v_desc = $initiative->getDescription(); 55 $v_risk = $initiative->getRisks(); 56 57 if ($is_new) { 58 $v_projects = array(); 59 } else { 60 $v_projects = PhabricatorEdgeQuery::loadDestinationPHIDs( 61 $initiative->getPHID(), 62 PhabricatorProjectObjectHasProjectEdgeType::EDGECONST); 63 $v_projects = array_reverse($v_projects); 64 } 65 66 $validation_exception = null; 67 if ($request->isFormPost()) { 68 $v_name = $request->getStr('name'); 69 $v_desc = $request->getStr('description'); 70 $v_risk = $request->getStr('risks'); 71 $v_view = $request->getStr('viewPolicy'); 72 $v_edit = $request->getStr('editPolicy'); 73 $v_merchant = $request->getStr('merchantPHID'); 74 $v_projects = $request->getArr('projects'); 75 76 $type_name = FundInitiativeTransaction::TYPE_NAME; 77 $type_desc = FundInitiativeTransaction::TYPE_DESCRIPTION; 78 $type_risk = FundInitiativeTransaction::TYPE_RISKS; 79 $type_merchant = FundInitiativeTransaction::TYPE_MERCHANT; 80 $type_view = PhabricatorTransactions::TYPE_VIEW_POLICY; 81 $type_edit = PhabricatorTransactions::TYPE_EDIT_POLICY; 82 83 $xactions = array(); 84 85 $xactions[] = id(new FundInitiativeTransaction()) 86 ->setTransactionType($type_name) 87 ->setNewValue($v_name); 88 89 $xactions[] = id(new FundInitiativeTransaction()) 90 ->setTransactionType($type_desc) 91 ->setNewValue($v_desc); 92 93 $xactions[] = id(new FundInitiativeTransaction()) 94 ->setTransactionType($type_risk) 95 ->setNewValue($v_risk); 96 97 $xactions[] = id(new FundInitiativeTransaction()) 98 ->setTransactionType($type_merchant) 99 ->setNewValue($v_merchant); 100 101 $xactions[] = id(new FundInitiativeTransaction()) 102 ->setTransactionType($type_view) 103 ->setNewValue($v_view); 104 105 $xactions[] = id(new FundInitiativeTransaction()) 106 ->setTransactionType($type_edit) 107 ->setNewValue($v_edit); 108 109 $proj_edge_type = PhabricatorProjectObjectHasProjectEdgeType::EDGECONST; 110 $xactions[] = id(new FundInitiativeTransaction()) 111 ->setTransactionType(PhabricatorTransactions::TYPE_EDGE) 112 ->setMetadataValue('edge:type', $proj_edge_type) 113 ->setNewValue(array('=' => array_fuse($v_projects))); 114 115 $editor = id(new FundInitiativeEditor()) 116 ->setActor($viewer) 117 ->setContentSourceFromRequest($request) 118 ->setContinueOnNoEffect(true); 119 120 try { 121 $editor->applyTransactions($initiative, $xactions); 122 123 return id(new AphrontRedirectResponse()) 124 ->setURI('/'.$initiative->getMonogram()); 125 } catch (PhabricatorApplicationTransactionValidationException $ex) { 126 $validation_exception = $ex; 127 128 $e_name = $ex->getShortMessage($type_name); 129 $e_merchant = $ex->getShortMessage($type_merchant); 130 131 $initiative->setViewPolicy($v_view); 132 $initiative->setEditPolicy($v_edit); 133 } 134 } 135 136 $policies = id(new PhabricatorPolicyQuery()) 137 ->setViewer($viewer) 138 ->setObject($initiative) 139 ->execute(); 140 141 if ($v_projects) { 142 $project_handles = $this->loadViewerHandles($v_projects); 143 } else { 144 $project_handles = array(); 145 } 146 147 $merchants = id(new PhortuneMerchantQuery()) 148 ->setViewer($viewer) 149 ->requireCapabilities( 150 array( 151 PhabricatorPolicyCapability::CAN_VIEW, 152 PhabricatorPolicyCapability::CAN_EDIT, 153 )) 154 ->execute(); 155 156 $merchant_options = array(); 157 foreach ($merchants as $merchant) { 158 $merchant_options[$merchant->getPHID()] = pht( 159 'Merchant %d %s', 160 $merchant->getID(), 161 $merchant->getName()); 162 } 163 164 if ($v_merchant && empty($merchant_options[$v_merchant])) { 165 $merchant_options = array( 166 $v_merchant => pht('(Restricted Merchant)'), 167 ) + $merchant_options; 168 } 169 170 if (!$merchant_options) { 171 return $this->newDialog() 172 ->setTitle(pht('No Valid Phortune Merchant Accounts')) 173 ->appendParagraph( 174 pht( 175 'You do not control any merchant accounts which can receive '. 176 'payments from this initiative. When you create an initiative, '. 177 'you need to specify a merchant account where funds will be paid '. 178 'to.')) 179 ->appendParagraph( 180 pht( 181 'Create a merchant account in the Phortune application before '. 182 'creating an initiative in Fund.')) 183 ->addCancelButton($this->getApplicationURI()); 184 } 185 186 $form = id(new AphrontFormView()) 187 ->setUser($viewer) 188 ->appendChild( 189 id(new AphrontFormTextControl()) 190 ->setName('name') 191 ->setLabel(pht('Name')) 192 ->setValue($v_name) 193 ->setError($e_name)) 194 ->appendChild( 195 id(new AphrontFormSelectControl()) 196 ->setName('merchantPHID') 197 ->setLabel(pht('Pay To Merchant')) 198 ->setValue($v_merchant) 199 ->setError($e_merchant) 200 ->setOptions($merchant_options)) 201 ->appendChild( 202 id(new PhabricatorRemarkupControl()) 203 ->setUser($viewer) 204 ->setName('description') 205 ->setLabel(pht('Description')) 206 ->setValue($v_desc)) 207 ->appendChild( 208 id(new PhabricatorRemarkupControl()) 209 ->setUser($viewer) 210 ->setName('risks') 211 ->setLabel(pht('Risks/Challenges')) 212 ->setValue($v_risk)) 213 ->appendChild( 214 id(new AphrontFormTokenizerControl()) 215 ->setLabel(pht('Projects')) 216 ->setName('projects') 217 ->setValue($project_handles) 218 ->setDatasource(new PhabricatorProjectDatasource())) 219 ->appendChild( 220 id(new AphrontFormPolicyControl()) 221 ->setName('viewPolicy') 222 ->setPolicyObject($initiative) 223 ->setCapability(PhabricatorPolicyCapability::CAN_VIEW) 224 ->setPolicies($policies)) 225 ->appendChild( 226 id(new AphrontFormPolicyControl()) 227 ->setName('editPolicy') 228 ->setPolicyObject($initiative) 229 ->setCapability(PhabricatorPolicyCapability::CAN_EDIT) 230 ->setPolicies($policies)) 231 ->appendChild( 232 id(new AphrontFormSubmitControl()) 233 ->setValue($button_text) 234 ->addCancelButton($cancel_uri)); 235 236 $crumbs = $this->buildApplicationCrumbs(); 237 if ($is_new) { 238 $crumbs->addTextCrumb(pht('Create Initiative')); 239 } else { 240 $crumbs->addTextCrumb( 241 $initiative->getMonogram(), 242 '/'.$initiative->getMonogram()); 243 $crumbs->addTextCrumb(pht('Edit')); 244 } 245 246 $box = id(new PHUIObjectBoxView()) 247 ->setValidationException($validation_exception) 248 ->setHeaderText($title) 249 ->appendChild($form); 250 251 return $this->buildApplicationPage( 252 array( 253 $crumbs, 254 $box, 255 ), 256 array( 257 'title' => $title, 258 )); 259 } 260 261 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Sun Nov 30 09:20:46 2014 | Cross-referenced by PHPXref 0.7.1 |