CRM-13410 - CiviCase - Load XML files from extensions (as defined with hook_civicrm_c...
authorTim Otten <totten@civicrm.org>
Tue, 17 Sep 2013 07:20:48 +0000 (00:20 -0700)
committerTim Otten <totten@civicrm.org>
Tue, 17 Sep 2013 07:23:43 +0000 (00:23 -0700)
----------------------------------------
* CRM-13410: Allow extensions to define case-types
  http://issues.civicrm.org/jira/browse/CRM-13410

CRM/Case/XMLProcessor.php
CRM/Utils/Hook.php

index c22f4e8aa7c838c6b5a510303467945e5867d2cd..eecedd51d6e6a0fc2624fcf7c7c1a4181cbddb0e 100644 (file)
@@ -36,10 +36,10 @@ class CRM_Case_XMLProcessor {
 
   static protected $_xml;
 
+  static protected $_hookCache = NULL;
+
   function retrieve($caseType) {
-    // trim all spaces from $caseType
-    $caseType = str_replace('_', ' ', $caseType);
-    $caseType = CRM_Utils_String::munge(ucwords($caseType), '', 0);
+    $caseType = self::mungeCaseType($caseType);
 
     if (!CRM_Utils_Array::value($caseType, self::$_xml)) {
       if (!self::$_xml) {
@@ -87,6 +87,17 @@ class CRM_Case_XMLProcessor {
             )
           );
         }
+
+        if (!file_exists($fileName)) {
+          if (self::$_hookCache === NULL) {
+            self::$_hookCache = array();
+            CRM_Utils_Hook::caseTypes(self::$_hookCache);
+          }
+          if (isset(self::$_hookCache[$caseType], self::$_hookCache[$caseType]['file'])) {
+            $fileName = self::$_hookCache[$caseType]['file'];
+          }
+        }
+
         if (!file_exists($fileName)) {
           return FALSE;
         }
@@ -101,6 +112,13 @@ class CRM_Case_XMLProcessor {
     return self::$_xml[$caseType];
   }
 
+  public static function mungeCaseType($caseType) {
+    // trim all spaces from $caseType
+    $caseType = str_replace('_', ' ', $caseType);
+    $caseType = CRM_Utils_String::munge(ucwords($caseType), '', 0);
+    return $caseType;
+  }
+
   function &allActivityTypes($indexName = TRUE, $all = FALSE) {
     static $activityTypes = NULL;
     if (!$activityTypes) {
index 198664f0d7364596fad85050fb1f3a4ad2fa6918..cd38ec72537065b62dd8eddda062362b9176275d 100644 (file)
@@ -748,6 +748,16 @@ abstract class CRM_Utils_Hook {
     );
   }
 
+  /**
+   * This hook is called when locating CiviCase types.
+   *
+   * @param array $caseTypes
+   * @return void
+   */
+  static function caseTypes(&$caseTypes) {
+    return self::singleton()->invoke(1, $caseTypes, self::$_nullObject, self::$_nullObject, self::$_nullObject, self::$_nullObject, 'civicrm_caseTypes');
+  }
+
   /**
    * This hook is called soon after the CRM_Core_Config object has ben initialized.
    * You can use this hook to modify the config object and hence behavior of CiviCRM dynamically.