@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
at recaptime-dev/main 133 lines 4.0 kB view raw
1<?php 2 3final class AlmanacBindingEditController 4 extends AlmanacServiceController { 5 6 public function handleRequest(AphrontRequest $request) { 7 $viewer = $request->getViewer(); 8 9 $id = $request->getURIData('id'); 10 if ($id) { 11 $binding = id(new AlmanacBindingQuery()) 12 ->setViewer($viewer) 13 ->withIDs(array($id)) 14 ->requireCapabilities( 15 array( 16 PhabricatorPolicyCapability::CAN_VIEW, 17 PhabricatorPolicyCapability::CAN_EDIT, 18 )) 19 ->executeOne(); 20 if (!$binding) { 21 return new Aphront404Response(); 22 } 23 24 $service = $binding->getService(); 25 $is_new = false; 26 27 $service_uri = $service->getURI(); 28 $cancel_uri = $binding->getURI(); 29 $title = pht('Edit Binding'); 30 $save_button = pht('Save Changes'); 31 } else { 32 $service = id(new AlmanacServiceQuery()) 33 ->setViewer($viewer) 34 ->withIDs(array($request->getStr('serviceID'))) 35 ->requireCapabilities( 36 array( 37 PhabricatorPolicyCapability::CAN_VIEW, 38 PhabricatorPolicyCapability::CAN_EDIT, 39 )) 40 ->executeOne(); 41 42 $binding = AlmanacBinding::initializeNewBinding($service); 43 $is_new = true; 44 45 $service_uri = $service->getURI(); 46 $cancel_uri = $service_uri; 47 $title = pht('Create Binding'); 48 $save_button = pht('Create Binding'); 49 } 50 51 $v_interface = array(); 52 if ($binding->getInterfacePHID()) { 53 $v_interface = array($binding->getInterfacePHID()); 54 } 55 $e_interface = true; 56 57 $validation_exception = null; 58 if ($request->isFormPost()) { 59 $v_interface = $request->getArr('interfacePHIDs'); 60 61 $type_interface = AlmanacBindingInterfaceTransaction::TRANSACTIONTYPE; 62 63 $xactions = array(); 64 65 $xactions[] = id(new AlmanacBindingTransaction()) 66 ->setTransactionType($type_interface) 67 ->setNewValue(head($v_interface)); 68 69 $editor = id(new AlmanacBindingEditor()) 70 ->setActor($viewer) 71 ->setContentSourceFromRequest($request) 72 ->setContinueOnNoEffect(true); 73 74 try { 75 $editor->applyTransactions($binding, $xactions); 76 77 $binding_uri = $binding->getURI(); 78 return id(new AphrontRedirectResponse())->setURI($binding_uri); 79 } catch (PhabricatorApplicationTransactionValidationException $ex) { 80 $validation_exception = $ex; 81 $e_interface = $ex->getShortMessage($type_interface); 82 } 83 } 84 85 $form = id(new AphrontFormView()) 86 ->setUser($viewer) 87 ->appendControl( 88 id(new AphrontFormTokenizerControl()) 89 ->setName('interfacePHIDs') 90 ->setLabel(pht('Interface')) 91 ->setLimit(1) 92 ->setDatasource(new AlmanacInterfaceDatasource()) 93 ->setValue($v_interface) 94 ->setError($e_interface)) 95 ->appendChild( 96 id(new AphrontFormSubmitControl()) 97 ->addCancelButton($cancel_uri) 98 ->setValue($save_button)); 99 100 $box = id(new PHUIObjectBoxView()) 101 ->setValidationException($validation_exception) 102 ->setHeaderText(pht('Binding')) 103 ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) 104 ->appendChild($form); 105 106 $crumbs = $this->buildApplicationCrumbs(); 107 $crumbs->addTextCrumb($service->getName(), $service_uri); 108 if ($is_new) { 109 $crumbs->addTextCrumb(pht('Create Binding')); 110 $header = id(new PHUIHeaderView()) 111 ->setHeader(pht('Create Binding')) 112 ->setHeaderIcon('fa-plus-square'); 113 } else { 114 $crumbs->addTextCrumb(pht('Edit Binding')); 115 $header = id(new PHUIHeaderView()) 116 ->setHeader(pht('Create Binding')) 117 ->setHeaderIcon('fa-pencil'); 118 } 119 $crumbs->setBorder(true); 120 121 $view = id(new PHUITwoColumnView()) 122 ->setHeader($header) 123 ->setFooter(array( 124 $box, 125 )); 126 127 return $this->newPage() 128 ->setTitle($title) 129 ->setCrumbs($crumbs) 130 ->appendChild($view); 131 } 132 133}