@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 PhabricatorProjectsExportEngineExtension
4 extends PhabricatorExportEngineExtension {
5
6 const EXTENSIONKEY = 'projects';
7
8 public function supportsObject($object) {
9 return ($object instanceof PhabricatorProjectInterface);
10 }
11
12 public function newExportFields() {
13 return array(
14 id(new PhabricatorPHIDListExportField())
15 ->setKey('tagPHIDs')
16 ->setLabel(pht('Tag PHIDs')),
17 id(new PhabricatorStringListExportField())
18 ->setKey('tags')
19 ->setLabel(pht('Project Tags')),
20 );
21 }
22
23 public function newExportData(array $objects) {
24 $viewer = $this->getViewer();
25
26 $object_phids = mpull($objects, 'getPHID');
27 if (!$object_phids) {
28 return array();
29 }
30
31 $projects_query = id(new PhabricatorEdgeQuery())
32 ->withSourcePHIDs($object_phids)
33 ->withEdgeTypes(
34 array(
35 PhabricatorProjectObjectHasProjectEdgeType::EDGECONST,
36 ));
37 $projects_query->execute();
38
39 $handles = $viewer->loadHandles($projects_query->getDestinationPHIDs());
40
41 $map = array();
42 foreach ($objects as $object) {
43 $object_phid = $object->getPHID();
44
45 $project_phids = $projects_query->getDestinationPHIDs(
46 array($object_phid),
47 array(PhabricatorProjectObjectHasProjectEdgeType::EDGECONST));
48
49 $handle_list = $handles->newSublist($project_phids);
50 $handle_list = iterator_to_array($handle_list);
51 $handle_names = mpull($handle_list, 'getName');
52 $handle_names = array_values($handle_names);
53
54 $map[] = array(
55 'tagPHIDs' => $project_phids,
56 'tags' => $handle_names,
57 );
58 }
59
60 return $map;
61 }
62
63}