Значение конфигурации по умолчанию для параметров сериализованного массива игнорируется
У меня есть расширение, которое добавляет панель в систему > Конфигурация, но внезапно в 1.9.3 оно игнорирует значения по умолчанию для настроек с помощью <backend_model>adminhtml/system_config_backend_serialized_array</backend_model>
. Таким образом, после установки настройки модуля пусты вместо того, чтобы настраивать данные по умолчанию.
У меня есть настройка, определенная в файле system.xml
, например:
<setting_name>
<label>My label</label>
<frontend_model>my/frontend_model</frontend_model>
<backend_model>adminhtml/system_config_backend_serialized_array</backend_model>
<sort_order>10</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>1</show_in_store>
<comment><![CDATA[...]]></comment>
</setting_name>
И в файле config.xml
я определил значения по умолчанию:
<correct_group_name>
<setting_name>a:1:{s:18:"_1450089283397_397";a:3:{s:4:"name";s:5:"pages";s:5:"label";s:5:"Pages";s:11:"hitsPerPage";s:1:"2";}}</setting_name>
</correct_group_name>
Это работает во всех версиях >=1.6.2 и <=1.9.2.1. Что-то изменилось в 1.9.3? Я не в состоянии найдите что-нибудь в заметках о релазе.
Спасибо за любую помощь или предложения.
P.S. Значения всех остальных настроек по умолчанию (например, ввод текста, поля выбора,...) работают правильно.
2 answers
После некоторых тестов я могу подтвердить, что это ошибка, введенная Magento 1.9.3.0 (см. Здесь: https://github.com/OpenMage/magento-mirror/commit/d48bebc211cc216aaf78bdf25d7f0b0143d6333b#diff-139e884940505308d9c796f5e3a78865 )
Примечание: это также влияет на SUPEE-8788
В качестве временного исправления я предлагаю следующее: скопируйте app/code/core/Mage/Adminhtml/Model/System/Config/Backend/Serialized.php
в app/code/local/Mage/Adminhtml/Model/System/Config/Backend/Serialized.php
и измените метод _afterLoad()
следующим образом:
protected function _afterLoad()
{
if (!is_array($this->getValue())) {
$serializedValue = $this->getValue();
$unserializedValue = false;
if (!empty($serializedValue)) {
try {
$unserializedValue = Mage::helper('core/unserializeArray')
->unserialize((string)$serializedValue);
} catch (Exception $e) {
Mage::logException($e);
}
}
$this->setValue($unserializedValue);
}
}
Другой вариант лежит в пределах вашего определенного <frontend_model>
, предоставляя данные там, если они не установлены - по крайней мере, это предотвращает предоставление другой отдельной модели.
class StackExchange_Workaround_Block_Adminhtml_Receptiontimes extends Mage_Adminhtml_Block_System_Config_Form_Field
{
protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element)
{
$this->setElement($element);
// Workaround for Magento bug within 1.9.3.x
// [Default configuration value for serialized_array settings is ignored](http://magento.stackexchange.com/questions/146978)
if (!$this->getElement()->getData('value')) {
$this->getElement()->setData('value', Mage::helper('workaround')->getArrayData());
}
Где getArrayData()
- это просто помощник, который вы, вероятно, также используете в другом месте для извлечения этих данных и возврата unserialize(Mage::getStoreConfig('workaround/arraydata'));