setViewer(PhabricatorUser::getOmnipotentUser()) ->withMemberPHIDs(array($viewer->getPHID())) ->withPHIDs($values) ->execute(); foreach ($projects as $project) { $this->memberships[$viewer->getPHID()][$project->getPHID()] = true; } } public function applyRule( PhabricatorUser $viewer, $value, PhabricatorPolicyInterface $object) { foreach ($value as $project_phid) { if (isset($this->memberships[$viewer->getPHID()][$project_phid])) { return true; } } return false; } public function getValueControlType() { return self::CONTROL_TYPE_TOKENIZER; } public function getValueControlTemplate() { return $this->getDatasourceTemplate(new PhabricatorProjectDatasource()); } public function getRuleOrder() { return 200; } public function getValueForStorage($value) { PhutilTypeSpec::newFromString('list')->check($value); return array_values($value); } public function getValueForDisplay(PhabricatorUser $viewer, $value) { $handles = id(new PhabricatorHandleQuery()) ->setViewer($viewer) ->withPHIDs($value) ->execute(); return mpull($handles, 'getFullName', 'getPHID'); } public function ruleHasEffect($value) { return (bool)$value; } }