Установив конфигурацию веб-сайта пустой, Magento использует значение по умолчанию


Magento, похоже, не нравится, когда я устанавливаю пустые значения конфигурации на уровне website или store.

Шаги по воспроизведению (1.6.2.0, 1.7.0.1, 1.7.0.2)

1) change config scope to website
2) untick use default next to 'default welcome message'
3) clear the text in the field
4) save

На этом этапе Magento снова поставит галочку в поле использовать по умолчанию, однако оно сохранило мое пустое значение. В следующий раз, когда я сохраню эту страницу конфигурации, будет использовано значение конфигурации с уровня по умолчанию.

Эта функциональность отсутствовала в версии 1.4, и у меня нет версии 1.5 для тестирования.

Мой вопрос в том, как мне создать пустые значения конфигурации на уровне веб-сайта или магазина?


Обновление

В версии 1.7.02 код выглядит так:

            $path = (string)$element->config_path;
            if (empty($path)) {
                $path = $section->getName() . '/' . $group->getName() . '/' . $fieldPrefix . $element->getName();
            } elseif (strrpos($path, '/') > 0) {
                // Extend config data with new section group
                $groupPath = substr($path, 0, strrpos($path, '/'));
                if (!isset($configDataAdditionalGroups[$groupPath])) {
                    $this->_configData = $this->_configDataObject->extendConfig(
                        $groupPath,
                        false,
                        $this->_configData
                    );
                    $configDataAdditionalGroups[$groupPath] = true;
                }
            }

И он использует empty() для оценки строки.

Есть ли у кого-нибудь предложение изменить этот код, чтобы разрешить пустым строкам, которые я указываю, переопределять значение по умолчанию?

Author: Aasim Goriya, 2013-04-03

1 answers

Проблема возникает отсюда:
Mage_Adminhtml_Block_System_Config_Form::initFields()

[ Для Magento 1.7.0.0]
В строке 295 есть такой фрагмент кода:

if (isset($this->_configData[$path])) {
    $data = $this->_configData[$path];
    $inherit = false;
} else {
    $data = $this->_configRoot->descend($path);
    $inherit = true;
}

Это определяет, установлен ли флажок "Использовать веб-сайт/Использовать значение по умолчанию" или нет. Проблема в том, что когда значение пустое, $this->_configData[$path] равно null. И функция isset() возвращает true только в том случае, если параметр существует и не равен нулю.
Если вы замените
if (isset($this->_configData[$path])) {
с
if (array_key_exists($path, $this->_configData)) {
это должно сработать.

[ Для Магенто 1.7.0.2]
В версии 1.7.0.2 код сверху был перенесен в Mage_Adminhtml_Model_Config_Data::getConfigDataValue()

Это похожий фрагмент кода, и решение то же самое:
В строке 388 есть следующее:

if (isset($configData[$path])) {

Это следует заменить следующим:

if (array_key_exists($path, $configData)) {
 3
Author: Marius, 2013-04-05 07:16:24