From bf83df95d6c292576a3283e14ccaa0207d0b05ce Mon Sep 17 00:00:00 2001 From: sunil Date: Fri, 6 Feb 2015 14:02:17 +0530 Subject: [PATCH] Fix for CRM-14974 --- CRM/Core/BAO/Setting.php | 30 +++++++++++++++++++++- tests/phpunit/CRM/Core/BAO/SettingTest.php | 17 ++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/CRM/Core/BAO/Setting.php b/CRM/Core/BAO/Setting.php index 86b73d0356..3fbe429608 100644 --- a/CRM/Core/BAO/Setting.php +++ b/CRM/Core/BAO/Setting.php @@ -228,14 +228,29 @@ class CRM_Core_BAO_Setting extends CRM_Core_DAO_Setting { $domainID = NULL ) { + $override_group = array(); if (NULL !== ($override = self::getOverride($group, $name, NULL))) { - return $override; + if ( isset($name) ) { + return $override; + } + else { + $override_group = $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($override_group, 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, $override_group); + } + $cacheKey = self::setCache($values, $group, $componentID, $contactID, $domainID); } return $name ? CRM_Utils_Array::value($name, self::$_cache[$cacheKey], $defaultValue) : self::$_cache[$cacheKey]; @@ -1101,6 +1126,9 @@ AND domain_id = %3 if ($group && $name && isset($civicrm_setting[$group][$name])) { return $civicrm_setting[$group][$name]; } + else if ($group && !isset($name) && isset($civicrm_setting[$group])) { + return $civicrm_setting[$group]; + } else { return $default; } diff --git a/tests/phpunit/CRM/Core/BAO/SettingTest.php b/tests/phpunit/CRM/Core/BAO/SettingTest.php index 13a67d73ca..a4a37e5be4 100644 --- a/tests/phpunit/CRM/Core/BAO/SettingTest.php +++ b/tests/phpunit/CRM/Core/BAO/SettingTest.php @@ -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); } /** -- 2.25.1