Merge remote-tracking branch 'upstream/4.3' into 4.3-master-2013-08-10-18-35-58
[civicrm-core.git] / CRM / Core / OptionGroup.php
index 1e3438966540eef596728393d8d29042418caebe..66ab0bade0aecbd8178ffcfca254dad13dc7d01b 100644 (file)
@@ -92,6 +92,7 @@ class CRM_Core_OptionGroup {
    * @param $labelColumnName string the column to use for 'label'
    * @param $onlyActive boolean return only the action option values
    * @param $fresh      boolean ignore cache entries and go back to DB
+   * @param $keyColumnName string the column to use for 'key'
    *
    * @return array      the values as specified by the above params
    * @static
@@ -100,22 +101,25 @@ class CRM_Core_OptionGroup {
   static function &values(
     $name, $flip = FALSE, $grouping = FALSE,
     $localize = FALSE, $condition = NULL,
-    $labelColumnName = 'label', $onlyActive = TRUE, $fresh = FALSE
+    $labelColumnName = 'label', $onlyActive = TRUE, $fresh = FALSE, $keyColumnName = 'value'
   ) {
-    $cacheKey = self::createCacheKey($name, $flip, $grouping, $localize, $condition, $labelColumnName, $onlyActive);
-
-    if (array_key_exists($cacheKey, self::$_cache) && !$fresh) {
-      return self::$_cache[$cacheKey];
-    }
-
     $cache = CRM_Utils_Cache::singleton();
-    $var = $cache->get($cacheKey);
-    if ($var && !$fresh) {
-      return $var;
+    $cacheKey = self::createCacheKey($name, $flip, $grouping, $localize, $condition, $labelColumnName, $onlyActive, $keyColumnName);
+
+    if (!$fresh) {
+      // Fetch from static var
+      if (array_key_exists($cacheKey, self::$_cache)) {
+        return self::$_cache[$cacheKey];
+      }
+      // Fetch from main cache
+      $var = $cache->get($cacheKey);
+      if ($var) {
+        return $var;
+      }
     }
 
     $query = "
-SELECT  v.{$labelColumnName} as {$labelColumnName} ,v.value as value, v.grouping as grouping
+SELECT  v.{$labelColumnName} as {$labelColumnName} ,v.{$keyColumnName} as value, v.grouping as grouping
 FROM   civicrm_option_value v,
        civicrm_option_group g
 WHERE  v.option_group_id = g.id
@@ -133,7 +137,7 @@ WHERE  v.option_group_id = g.id
       $query .= $condition;
     }
 
-    $query .= "  ORDER BY v.weight";
+    $query .= " ORDER BY v.weight";
 
     $p = array(1 => array($name, 'String'));
     $dao = CRM_Core_DAO::executeQuery($query, $p);
@@ -160,15 +164,15 @@ WHERE  v.option_group_id = g.id
    * @param $labelColumnName
    * @param $onlyActive
    */
-  protected static function flushValues($name, $flip, $grouping, $localize, $condition, $labelColumnName, $onlyActive) {
-    $cacheKey = self::createCacheKey($name, $flip, $grouping, $localize, $condition, $labelColumnName, $onlyActive);
+  protected static function flushValues($name, $flip, $grouping, $localize, $condition, $labelColumnName, $onlyActive, $keyColumnName = 'value') {
+    $cacheKey = self::createCacheKey($name, $flip, $grouping, $localize, $condition, $labelColumnName, $onlyActive, $keyColumnName);
     $cache = CRM_Utils_Cache::singleton();
     $cache->delete($cacheKey);
     unset(self::$_cache[$cacheKey]);
   }
 
-  protected static function createCacheKey($name, $flip, $grouping, $localize, $condition, $labelColumnName, $onlyActive) {
-    $cacheKey = "CRM_OG_{$name}_{$flip}_{$grouping}_{$localize}_{$condition}_{$labelColumnName}_{$onlyActive}";
+  protected static function createCacheKey() {
+    $cacheKey = "CRM_OG_" . serialize(func_get_args());
     return $cacheKey;
   }
 
@@ -189,13 +193,15 @@ WHERE  v.option_group_id = g.id
    * @static
    * @void
    */
-  static function &valuesByID($id, $flip = FALSE, $grouping = FALSE, $localize = FALSE, $labelColumnName = 'label') {
-    $cacheKey = "CRM_OG_ID_{$id}_{$flip}_{$grouping}_{$localize}_{$labelColumnName}";
+  static function &valuesByID($id, $flip = FALSE, $grouping = FALSE, $localize = FALSE, $labelColumnName = 'label', $onlyActive = TRUE, $fresh = FALSE) {
+    $cacheKey = self::createCacheKey($id, $flip, $grouping, $localize, $labelColumnName, $onlyActive);
 
     $cache = CRM_Utils_Cache::singleton();
-    $var = $cache->get($cacheKey);
-    if ($var) {
-      return $var;
+    if (!$fresh) {
+      $var = $cache->get($cacheKey);
+      if ($var) {
+        return $var;
+      }
     }
     $query = "
 SELECT  v.{$labelColumnName} as {$labelColumnName} ,v.value as value, v.grouping as grouping
@@ -203,10 +209,13 @@ FROM   civicrm_option_value v,
        civicrm_option_group g
 WHERE  v.option_group_id = g.id
   AND  g.id              = %1
-  AND  v.is_active       = 1
   AND  g.is_active       = 1
-  ORDER BY v.weight, v.label;
 ";
+    if ($onlyActive) {
+      $query .= " AND  v.is_active = 1 ";
+    }
+    $query .= " ORDER BY v.weight, v.label";
+
     $p = array(1 => array($id, 'Integer'));
     $dao = CRM_Core_DAO::executeQuery($query, $p);
 
@@ -354,6 +363,38 @@ WHERE  v.option_group_id = g.id
     return NULL;
   }
 
+  /**
+   * Get option_value.value from default option_value row for an option group
+   *
+   * @param string $groupName the name of the option group
+   *
+   * @access public
+   * @static
+   *
+   * @return string   the value from the row where is_default = true
+   */
+  static function getDefaultValue($groupName) {
+    if (empty($groupName)) {
+      return NULL;
+    }
+    $query = "
+SELECT v.value
+FROM   civicrm_option_value v,
+       civicrm_option_group g
+WHERE  v.option_group_id = g.id
+  AND  g.name            = %1
+  AND  v.is_active       = 1
+  AND  g.is_active       = 1
+  AND  v.is_default      = 1
+";
+    if (in_array($groupName, self::$_domainIDGroups)) {
+      $query .= " AND v.domain_id = " . CRM_Core_Config::domainID();
+    }
+
+    $p = array(1 => array($groupName, 'String'));
+    return CRM_Core_DAO::singleValueQuery($query, $p);
+  }
+
   /**
    * Creates a new option group with the passed in values
    * @TODO: Should update the group if it already exists intelligently, so multi-lingual is
@@ -555,6 +596,7 @@ WHERE  v.option_group_id = g.id
   static function flushAll() {
     self::$_values = array();
     self::$_cache = array();
+    CRM_Utils_Cache::singleton()->flush();
   }
 }