E-notice fix on serialized setting
authoreileen <emcnaughton@wikimedia.org>
Mon, 5 Apr 2021 22:18:45 +0000 (10:18 +1200)
committereileen <emcnaughton@wikimedia.org>
Mon, 5 Apr 2021 22:18:45 +0000 (10:18 +1200)
We do actually support settings declaring defaults for a serialized field as an array rather
than as a serialised string. However, this setting form, if used, will display an
e-notice in that case as it will still try to unserialize - this adds a simple check first

CRM/Admin/Form/SettingTrait.php

index 61b45298b3f26394f151c9366d225e474ed7e812..1dac8aadaccd64a4224e941e17e3d8639fbd4f19 100644 (file)
@@ -305,8 +305,8 @@ trait CRM_Admin_Form_SettingTrait {
     foreach (array_keys($this->_settings) as $setting) {
       $this->_defaults[$setting] = civicrm_api3('setting', 'getvalue', ['name' => $setting]);
       $spec = $this->getSettingsMetaData()[$setting];
-      if (!empty($spec['serialize'])) {
-        $this->_defaults[$setting] = CRM_Core_DAO::unSerializeField($this->_defaults[$setting], $spec['serialize']);
+      if (!empty($spec['serialize']) && !is_array($this->_defaults[$setting])) {
+        $this->_defaults[$setting] = CRM_Core_DAO::unSerializeField((string) $this->_defaults[$setting], $spec['serialize']);
       }
       if ($this->getQuickFormType($spec) === 'CheckBoxes') {
         $this->_defaults[$setting] = array_fill_keys($this->_defaults[$setting], 1);