Path: blob/master/src/view/extension/PHUICurtainExtension.php
12249 views
<?php12abstract class PHUICurtainExtension extends Phobject {34private $viewer;56public function setViewer(PhabricatorUser $viewer) {7$this->viewer = $viewer;8return $this;9}1011public function getViewer() {12return $this->viewer;13}1415abstract public function shouldEnableForObject($object);16abstract public function getExtensionApplication();1718public function buildCurtainPanels($object) {19$panel = $this->buildCurtainPanel($object);2021if ($panel !== null) {22return array($panel);23}2425return array();26}2728public function buildCurtainPanel($object) {29throw new PhutilMethodNotImplementedException();30}3132final public function getExtensionKey() {33return $this->getPhobjectClassConstant('EXTENSIONKEY');34}3536final public static function getAllExtensions() {37return id(new PhutilClassMapQuery())38->setAncestorClass(__CLASS__)39->setUniqueMethod('getExtensionKey')40->execute();41}4243protected function newPanel() {44return new PHUICurtainPanelView();45}4647final public static function buildExtensionPanels(48PhabricatorUser $viewer,49$object) {5051$extensions = self::getAllExtensions();52foreach ($extensions as $extension) {53$extension->setViewer($viewer);54}5556foreach ($extensions as $key => $extension) {57$application = $extension->getExtensionApplication();58if (!($application instanceof PhabricatorApplication)) {59throw new Exception(60pht(61'Curtain extension ("%s", of class "%s") did not return an '.62'application from method "%s". This method must return an '.63'object of class "%s".',64$key,65get_class($extension),66'getExtensionApplication()',67'PhabricatorApplication'));68}6970$has_application = PhabricatorApplication::isClassInstalledForViewer(71get_class($application),72$viewer);7374if (!$has_application) {75unset($extensions[$key]);76}77}7879foreach ($extensions as $key => $extension) {80if (!$extension->shouldEnableForObject($object)) {81unset($extensions[$key]);82}83}8485$result = array();8687foreach ($extensions as $key => $extension) {88$panels = $extension->buildCurtainPanels($object);89if (!is_array($panels)) {90throw new Exception(91pht(92'Curtain extension ("%s", of class "%s") did not return a list of '.93'curtain panels from method "%s". This method must return an '.94'array, and each value in the array must be a "%s" object.',95$key,96get_class($extension),97'buildCurtainPanels()',98'PHUICurtainPanelView'));99}100101foreach ($panels as $panel_key => $panel) {102if (!($panel instanceof PHUICurtainPanelView)) {103throw new Exception(104pht(105'Curtain extension ("%s", of class "%s") returned a list of '.106'curtain panels from "%s" that contains an invalid value: '.107'a value (with key "%s") is not an object of class "%s". '.108'Each item in the returned array must be a panel.',109$key,110get_class($extension),111'buildCurtainPanels()',112$panel_key,113'PHUICurtainPanelView'));114}115116$result[] = $panel;117}118}119120return $result;121}122123}124125126