@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
1<?php
2
3final class PhabricatorConfigModuleController
4 extends PhabricatorConfigController {
5
6 public function handleRequest(AphrontRequest $request) {
7 $viewer = $this->getViewer();
8 $key = $request->getURIData('module');
9
10 $all_modules = PhabricatorConfigModule::getAllModules();
11
12 if (!phutil_nonempty_string($key)) {
13 $key = head_key($all_modules);
14 }
15
16 if (empty($all_modules[$key])) {
17 return new Aphront404Response();
18 }
19
20 $module = $all_modules[$key];
21 $content = $module->renderModuleStatus($request);
22 $title = $module->getModuleName();
23
24 $nav = new AphrontSideNavFilterView();
25 $nav->setBaseURI(new PhutilURI($this->getApplicationURI()));
26
27 $modules_uri = $this->getApplicationURI('module/');
28
29 $modules = PhabricatorConfigModule::getAllModules();
30
31 foreach ($modules as $module_key => $module) {
32 $nav->newLink($module_key)
33 ->setName($module->getModuleName())
34 ->setHref(urisprintf('%s%s/', $modules_uri, $module_key))
35 ->setIcon('fa-puzzle-piece');
36 }
37
38 $nav->selectFilter($key);
39 $header = $this->buildHeaderView($title);
40
41 if ($content instanceof AphrontTableView) {
42 $view = $this->buildConfigBoxView($title, $content);
43 } else {
44 $view = $content;
45 }
46
47 $crumbs = $this->buildApplicationCrumbs()
48 ->addTextCrumb(pht('Extensions/Modules'), $modules_uri)
49 ->addTextCrumb($title)
50 ->setBorder(true);
51
52 $content = id(new PHUITwoColumnView())
53 ->setHeader($header)
54 ->setFooter($view);
55
56 return $this->newPage()
57 ->setTitle($title)
58 ->setCrumbs($crumbs)
59 ->setNavigation($nav)
60 ->appendChild($content);
61 }
62
63}