Magento: обновление логотипа магазина программно - PullRequest
1 голос
/ 19 марта 2010

Я заметил, что Magento сохраняет URL-адрес логотипа, который он использует для каждого магазина, настроенного вами в таблице core_config_data.

Если я запускаю этот SQL:

SELECT * 
FROM core_config_data`
WHERE path = 'design/header/logo_src'

Я получаю список магазинов и их логотип. Я также получаю config_id и scope_id.

Я бы хотел иметь возможность программно обновлять эти логотипы за кулисами, но я не могу понять, как связать данные этой таблицы обратно с названием магазина.

config_id и store_id должны каким-то образом ссылаться на другую таблицу, которая устанавливает отношения. Модель EAV в Magento, тьфу:)

Есть идеи?

Ответы [ 3 ]

6 голосов
/ 19 марта 2010

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

Что касается установки переменных, это не так просто, как сказать «Я хочу установить переменную design / header / logo_src» на «это значение». Вам также необходимо указать, для какого веб-сайта вы сохраняете значения, и для какого магазина вы сохраняете значения.

Здесь важно быть осторожным. Я не смотрел вглубь системы, чтобы убедиться, что Magento обеспечивает гранулярность «показать для веб-сайта, показать для сайта» значений конфигурации на уровне бэк-энда / ресурса или только на уровне пользовательского интерфейса. Мои инстинкты говорят, что это позже, что означает, что вы можете в конечном итоге сохранить значение на уровне веб-сайта / магазина, которое не было предназначено для сохранения на этом уровне, и это может привести к страшному неопределенному поведению.

В версии 1.4 для сообщества вы можете увидеть, где Magento сохраняет значения конфигурации в следующем месте

File: app/code/core/Mage/Adminhtml/controllers/System/ConfigController.php

//around line 126
Mage::getModel('adminhtml/config_data')
    ->setSection($section)
    ->setWebsite($website)
    ->setStore($store)
    ->setGroups($groups)
    ->save();

Предупреждает, код для обновления только логотипа для верхнего уровня магазина / конфигурации веб-сайта будет.

//create a groups array that has the value we want at the rigth location
$groups_value = array();

$groups_value['header']['fields']['logo_src']['value'] = 'images/logo.gif'; 
Mage::getModel('adminhtml/config_data')
    ->setSection('design')
    ->setWebsite(null)
    ->setStore(null)
    ->setGroups($groups_value)
    ->save();   

Линия

Mage::getModel('adminhtml/config_data')

создает модель Magento.

'design' в методе setSection, а также строки 'header' и 'logo_src' соответствуют URI конфигурации

design/header/logo_src

Я почти уверен, что null переданы setWebsite и setStore, чтобы сообщить объекту, что вы сохраняете это значение на верхнем уровне. Вы также можете передать в магазине и идентификаторы сайта. (Я немного потрясен этим, но когда вы сохраняете логотип нормально, это то, что делает система)

'fields' и 'values' жестко закодированы. Цель объекта - сохранить сразу несколько значений конфигурации из всех групп в разделе.

Проверьте метод saveAction в вышеприведенном контроллере, если вам интересно.

4 голосов
/ 19 сентября 2011

Самый простой и короткий способ:

Mage::getConfig()->saveConfig('design/header/logo_src', $logo);
1 голос
/ 19 марта 2010

Спасибо за подробный ответ. Я действительно ценю это.

Я понял, что могу просто вставить новую запись, например:

INSERT INTO core_config_data (`scope`, `scope_id`, `path`, `value`) 
VALUES ('websites', $websiteId, 'design/header/logo_src', $logo);

Я проверил его, и он, кажется, добавляет другой логотип для магазина на странице конфигурации - дизайна, но когда я ссылаюсь на логотип по <?php echo $this->getLogoSrc() ?> в моем header.phtml , он все еще тянет логотип по умолчанию из конфигурации верхнего уровня.

Я думаю, что используя ваш пост в качестве руководства, я могу начать отладку с помощью Mage::log() и посмотреть, куда он меня приведет.

...