@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 PhabricatorUIExampleRenderController extends PhabricatorController {
4
5 public function shouldAllowPublic() {
6 return true;
7 }
8
9 public function handleRequest(AphrontRequest $request) {
10 $id = $request->getURIData('class');
11
12 $classes = id(new PhutilClassMapQuery())
13 ->setAncestorClass(PhabricatorUIExample::class)
14 ->setSortMethod('getName')
15 ->execute();
16
17 $nav = new AphrontSideNavFilterView();
18 $nav->setBaseURI(new PhutilURI($this->getApplicationURI('view/')));
19
20 $groups = mgroup($classes, 'getCategory');
21 ksort($groups);
22 foreach ($groups as $group => $group_classes) {
23 $nav->addLabel($group);
24 foreach ($group_classes as $class => $obj) {
25 $name = $obj->getName();
26 $nav->addFilter($class, $name);
27 }
28 }
29
30 $selected = $nav->selectFilter($id, head_key($classes));
31
32 $example = $classes[$selected];
33 $example->setRequest($this->getRequest());
34
35 $result = $example->renderExample();
36 if ($result instanceof AphrontResponse) {
37 // This allows examples to generate dialogs, etc., for demonstration.
38 return $result;
39 }
40
41 require_celerity_resource('phabricator-ui-example-css');
42
43 $crumbs = $this->buildApplicationCrumbs();
44 $crumbs->addTextCrumb($example->getName());
45
46 $note = id(new PHUIInfoView())
47 ->setTitle(pht('%s (%s)', $example->getName(), get_class($example)))
48 ->appendChild($example->getDescription())
49 ->setSeverity(PHUIInfoView::SEVERITY_NODATA);
50
51 return $this->newPage()
52 ->setTitle($example->getName())
53 ->setNavigation($nav)
54 ->appendChild(
55 array(
56 $crumbs,
57 $note,
58 $result,
59 ));
60 }
61
62}