protected function newEditableObject() { $viewer = $this->getViewer(); $blueprint = DrydockBlueprint::initializeNewBlueprint($viewer); $impl = $this->getBlueprintImplementation(); if ($impl) { $blueprint->setClassName(get_class($impl))->attachImplementation(clone $impl); } return $blueprint; }
public function handleRequest(AphrontRequest $request) { $viewer = $request->getViewer(); $id = $request->getURIData('id'); if ($id) { $blueprint = id(new DrydockBlueprintQuery())->setViewer($viewer)->withIDs(array($id))->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT))->executeOne(); if (!$blueprint) { return new Aphront404Response(); } $impl = $blueprint->getImplementation(); $cancel_uri = $this->getApplicationURI('blueprint/' . $id . '/'); } else { $this->requireApplicationCapability(DrydockCreateBlueprintsCapability::CAPABILITY); $class = $request->getStr('class'); $impl = DrydockBlueprintImplementation::getNamedImplementation($class); if (!$impl || !$impl->isEnabled()) { return new Aphront400Response(); } $blueprint = DrydockBlueprint::initializeNewBlueprint($viewer); $blueprint->setClassName($class); $cancel_uri = $this->getApplicationURI('blueprint/'); } $field_list = PhabricatorCustomField::getObjectFields($blueprint, PhabricatorCustomField::ROLE_EDIT); $field_list->setViewer($viewer)->readFieldsFromStorage($blueprint); $v_name = $blueprint->getBlueprintName(); $e_name = true; $errors = array(); $validation_exception = null; if ($request->isFormPost()) { $v_view_policy = $request->getStr('viewPolicy'); $v_edit_policy = $request->getStr('editPolicy'); $v_name = $request->getStr('name'); if (!strlen($v_name)) { $e_name = pht('Required'); $errors[] = pht('You must name this blueprint.'); } if (!$errors) { $xactions = array(); $xactions = $field_list->buildFieldTransactionsFromRequest(new DrydockBlueprintTransaction(), $request); $xactions[] = id(new DrydockBlueprintTransaction())->setTransactionType(PhabricatorTransactions::TYPE_VIEW_POLICY)->setNewValue($v_view_policy); $xactions[] = id(new DrydockBlueprintTransaction())->setTransactionType(PhabricatorTransactions::TYPE_EDIT_POLICY)->setNewValue($v_edit_policy); $xactions[] = id(new DrydockBlueprintTransaction())->setTransactionType(DrydockBlueprintTransaction::TYPE_NAME)->setNewValue($v_name); $editor = id(new DrydockBlueprintEditor())->setActor($viewer)->setContentSourceFromRequest($request)->setContinueOnNoEffect(true); try { $editor->applyTransactions($blueprint, $xactions); $id = $blueprint->getID(); $save_uri = $this->getApplicationURI("blueprint/{$id}/"); return id(new AphrontRedirectResponse())->setURI($save_uri); } catch (PhabricatorApplicationTransactionValidationException $ex) { $validation_exception = $ex; } } } $policies = id(new PhabricatorPolicyQuery())->setViewer($viewer)->setObject($blueprint)->execute(); $form = id(new AphrontFormView())->setUser($viewer)->addHiddenInput('class', $request->getStr('class'))->appendChild(id(new AphrontFormTextControl())->setLabel(pht('Name'))->setName('name')->setValue($v_name)->setError($e_name))->appendChild(id(new AphrontFormStaticControl())->setLabel(pht('Blueprint Type'))->setValue($impl->getBlueprintName()))->appendChild(id(new AphrontFormPolicyControl())->setName('viewPolicy')->setPolicyObject($blueprint)->setCapability(PhabricatorPolicyCapability::CAN_VIEW)->setPolicies($policies))->appendChild(id(new AphrontFormPolicyControl())->setName('editPolicy')->setPolicyObject($blueprint)->setCapability(PhabricatorPolicyCapability::CAN_EDIT)->setPolicies($policies)); $field_list->appendFieldsToForm($form); $crumbs = $this->buildApplicationCrumbs(); if ($blueprint->getID()) { $title = pht('Edit Blueprint'); $header = pht('Edit Blueprint %d', $blueprint->getID()); $crumbs->addTextCrumb(pht('Blueprint %d', $blueprint->getID())); $crumbs->addTextCrumb(pht('Edit')); $submit = pht('Save Blueprint'); } else { $title = pht('New Blueprint'); $header = pht('New Blueprint'); $crumbs->addTextCrumb(pht('New Blueprint')); $submit = pht('Create Blueprint'); } $form->appendChild(id(new AphrontFormSubmitControl())->setValue($submit)->addCancelButton($cancel_uri)); $box = id(new PHUIObjectBoxView())->setHeaderText($header)->setValidationException($validation_exception)->setFormErrors($errors)->setForm($form); return $this->buildApplicationPage(array($crumbs, $box), array('title' => $title)); }