Конфигурация магазина Magento - получить массив
У меня есть коллекция связанных конфигураций, которые я хотел бы получить в виде массива. Используя конфигурацию хранилища, я не вижу, что это возможно.
Для примера я хочу следующее:
array('myvals' =>
array('key1' => 'val1'), array('key1' => 'val2', 'key1' => 'val3'),
)
Но я хочу, чтобы это управлялось с помощью конфигурации хранилища и извлекалось с помощью Mage::getStoreConfig('myvals');
Возможно ли это в любом случае?
2 answers
Вы не можете создавать этот тип многомерных массивов в конфигурации хранилища. Если вы хотите сохранить массив в store_config, вам нужно будет сериализовать их, используя серверную модель для поля, которое вы хотите сохранить:
<backend_model>adminhtml/system_config_backend_serialized_array</backend_model>
С помощью этого бэкенда вы можете создать свою собственную модель интерфейса, которая расширяет Mage_Adminhtml_Block_System_Config_Form_Field_Array_Abstract
, здесь вы можете определить свои собственные поля, которые вам нужны (по умолчанию могут быть созданы только текстовые вводы). При сохранении это создаст массив, который будет храниться сериализованным в базе данных, поэтому при чтении значения, которое вам нужно будет отменить, это:
$myvals = unserialize(Mage::getStoreConfig('myvals'));
ОБНОВЛЕНИЕ: Если вам не нужны внутренние поля ввода, вы также можете сохранить их самостоятельно (и вы должны иметь возможность использовать многомерность):
Mage::getConfig()->saveConfig('myvals',serialize($myvals));
В Magento нет стандартного способа сделать это. Вам придется написать собственный код. Вы можете использовать пользовательские запросы в таблице core_config_data
. Например, пользовательский модуль с методом getConfig()
, который выполняет этот запрос:
SELECT * FROM core_config_data WHERE path LIKE 'myvals/%'
, А затем метод toArray()
, который разделяет результат с помощью explode('/', $row)
, чтобы вы могли использовать такой код:
$vals = Mage::getModel('custom_config')->getConfig('myvals');
$val3 = $vals['key1'];
Но логически это не имеет большого смысла. Лучше иметь хороший дизайн с определенным количеством настраиваемых элементов. Если вы добавляете новые элементы конфигурации, вы все равно будете настраивать свой код.
Кстати, каков ваш вариант использования? Есть ли еще какая-то причина, кроме более красивого кода, по которой вам это нужно?