[ Index ]

PHP Cross Reference of Phabricator

title

Body

[close]

/src/applications/almanac/controller/ -> AlmanacServiceEditController.php (source)

   1  <?php
   2  
   3  final class AlmanacServiceEditController
   4    extends AlmanacServiceController {
   5  
   6    public function handleRequest(AphrontRequest $request) {
   7      $viewer = $request->getViewer();
   8  
   9      $list_uri = $this->getApplicationURI('service/');
  10  
  11      $id = $request->getURIData('id');
  12      if ($id) {
  13        $service = id(new AlmanacServiceQuery())
  14          ->setViewer($viewer)
  15          ->withIDs(array($id))
  16          ->requireCapabilities(
  17            array(
  18              PhabricatorPolicyCapability::CAN_VIEW,
  19              PhabricatorPolicyCapability::CAN_EDIT,
  20            ))
  21          ->executeOne();
  22        if (!$service) {
  23          return new Aphront404Response();
  24        }
  25  
  26        $is_new = false;
  27        $service_uri = $service->getURI();
  28        $cancel_uri = $service_uri;
  29        $title = pht('Edit Service');
  30        $save_button = pht('Save Changes');
  31      } else {
  32        $this->requireApplicationCapability(
  33          AlmanacCreateServicesCapability::CAPABILITY);
  34  
  35        $service = AlmanacService::initializeNewService();
  36        $is_new = true;
  37  
  38        $cancel_uri = $list_uri;
  39        $title = pht('Create Service');
  40        $save_button = pht('Create Service');
  41      }
  42  
  43      $v_name = $service->getName();
  44      $e_name = true;
  45      $validation_exception = null;
  46  
  47      if ($is_new) {
  48        $v_projects = array();
  49      } else {
  50        $v_projects = PhabricatorEdgeQuery::loadDestinationPHIDs(
  51          $service->getPHID(),
  52          PhabricatorProjectObjectHasProjectEdgeType::EDGECONST);
  53        $v_projects = array_reverse($v_projects);
  54      }
  55  
  56      if ($request->isFormPost()) {
  57        $v_name = $request->getStr('name');
  58        $v_view = $request->getStr('viewPolicy');
  59        $v_edit = $request->getStr('editPolicy');
  60        $v_projects = $request->getArr('projects');
  61  
  62        $type_name = AlmanacServiceTransaction::TYPE_NAME;
  63        $type_view = PhabricatorTransactions::TYPE_VIEW_POLICY;
  64        $type_edit = PhabricatorTransactions::TYPE_EDIT_POLICY;
  65  
  66        $xactions = array();
  67  
  68        $xactions[] = id(new AlmanacServiceTransaction())
  69          ->setTransactionType($type_name)
  70          ->setNewValue($v_name);
  71  
  72        $xactions[] = id(new AlmanacServiceTransaction())
  73          ->setTransactionType($type_view)
  74          ->setNewValue($v_view);
  75  
  76        $xactions[] = id(new AlmanacServiceTransaction())
  77          ->setTransactionType($type_edit)
  78          ->setNewValue($v_edit);
  79  
  80        $proj_edge_type = PhabricatorProjectObjectHasProjectEdgeType::EDGECONST;
  81        $xactions[] = id(new AlmanacServiceTransaction())
  82          ->setTransactionType(PhabricatorTransactions::TYPE_EDGE)
  83          ->setMetadataValue('edge:type', $proj_edge_type)
  84          ->setNewValue(array('=' => array_fuse($v_projects)));
  85  
  86        $editor = id(new AlmanacServiceEditor())
  87          ->setActor($viewer)
  88          ->setContentSourceFromRequest($request)
  89          ->setContinueOnNoEffect(true);
  90  
  91        try {
  92          $editor->applyTransactions($service, $xactions);
  93  
  94          $service_uri = $service->getURI();
  95          return id(new AphrontRedirectResponse())->setURI($service_uri);
  96        } catch (PhabricatorApplicationTransactionValidationException $ex) {
  97          $validation_exception = $ex;
  98          $e_name = $ex->getShortMessage($type_name);
  99  
 100          $service->setViewPolicy($v_view);
 101          $service->setEditPolicy($v_edit);
 102        }
 103      }
 104  
 105      $policies = id(new PhabricatorPolicyQuery())
 106        ->setViewer($viewer)
 107        ->setObject($service)
 108        ->execute();
 109  
 110      if ($v_projects) {
 111        $project_handles = $this->loadViewerHandles($v_projects);
 112      } else {
 113        $project_handles = array();
 114      }
 115  
 116      $form = id(new AphrontFormView())
 117        ->setUser($viewer)
 118        ->appendChild(
 119          id(new AphrontFormTextControl())
 120            ->setLabel(pht('Name'))
 121            ->setName('name')
 122            ->setValue($v_name)
 123            ->setError($e_name))
 124        ->appendChild(
 125          id(new AphrontFormPolicyControl())
 126            ->setName('viewPolicy')
 127            ->setPolicyObject($service)
 128            ->setCapability(PhabricatorPolicyCapability::CAN_VIEW)
 129            ->setPolicies($policies))
 130        ->appendChild(
 131          id(new AphrontFormPolicyControl())
 132            ->setName('editPolicy')
 133            ->setPolicyObject($service)
 134            ->setCapability(PhabricatorPolicyCapability::CAN_EDIT)
 135            ->setPolicies($policies))
 136        ->appendChild(
 137          id(new AphrontFormTokenizerControl())
 138            ->setLabel(pht('Projects'))
 139            ->setName('projects')
 140            ->setValue($project_handles)
 141            ->setDatasource(new PhabricatorProjectDatasource()))
 142        ->appendChild(
 143          id(new AphrontFormSubmitControl())
 144            ->addCancelButton($cancel_uri)
 145            ->setValue($save_button));
 146  
 147      $box = id(new PHUIObjectBoxView())
 148        ->setValidationException($validation_exception)
 149        ->setHeaderText($title)
 150        ->appendChild($form);
 151  
 152      $crumbs = $this->buildApplicationCrumbs();
 153      if ($is_new) {
 154        $crumbs->addTextCrumb(pht('Create Service'));
 155      } else {
 156        $crumbs->addTextCrumb($service->getName(), $service_uri);
 157        $crumbs->addTextCrumb(pht('Edit'));
 158      }
 159  
 160      return $this->buildApplicationPage(
 161        array(
 162          $crumbs,
 163          $box,
 164        ),
 165        array(
 166          'title' => $title,
 167        ));
 168    }
 169  
 170  }


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