*/ protected $xml = array(); /** * @var array|NULL */ protected $hookCache = NULL; /** * @var array|NULL symbolic names of case-types */ protected $allCaseTypes = NULL; /** * @param bool $fresh * @return CRM_Case_XMLRepository */ public static function singleton($fresh = FALSE) { if (!self::$singleton || $fresh) { self::$singleton = new static(); } return self::$singleton; } /** * @param array $xml */ public function __construct($allCaseTypes = NULL, $xml = array()) { $this->allCaseTypes = $allCaseTypes; $this->xml = $xml; } /** * @param string $caseType * @return SimpleXMLElement|FALSE */ public function retrieve($caseType) { $caseType = CRM_Case_XMLProcessor::mungeCaseType($caseType); if (!CRM_Utils_Array::value($caseType, $this->xml)) { // first check custom templates directory $fileName = NULL; $config = CRM_Core_Config::singleton(); if (isset($config->customTemplateDir) && $config->customTemplateDir ) { // check if the file exists in the custom templates directory $fileName = implode(DIRECTORY_SEPARATOR, array( $config->customTemplateDir, 'CRM', 'Case', 'xml', 'configuration', "$caseType.xml", ) ); } if (!$fileName || !file_exists($fileName) ) { // check if file exists locally $fileName = implode(DIRECTORY_SEPARATOR, array( dirname(__FILE__), 'xml', 'configuration', "$caseType.xml", ) ); if (!file_exists($fileName)) { // check if file exists locally $fileName = implode(DIRECTORY_SEPARATOR, array( dirname(__FILE__), 'xml', 'configuration.sample', "$caseType.xml", ) ); } if (!file_exists($fileName)) { $caseTypesViaHook = $this->getCaseTypesViaHook(); if (isset($caseTypesViaHook[$caseType], $caseTypesViaHook[$caseType]['file'])) { $fileName = $caseTypesViaHook[$caseType]['file']; } } if (!file_exists($fileName)) { return FALSE; } } // read xml file $dom = new DomDocument(); $dom->load($fileName); $dom->xinclude(); $this->xml[$caseType] = simplexml_import_dom($dom); } return $this->xml[$caseType]; } /** * @return array * @see CRM_Utils_Hook::caseTypes */ public function getCaseTypesViaHook() { if ($this->hookCache === NULL) { $this->hookCache = array(); CRM_Utils_Hook::caseTypes($this->hookCache); } return $this->hookCache; } /** * @return array symbolic names of case-types */ public function getAllCaseTypes() { if ($this->allCaseTypes === NULL) { $this->allCaseTypes = CRM_Case_PseudoConstant::caseType("name"); } return $this->allCaseTypes; } /** * @return array symbolic-names of activity-types */ public function getAllDeclaredActivityTypes() { $result = array(); $p = new CRM_Case_XMLProcessor_Process(); foreach ($this->getAllCaseTypes() as $caseTypeName) { $caseTypeXML = $this->retrieve($caseTypeName); $result = array_merge($result, $p->getDeclaredActivityTypes($caseTypeXML)); } $result = array_unique($result); sort($result); return $result; } /** * @return array symbolic-names of relationship-types */ public function getAllDeclaredRelationshipTypes() { $result = array(); $p = new CRM_Case_XMLProcessor_Process(); foreach ($this->getAllCaseTypes() as $caseTypeName) { $caseTypeXML = $this->retrieve($caseTypeName); $result = array_merge($result, $p->getDeclaredRelationshipTypes($caseTypeXML)); } $result = array_unique($result); sort($result); return $result; } /** * Determine the number of times a particular activity-type is * referenced in CiviCase XML. * * @param string $activityType symbolic-name of an activity type * @return int */ function getActivityReferenceCount($activityType) { $p = new CRM_Case_XMLProcessor_Process(); $count = 0; foreach ($this->getAllCaseTypes() as $caseTypeName) { $caseTypeXML = $this->retrieve($caseTypeName); if (in_array($activityType, $p->getDeclaredActivityTypes($caseTypeXML))) { $count++; } } return $count; } /** * Determine the number of times a particular activity-type is * referenced in CiviCase XML. * * @param string $relationshipTypeName symbolic-name of a relationship-type * @return int */ function getRelationshipReferenceCount($relationshipTypeName) { $p = new CRM_Case_XMLProcessor_Process(); $count = 0; foreach ($this->getAllCaseTypes() as $caseTypeName) { $caseTypeXML = $this->retrieve($caseTypeName); if (in_array($relationshipTypeName, $p->getDeclaredRelationshipTypes($caseTypeXML))) { $count++; } } return $count; } }