SettingsManager::getSystemDefaults() - Return defaults even for critical boot settings
authorTim Otten <totten@civicrm.org>
Thu, 17 Sep 2015 05:59:05 +0000 (22:59 -0700)
committerTim Otten <totten@civicrm.org>
Thu, 17 Sep 2015 22:49:33 +0000 (15:49 -0700)
This fixes some issues in tests involving enableComponents.

Upshot: The UI for setting URLs/directories now displays the default values properly.

CRM/Core/Config/MagicMerge.php
Civi/Core/Paths.php
Civi/Core/SettingsBag.php
Civi/Core/SettingsManager.php
settings/Core.setting.php
settings/Directory.setting.php
settings/Url.setting.php

index 9b01f258254b3e5378d392931b85b8f0f8bae24f..4268abd1c936d76ffc64d9d44c9fb1f658f862c3 100644 (file)
@@ -165,18 +165,18 @@ class CRM_Core_Config_MagicMerge {
       'templateCompileDir' => array('runtime'),
       'templateDir' => array('runtime'),
 
-      'customFileUploadDir' => array('setting-path', NULL, '[civicrm.files]/custom/', array('mkdir', 'restrict')),
+      'customFileUploadDir' => array('setting-path', NULL, array('mkdir', 'restrict')),
       'customPHPPathDir' => array('setting-path'),
       'customTemplateDir' => array('setting-path'),
       'extensionsDir' => array('setting-path'),
-      'imageUploadDir' => array('setting-path', NULL, '[civicrm.files]/persist/contribute/', array('mkdir')),
-      'uploadDir' => array('setting-path', NULL, '[civicrm.files]/upload/', array('mkdir', 'restrict')),
+      'imageUploadDir' => array('setting-path', NULL, array('mkdir')),
+      'uploadDir' => array('setting-path', NULL, array('mkdir', 'restrict')),
 
       'customCSSURL' => array('setting-url-abs'),
       'extensionsURL' => array('setting-url-abs'),
-      'imageUploadURL' => array('setting-url-abs', NULL, '[civicrm.files]/persist/contribute/'),
-      'resourceBase' => array('setting-url-rel', 'userFrameworkResourceURL', '[civicrm]/.'),
-      'userFrameworkResourceURL' => array('setting-url-abs', NULL, '[civicrm]/.'),
+      'imageUploadURL' => array('setting-url-abs'),
+      'resourceBase' => array('setting-url-rel', 'userFrameworkResourceURL'),
+      'userFrameworkResourceURL' => array('setting-url-abs'),
 
       'geocodeMethod' => array('callback', 'CRM_Utils_Geocode', 'getProviderClass'),
       'defaultCurrencySymbol' => array('callback', 'CRM_Core_BAO_Country', 'getDefaultCurrencySymbol'),
@@ -199,18 +199,15 @@ class CRM_Core_Config_MagicMerge {
         return $this->getSettings()->get($name);
 
       case 'setting-path':
-        // Array(0 => $type, 1 => $setting, 2 => $default, 3 => $actions).
+        // Array(0 => $type, 1 => $setting, 2 => $actions).
         $value = $this->getSettings()->get($name);
-        if (empty($value) && isset($this->map[$k][2])) {
-          $value = $this->map[$k][2];
-        }
         $value = Civi::paths()->getPath($value);
         if ($value) {
           $value = CRM_Utils_File::addTrailingSlash($value);
-          if (isset($this->map[$k][3]) && in_array('mkdir', $this->map[$k][3])) {
+          if (isset($this->map[$k][2]) && in_array('mkdir', $this->map[$k][2])) {
             CRM_Utils_File::createDir($value);
           }
-          if (isset($this->map[$k][3]) && in_array('restrict', $this->map[$k][3])) {
+          if (isset($this->map[$k][2]) && in_array('restrict', $this->map[$k][2])) {
             CRM_Utils_File::restrictAccess($value);
           }
         }
@@ -218,20 +215,12 @@ class CRM_Core_Config_MagicMerge {
         return $value;
 
       case 'setting-url-abs':
-        // Array(0 => $type, 1 => $setting, 2 => $default).
         $value = $this->getSettings()->get($name);
-        if (empty($value) && isset($this->map[$k][2])) {
-          $value = $this->map[$k][2];
-        }
         $this->cache[$k] = Civi::paths()->getUrl($value, 'absolute');
         return $this->cache[$k];
 
       case 'setting-url-rel':
-        // Array(0 => $type, 1 => $setting, 2 => $default).
         $value = $this->getSettings()->get($name);
-        if (empty($value) && isset($this->map[$k][2])) {
-          $value = $this->map[$k][2];
-        }
         $this->cache[$k] = Civi::paths()->getUrl($value, 'relative');
         return $this->cache[$k];
 
index a9d4d6e1656645feb6773f1f5c02086108ff4e3d..230ea24254f9851585119333048e4df35e5025f9 100644 (file)
@@ -28,9 +28,9 @@ class Paths {
 
   public function __construct() {
     $this
-      ->register('civicrm', function () {
-        return \CRM_Core_Config::singleton()->userSystem->getCiviSourceStorage();
-      })
+      //->register('civicrm', function () {
+      //  return \CRM_Core_Config::singleton()->userSystem->getCiviSourceStorage();
+      //})
       ->register('civicrm.root', function () {
         return \CRM_Core_Config::singleton()->userSystem->getCiviSourceStorage();
       })
@@ -121,9 +121,9 @@ class Paths {
    */
   public function getUrl($value, $preferFormat = 'relative', $ssl = NULL) {
     $defaultContainer = self::DEFAULT_URL;
-    if ($value && $value{0} == '[' && preg_match(';^\[([a-zA-Z0-9\._]+)\]/(.*);', $value, $matches)) {
+    if ($value && $value{0} == '[' && preg_match(';^\[([a-zA-Z0-9\._]+)\](/(.*))$;', $value, $matches)) {
       $defaultContainer = $matches[1];
-      $value = $matches[2];
+      $value = empty($matches[3]) ? '.' : $matches[3];
     }
 
     if (empty($value)) {
index 3448b32b8fa031d73ecc3cead7cd9e94f4fe048a..73b820fb568bf1922a20dfabb53d32a430192c05 100644 (file)
@@ -80,8 +80,6 @@ class SettingsBag {
    */
   protected $values;
 
-  protected $filteredValues;
-
   /**
    * @param int $domainId
    *   The domain for which we want settings.
@@ -92,7 +90,6 @@ class SettingsBag {
     $this->domainId = $domainId;
     $this->contactId = $contactId;
     $this->values = array();
-    $this->filteredValues = array();
     $this->combined = NULL;
   }
 
@@ -105,7 +102,6 @@ class SettingsBag {
    */
   public function loadDefaults($defaults) {
     $this->defaults = $defaults;
-    $this->filteredValues = array();
     $this->combined = NULL;
     return $this;
   }
@@ -119,7 +115,6 @@ class SettingsBag {
    */
   public function loadMandatory($mandatory) {
     $this->mandatory = $mandatory;
-    $this->filteredValues = array();
     $this->combined = NULL;
     return $this;
   }
@@ -276,7 +271,6 @@ class SettingsBag {
   public function set($key, $value) {
     $this->setDb($key, $value);
     $this->values[$key] = $value;
-    unset($this->filteredValues[$key]);
     $this->combined = NULL;
     return $this;
   }
index 7194da1a7bfacfdaba40decddcfc204205892731..fe47d5e41ddfb40fe53ffafb9e89d9a0ef6c1157 100644 (file)
@@ -202,7 +202,7 @@ class SettingsManager {
    */
   protected function getDefaults($entity) {
     if (!$this->useDefaults) {
-      return array();
+      return self::getSystemDefaults($entity);
     }
 
     $cacheKey = 'defaults:' . $entity;
@@ -215,6 +215,7 @@ class SettingsManager {
       foreach ($specs as $key => $spec) {
         $defaults[$key] = \CRM_Utils_Array::value('default', $spec);
       }
+      \CRM_Utils_Array::extend($defaults, self::getSystemDefaults($entity));
       $this->cache->set($cacheKey, $defaults);
     }
     return $defaults;
@@ -307,7 +308,7 @@ class SettingsManager {
       $bag->loadMandatory($this->getMandatory('domain'));
     }
 
-    foreach ($this->bagsByDomain as $bag) {
+    foreach ($this->bagsByContact as $bag) {
       /** @var SettingsBag $bag */
       $bag->loadValues();
       $bag->loadDefaults($this->getDefaults('contact'));
@@ -317,4 +318,32 @@ class SettingsManager {
     return $this;
   }
 
+  /**
+   * Get a list of critical system defaults.
+   *
+   * The setting system can be modified by extensions, which means that it's not fully available
+   * during bootstrap -- in particular, defaults cannot be loaded. For a very small number of settings,
+   * we must define defaults before the system bootstraps.
+   *
+   * @return array
+   */
+  private static function getSystemDefaults($entity) {
+    $defaults = array();
+    switch ($entity) {
+      case 'domain':
+        $defaults = array(
+          'enable_components' => array('CiviEvent', 'CiviContribute', 'CiviMember', 'CiviMail', 'CiviReport', 'CiviPledge'),
+          'customFileUploadDir' => '[civicrm.files]/custom/',
+          'imageUploadDir' => '[civicrm.files]/persist/contribute/',
+          'uploadDir' => '[civicrm.files]/upload/',
+          'imageUploadURL' => '[civicrm.files]/persist/contribute/',
+          'resourceBase' => '[civicrm.root]/',
+          'userFrameworkResourceURL' => '[civicrm.root]/',
+        );
+        break;
+
+    }
+    return $defaults;
+  }
+
 }
index 68d8e18f0253c270d0725c2fb20a29db29007d05..571e8a378dcee406107b02820620248ec25d5f29 100644 (file)
@@ -662,6 +662,7 @@ return array(
     'help_text' => NULL,
   ),
   'enable_components' => array(
+    'bootstrap_comment' => 'This is a boot setting which may be loaded during bootstrap. Defaults are loaded via SettingsBag::getSystemDefaults().',
     'group_name' => 'CiviCRM Preferences',
     'group' => 'core',
     'name' => 'enable_components',
@@ -673,7 +674,7 @@ return array(
       'style' => 'width:150px',
       'class' => 'advmultiselect',
     ),
-    'default' => array('CiviEvent', 'CiviContribute', 'CiviMember', 'CiviMail', 'CiviReport', 'CiviPledge'),
+    'default' => NULL,
     'add' => '4.4',
     'title' => 'Enable Components',
     'is_domain' => '1',
index 7296bce7c91d66f86b6b93b2700e785ff4ba847e..069d37e024a290b10f44dc5256dbbf6be0da07ed 100644 (file)
@@ -38,7 +38,7 @@
 
 return array(
   'uploadDir' => array(
-    'bootstrap_comment' => 'This is a boot setting which may be loaded during bootstrap. Defaults and other metadata may not be available during bootstrap.',
+    'bootstrap_comment' => 'This is a boot setting which may be loaded during bootstrap. Defaults are loaded via SettingsBag::getSystemDefaults().',
     'group_name' => 'Directory Preferences',
     'group' => 'directory',
     'name' => 'uploadDir',
@@ -54,7 +54,7 @@ return array(
     'help_text' => 'File system path where temporary CiviCRM files - such as import data files - are uploaded.',
   ),
   'imageUploadDir' => array(
-    'bootstrap_comment' => 'This is a boot setting which may be loaded during bootstrap. Defaults and other metadata may not be available during bootstrap.',
+    'bootstrap_comment' => 'This is a boot setting which may be loaded during bootstrap. Defaults are loaded via SettingsBag::getSystemDefaults().',
     'group_name' => 'Directory Preferences',
     'group' => 'directory',
     'name' => 'imageUploadDir',
@@ -70,7 +70,7 @@ return array(
     'help_text' => NULL,
   ),
   'customFileUploadDir' => array(
-    'bootstrap_comment' => 'This is a boot setting which may be loaded during bootstrap. Defaults and other metadata may not be available during bootstrap.',
+    'bootstrap_comment' => 'This is a boot setting which may be loaded during bootstrap. Defaults are loaded via SettingsBag::getSystemDefaults().',
     'group_name' => 'Directory Preferences',
     'group' => 'directory',
     'name' => 'customFileUploadDir',
@@ -86,7 +86,7 @@ return array(
     'help_text' => NULL,
   ),
   'customTemplateDir' => array(
-    'bootstrap_comment' => 'This is a boot setting which may be loaded during bootstrap. Defaults and other metadata may not be available during bootstrap.',
+    'bootstrap_comment' => 'This is a boot setting which may be loaded during bootstrap. Defaults are loaded via SettingsBag::getSystemDefaults().',
     'group_name' => 'Directory Preferences',
     'group' => 'directory',
     'name' => 'customTemplateDir',
@@ -102,7 +102,7 @@ return array(
     'help_text' => NULL,
   ),
   'customPHPPathDir' => array(
-    'bootstrap_comment' => 'This is a boot setting which may be loaded during bootstrap. Defaults and other metadata may not be available during bootstrap.',
+    'bootstrap_comment' => 'This is a boot setting which may be loaded during bootstrap. Defaults are loaded via SettingsBag::getSystemDefaults().',
     'group_name' => 'Directory Preferences',
     'group' => 'directory',
     'name' => 'customPHPPathDir',
@@ -118,7 +118,7 @@ return array(
     'help_text' => NULL,
   ),
   'extensionsDir' => array(
-    'bootstrap_comment' => 'This is a boot setting which may be loaded during bootstrap. Defaults and other metadata may not be available during bootstrap.',
+    'bootstrap_comment' => 'This is a boot setting which may be loaded during bootstrap. Defaults are loaded via SettingsBag::getSystemDefaults().',
     'group_name' => 'Directory Preferences',
     'group' => 'directory',
     'name' => 'extensionsDir',
index 21db6495ca9d9fe6903ebe321c6cb8b81321b545..886e218beb7337fb0c12ea4cc299492fc3725194 100644 (file)
@@ -37,7 +37,7 @@
  */
 return array(
   'userFrameworkResourceURL' => array(
-    'bootstrap_comment' => 'This is a boot setting which may be loaded during bootstrap. Defaults and other metadata may not be available during bootstrap.',
+    'bootstrap_comment' => 'This is a boot setting which may be loaded during bootstrap. Defaults are loaded via SettingsBag::getSystemDefaults().',
     'group' => 'url',
     'group_name' => 'URL Preferences',
     'name' => 'userFrameworkResourceURL',
@@ -54,7 +54,7 @@ return array(
     'validate_callback' => 'CRM_Utils_Rule::urlish',
   ),
   'imageUploadURL' => array(
-    'bootstrap_comment' => 'This is a boot setting which may be loaded during bootstrap. Defaults and other metadata may not be available during bootstrap.',
+    'bootstrap_comment' => 'This is a boot setting which may be loaded during bootstrap. Defaults are loaded via SettingsBag::getSystemDefaults().',
     'group' => 'url',
     'group_name' => 'URL Preferences',
     'title' => 'Image Upload URL',
@@ -71,7 +71,7 @@ return array(
     'validate_callback' => 'CRM_Utils_Rule::urlish',
   ),
   'customCSSURL' => array(
-    'bootstrap_comment' => 'This is a boot setting which may be loaded during bootstrap. Defaults and other metadata may not be available during bootstrap.',
+    'bootstrap_comment' => 'This is a boot setting which may be loaded during bootstrap. Defaults are loaded via SettingsBag::getSystemDefaults().',
     'group' => 'url',
     'group_name' => 'URL Preferences',
     'name' => 'customCSSURL',
@@ -88,7 +88,7 @@ return array(
     'validate_callback' => 'CRM_Utils_Rule::urlish',
   ),
   'extensionsURL' => array(
-    'bootstrap_comment' => 'This is a boot setting which may be loaded during bootstrap. Defaults and other metadata may not be available during bootstrap.',
+    'bootstrap_comment' => 'This is a boot setting which may be loaded during bootstrap. Defaults are loaded via SettingsBag::getSystemDefaults().',
     'group' => 'url',
     'group_name' => 'URL Preferences',
     'title' => 'Extension Resource URL',