[ Index ]

PHP Cross Reference of Phabricator

title

Body

[close]

/src/applications/settings/controller/ -> PhabricatorSettingsMainController.php (source)

   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  }


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