Merge pull request #5106 from cividesk/CRM-14974-4.6
authorKurund Jalmi <kurund@civicrm.org>
Thu, 26 Feb 2015 18:54:46 +0000 (00:24 +0530)
committerKurund Jalmi <kurund@civicrm.org>
Thu, 26 Feb 2015 18:54:46 +0000 (00:24 +0530)
Fix for CRM-14974

CRM/Core/BAO/Setting.php
tests/phpunit/CRM/Core/BAO/SettingTest.php

index c42b444a9927b6e0d4187ab095d1228aa77b6831..14a45f9f8d6b11cc5d9dca047dcc9c011fc2f883 100644 (file)
@@ -228,14 +228,29 @@ class CRM_Core_BAO_Setting extends CRM_Core_DAO_Setting {
     $domainID = NULL
   ) {
 
+    $overrideGroup = array();
     if (NULL !== ($override = self::getOverride($group, $name, NULL))) {
-      return $override;
+      if (isset($name)) {
+        return $override;
+      }
+      else {
+        $overrideGroup = $override;
+      }
     }
 
     if (empty($domainID)) {
       $domainID = CRM_Core_Config::domainID();
     }
     $cacheKey = self::inCache($group, $name, $componentID, $contactID, TRUE, $domainID);
+
+    if ($group && !isset($name) && $cacheKey) {
+      // check value against the cache, and unset key if values are different
+      $valueDifference = array_diff($overrideGroup, self::$_cache[$cacheKey]);
+      if (!empty($valueDifference)) {
+        $cacheKey = '';
+      }
+    }
+
     if (!$cacheKey) {
       $dao = self::dao($group, NULL, $componentID, $contactID, $domainID);
       $dao->find();
@@ -254,6 +269,16 @@ class CRM_Core_BAO_Setting extends CRM_Core_DAO_Setting {
       }
       $dao->free();
 
+      if (!isset($name)) {
+        // merge db and override group values
+        // When no $name is present, the getItem() function should return an array
+        // consisting of the sum of all override settings + all settings present in
+        // the database for the given $group (with the overrides taking precedence,
+        // and applying even if the setting is not defined in the database).
+        //
+        $values = array_merge($values, $overrideGroup);
+      }
+
       $cacheKey = self::setCache($values, $group, $componentID, $contactID, $domainID);
     }
     return $name ? CRM_Utils_Array::value($name, self::$_cache[$cacheKey], $defaultValue) : self::$_cache[$cacheKey];
@@ -1106,6 +1131,9 @@ AND domain_id = %3
     if ($group && $name && isset($civicrm_setting[$group][$name])) {
       return $civicrm_setting[$group][$name];
     }
+    elseif ($group && !isset($name) && isset($civicrm_setting[$group])) {
+      return $civicrm_setting[$group];
+    }
     else {
       return $default;
     }
index 13a67d73ca1582f9ef5e7e22ffb53624e6a989df..a4a37e5be48cd326bdba4ca3b30b079771e208de 100644 (file)
@@ -80,6 +80,23 @@ class CRM_Core_BAO_SettingTest extends CiviUnitTestCase {
     $civicrm_setting[CRM_Core_BAO_Setting::DIRECTORY_PREFERENCES_NAME]['imageUploadDir'] = '/test/override';
     $value = CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::DIRECTORY_PREFERENCES_NAME, 'imageUploadDir');
     $this->assertEquals('/test/override', $value);
+
+    // CRM-14974 test suite
+    $civicrm_setting['Test Preferences']['overrideSetting'] = '/test/override';
+    $values = CRM_Core_BAO_Setting::getItem('Test Preferences');
+    $this->assertEquals('/test/override', $values['overrideSetting']);
+    CRM_Core_BAO_Setting::setItem('/test/database', 'Test Preferences', 'databaseSetting');
+    $values = CRM_Core_BAO_Setting::getItem('Test Preferences');
+    $this->assertEquals('/test/override', $values['overrideSetting']);
+    $this->assertEquals('/test/database', $values['databaseSetting']);
+    $civicrm_setting['Test Preferences']['databaseSetting'] = '/test/dataride';
+    $values = CRM_Core_BAO_Setting::getItem('Test Preferences');
+    $this->assertEquals('/test/override', $values['overrideSetting']);
+    $this->assertEquals('/test/dataride', $values['databaseSetting']);
+    // CRM-14974 tear down
+    unset($civicrm_setting['Test Preferences']);
+    $query = "DELETE FROM civicrm_setting WHERE group_name = 'Test Preferences';";
+    CRM_Core_DAO::executeQuery($query);
   }
 
   /**