[ Index ] |
PHP Cross Reference of Phabricator |
[Summary view] [Print] [Text view]
1 <?php 2 3 final class PhabricatorSettingsMainController 4 extends PhabricatorController { 5 6 private $id; 7 private $key; 8 private $user; 9 10 private function getUser() { 11 return $this->user; 12 } 13 14 private function isSelf() { 15 $viewer_phid = $this->getRequest()->getUser()->getPHID(); 16 $user_phid = $this->getUser()->getPHID(); 17 return ($viewer_phid == $user_phid); 18 } 19 20 public function willProcessRequest(array $data) { 21 $this->id = idx($data, 'id'); 22 $this->key = idx($data, 'key'); 23 } 24 25 public function processRequest() { 26 $request = $this->getRequest(); 27 $viewer = $request->getUser(); 28 29 if ($this->id) { 30 $user = id(new PhabricatorPeopleQuery()) 31 ->setViewer($viewer) 32 ->withIDs(array($this->id)) 33 ->requireCapabilities( 34 array( 35 PhabricatorPolicyCapability::CAN_VIEW, 36 PhabricatorPolicyCapability::CAN_EDIT, 37 )) 38 ->executeOne(); 39 40 if (!$user) { 41 return new Aphront404Response(); 42 } 43 44 $this->user = $user; 45 } else { 46 $this->user = $viewer; 47 } 48 49 $panels = $this->buildPanels(); 50 $nav = $this->renderSideNav($panels); 51 52 $key = $nav->selectFilter($this->key, head($panels)->getPanelKey()); 53 54 $panel = $panels[$key]; 55 $panel->setUser($this->getUser()); 56 $panel->setViewer($viewer); 57 58 $response = $panel->processRequest($request); 59 if ($response instanceof AphrontResponse) { 60 return $response; 61 } 62 63 $crumbs = $this->buildApplicationCrumbs(); 64 if (!$this->isSelf()) { 65 $crumbs->addTextCrumb( 66 $this->getUser()->getUsername(), 67 '/p/'.$this->getUser()->getUsername().'/'); 68 } 69 $crumbs->addTextCrumb($panel->getPanelName()); 70 $nav->appendChild( 71 array( 72 $crumbs, 73 $response, 74 )); 75 76 return $this->buildApplicationPage( 77 $nav, 78 array( 79 'title' => $panel->getPanelName(), 80 )); 81 } 82 83 private function buildPanels() { 84 $panel_specs = id(new PhutilSymbolLoader()) 85 ->setAncestorClass('PhabricatorSettingsPanel') 86 ->setConcreteOnly(true) 87 ->selectAndLoadSymbols(); 88 89 $panels = array(); 90 foreach ($panel_specs as $spec) { 91 $class = newv($spec['name'], array()); 92 $panels[] = $class->buildPanels(); 93 } 94 95 $panels = array_mergev($panels); 96 $panels = mpull($panels, null, 'getPanelKey'); 97 98 $result = array(); 99 foreach ($panels as $key => $panel) { 100 if (!$panel->isEnabled()) { 101 continue; 102 } 103 104 if (!$this->isSelf()) { 105 if (!$panel->isEditableByAdministrators()) { 106 continue; 107 } 108 } 109 110 if (!empty($result[$key])) { 111 throw new Exception(pht( 112 "Two settings panels share the same panel key ('%s'): %s, %s.", 113 $key, 114 get_class($panel), 115 get_class($result[$key]))); 116 } 117 118 $result[$key] = $panel; 119 } 120 121 $result = msort($result, 'getPanelSortKey'); 122 123 if (!$result) { 124 throw new Exception(pht('No settings panels are available.')); 125 } 126 127 return $result; 128 } 129 130 private function renderSideNav(array $panels) { 131 $nav = new AphrontSideNavFilterView(); 132 133 if ($this->isSelf()) { 134 $base_uri = 'panel/'; 135 } else { 136 $base_uri = $this->getUser()->getID().'/panel/'; 137 } 138 139 $nav->setBaseURI(new PhutilURI($this->getApplicationURI($base_uri))); 140 141 $group = null; 142 foreach ($panels as $panel) { 143 if ($panel->getPanelGroup() != $group) { 144 $group = $panel->getPanelGroup(); 145 $nav->addLabel($group); 146 } 147 148 $nav->addFilter($panel->getPanelKey(), $panel->getPanelName()); 149 } 150 151 return $nav; 152 } 153 154 public function buildApplicationMenu() { 155 $panels = $this->buildPanels(); 156 return $this->renderSideNav($panels)->getMenu(); 157 } 158 159 }
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 |