CRM-14165 - Improve option page lookup
[civicrm-core.git] / CRM / Core / PseudoConstant.php
index ef8b6daca7e38bb897c0da2054afb4c779d612b1..30c01bd552927de8e29da5cfd84147ca30b414d7 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 /*
  +--------------------------------------------------------------------+
- | CiviCRM version 4.3                                                |
+ | CiviCRM version 4.4                                                |
  +--------------------------------------------------------------------+
  | Copyright CiviCRM LLC (c) 2004-2013                                |
  +--------------------------------------------------------------------+
@@ -222,7 +222,7 @@ class CRM_Core_PseudoConstant {
    * - fresh      boolean ignore cache entries and go back to DB
    * @param String $context: Context string
    *
-   * @return Array on success, FALSE on error.
+   * @return Array|bool - array on success, FALSE on error.
    *
    * @static
    */
@@ -233,7 +233,7 @@ class CRM_Core_PseudoConstant {
     $params += array(
       'grouping' => FALSE,
       'localize' => FALSE,
-      'onlyActive' => ($context == 'validate' || $context == 'create') ? FALSE : TRUE,
+      'onlyActive' => ($context == 'validate' || $context == 'get') ? FALSE : TRUE,
       'fresh' => FALSE,
     );
 
@@ -276,20 +276,12 @@ class CRM_Core_PseudoConstant {
 
     // Core field: load schema
     $dao = new $daoName;
-    $fields = $dao->fields();
-    $fieldKeys = $dao->fieldKeys();
+    $fieldSpec = $dao->getFieldSpec($fieldName);
     $dao->free();
-
-    // Support "unique names" as well as sql names
-    $fieldKey = $fieldName;
-    if (empty($fields[$fieldKey])) {
-      $fieldKey = $fieldKeys[$fieldName];
-    }
     // If neither worked then this field doesn't exist. Return false.
-    if (empty($fields[$fieldKey])) {
+    if (empty($fieldSpec)) {
       return FALSE;
     }
-    $fieldSpec = $fields[$fieldKey];
 
     // If the field is an enum, explode the enum definition and return the array.
     if (isset($fieldSpec['enumValues'])) {
@@ -501,6 +493,32 @@ class CRM_Core_PseudoConstant {
     return CRM_Utils_Array::key($value, $values);
   }
 
+  /**
+   * Lookup the admin page at which a field's option list can be edited
+   * @param $fieldSpec
+   * @return string|null
+   */
+  static function getOptionEditUrl($fieldSpec) {
+    // If it's an option group, that's easy
+    if (!empty($fieldSpec['pseudoconstant']['optionGroupName'])) {
+      return 'civicrm/admin/options/' . $fieldSpec['pseudoconstant']['optionGroupName'];
+    }
+    // For everything else...
+    elseif (!empty($fieldSpec['pseudoconstant']['table'])) {
+      $daoName = CRM_Core_DAO_AllCoreTables::getClassForTable($fieldSpec['pseudoconstant']['table']);
+      if (!$daoName) {
+        return NULL;
+      }
+      // We don't have good mapping so have to do a bit of guesswork from the menu
+      list(, , , $ent) = explode('_', $daoName);
+      $sql = "SELECT path FROM civicrm_menu
+        WHERE page_callback LIKE '%CRM_Admin_Page_$ent%'
+        LIMIT 1";
+      return CRM_Core_Dao::singleValueQuery($sql);
+    }
+    return NULL;
+  }
+
   /**
    * DEPRECATED generic populate method
    * All pseudoconstant functions that use this method are also deprecated.
@@ -1043,6 +1061,7 @@ WHERE  id = %1";
       while ($relationshipTypeDAO->fetch()) {
 
         self::$relationshipType[$valueColumnName][$relationshipTypeDAO->id] = array(
+          'id' => $relationshipTypeDAO->id,
           $column_a_b => $relationshipTypeDAO->$column_a_b,
           $column_b_a => $relationshipTypeDAO->$column_b_a,
           'contact_type_a' => "$relationshipTypeDAO->contact_type_a",