@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 PhabricatorCustomFieldExportEngineExtension
4 extends PhabricatorExportEngineExtension {
5
6 const EXTENSIONKEY = 'custom-field';
7
8 private $object;
9
10 public function supportsObject($object) {
11 $this->object = $object;
12 return ($object instanceof PhabricatorCustomFieldInterface);
13 }
14
15 public function newExportFields() {
16 $prototype = $this->object;
17
18 $fields = $this->newCustomFields($prototype);
19
20 $results = array();
21 foreach ($fields as $field) {
22 $field_key = $field->getModernFieldKey();
23
24 $results[] = $field->newExportField()
25 ->setKey($field_key);
26 }
27
28 return $results;
29 }
30
31 public function newExportData(array $objects) {
32 $viewer = $this->getViewer();
33
34 $field_map = array();
35 foreach ($objects as $object) {
36 $object_phid = $object->getPHID();
37
38 $fields = PhabricatorCustomField::getObjectFields(
39 $object,
40 PhabricatorCustomField::ROLE_EXPORT);
41
42 $fields
43 ->setViewer($viewer)
44 ->readFieldsFromObject($object);
45
46 $field_map[$object_phid] = $fields;
47 }
48
49 $all_fields = array();
50 foreach ($field_map as $field_list) {
51 foreach ($field_list->getFields() as $field) {
52 $all_fields[] = $field;
53 }
54 }
55
56 id(new PhabricatorCustomFieldStorageQuery())
57 ->addFields($all_fields)
58 ->execute();
59
60 $results = array();
61 foreach ($objects as $object) {
62 $object_phid = $object->getPHID();
63 $object_fields = $field_map[$object_phid];
64
65 $map = array();
66 foreach ($object_fields->getFields() as $field) {
67 $key = $field->getModernFieldKey();
68 $map[$key] = $field->newExportData();
69 }
70
71 $results[] = $map;
72 }
73
74 return $results;
75 }
76
77 private function newCustomFields($object) {
78 $fields = PhabricatorCustomField::getObjectFields(
79 $object,
80 PhabricatorCustomField::ROLE_EXPORT);
81 $fields->setViewer($this->getViewer());
82
83 return $fields->getFields();
84 }
85
86}