@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
at recaptime-dev/main 129 lines 3.1 kB view raw
1<?php 2 3final class PhabricatorCustomFieldSearchEngineExtension 4 extends PhabricatorSearchEngineExtension { 5 6 const EXTENSIONKEY = 'customfield'; 7 8 public function isExtensionEnabled() { 9 return true; 10 } 11 12 public function getExtensionName() { 13 return pht('Support for Custom Fields'); 14 } 15 16 public function supportsObject($object) { 17 return ($object instanceof PhabricatorCustomFieldInterface); 18 } 19 20 public function getExtensionOrder() { 21 return 9000; 22 } 23 24 public function getSearchFields($object) { 25 $engine = $this->getSearchEngine(); 26 $custom_fields = $this->getCustomFields($object); 27 28 $fields = array(); 29 foreach ($custom_fields as $field) { 30 $fields[] = id(new PhabricatorSearchCustomFieldProxyField()) 31 ->setSearchEngine($engine) 32 ->setCustomField($field); 33 } 34 35 return $fields; 36 } 37 38 public function applyConstraintsToQuery( 39 $object, 40 $query, 41 PhabricatorSavedQuery $saved, 42 array $map) { 43 44 $engine = $this->getSearchEngine(); 45 $fields = $this->getCustomFields($object); 46 47 foreach ($fields as $field) { 48 $field->applyApplicationSearchConstraintToQuery( 49 $engine, 50 $query, 51 $saved->getParameter('custom:'.$field->getFieldIndex())); 52 } 53 } 54 55 private function getCustomFields($object) { 56 $fields = PhabricatorCustomField::getObjectFields( 57 $object, 58 PhabricatorCustomField::ROLE_APPLICATIONSEARCH); 59 $fields->setViewer($this->getViewer()); 60 61 return $fields->getFields(); 62 } 63 64 public function getFieldSpecificationsForConduit($object) { 65 $fields = PhabricatorCustomField::getObjectFields( 66 $object, 67 PhabricatorCustomField::ROLE_CONDUIT); 68 69 $map = array(); 70 foreach ($fields->getFields() as $field) { 71 $key = $field->getModernFieldKey(); 72 73 // TODO: These should have proper types. 74 $map[] = id(new PhabricatorConduitSearchFieldSpecification()) 75 ->setKey($key) 76 ->setType('wild') 77 ->setDescription($field->getFieldDescription()); 78 } 79 80 return $map; 81 } 82 83 public function loadExtensionConduitData(array $objects) { 84 $viewer = $this->getViewer(); 85 86 $field_map = array(); 87 foreach ($objects as $object) { 88 $object_phid = $object->getPHID(); 89 90 $fields = PhabricatorCustomField::getObjectFields( 91 $object, 92 PhabricatorCustomField::ROLE_CONDUIT); 93 94 $fields 95 ->setViewer($viewer) 96 ->readFieldsFromObject($object); 97 98 $field_map[$object_phid] = $fields; 99 } 100 101 $all_fields = array(); 102 foreach ($field_map as $field_list) { 103 foreach ($field_list->getFields() as $field) { 104 $all_fields[] = $field; 105 } 106 } 107 108 id(new PhabricatorCustomFieldStorageQuery()) 109 ->addFields($all_fields) 110 ->execute(); 111 112 return array( 113 'fields' => $field_map, 114 ); 115 } 116 117 public function getFieldValuesForConduit($object, $data) { 118 $fields = $data['fields'][$object->getPHID()]; 119 120 $map = array(); 121 foreach ($fields->getFields() as $field) { 122 $key = $field->getModernFieldKey(); 123 $map[$key] = $field->getConduitDictionaryValue(); 124 } 125 126 return $map; 127 } 128 129}