[ Index ]

PHP Cross Reference of Phabricator

title

Body

[close]

/src/applications/fund/controller/ -> FundInitiativeEditController.php (source)

   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  }


Generated: Sun Nov 30 09:20:46 2014 Cross-referenced by PHPXref 0.7.1