Необычное поведение конфига Magento Store при установке пользовательского модуля - PullRequest
3 голосов
/ 23 ноября 2011

Существуют ли ограничения доступа к конфигурации магазина при установке пользовательского модуля в Magento? Вот проблема

У меня есть скрипт установки:

    <?php
    $installer = $this;
    $installer->startSetup();
    $installer->run("
    DROP TABLE IF EXISTS {$this->getTable('userpaymentban')};
    CREATE  TABLE IF NOT EXISTS {$this->getTable('userpaymentban')} (
      `ban_id` INT NOT NULL AUTO_INCREMENT ,
      `user_id` INT NOT NULL ,
      `paymentmethod_id` VARCHAR(200) NOT NULL ,
      `store_id` INT NOT NULL ,
      PRIMARY KEY (`ban_id`) )
    ENGINE = InnoDB
    DEFAULT CHARACTER SET = utf8
    COLLATE = utf8_general_ci;");
    $defaultNotBannedPaymentMethods = array();
    $paymentMethods = Mage::getSingleton('payment/config')->getAllMethods();

Запрос в порядке, но последняя строка вызывает выбрасывание чего-то странного:

    Error in file: "/var/www/magentotest/magento161/app/code/local/Alpha/Userpaymentban/sql/userpaymentban_setup/mysql4-install-0.1.0.php" - Warning: Invalid argument supplied for foreach()  in /var/www/magentotest/magento161/app/code/core/Mage/Payment/Model/Config.php on line 76

    #0 /var/www/magentotest/magento161/app/code/core/Mage/Core/Model/Resource/Setup.php(645): Mage::exception('Mage_Core', 'Error in file: ...')
    #1 /var/www/magentotest/magento161/app/code/core/Mage/Core/Model/Resource/Setup.php(421): Mage_Core_Model_Resource_Setup->_modifyResourceDb('install', '', '0.1.0')
    #2 /var/www/magentotest/magento161/app/code/core/Mage/Core/Model/Resource/Setup.php(327): Mage_Core_Model_Resource_Setup->_installResourceDb('0.1.0')
    #3 /var/www/magentotest/magento161/app/code/core/Mage/Core/Model/Resource/Setup.php(235): Mage_Core_Model_Resource_Setup->applyUpdates()
    #4 /var/www/magentotest/magento161/app/code/core/Mage/Core/Model/App.php(412): Mage_Core_Model_Resource_Setup::applyAllUpdates()
    #5 /var/www/magentotest/magento161/app/code/core/Mage/Core/Model/App.php(338): Mage_Core_Model_App->_initModules()
    #6 /var/www/magentotest/magento161/app/Mage.php(640): Mage_Core_Model_App->run(Array)
    #7 /var/www/magentotest/magento161/index.php(80): Mage::run('', 'store')
    #8 {main}

Исключение было сгенерировано в Mage_Payment_Model_Config в коде:

<code>    public function getAllMethods($store=null)
{
    $methods = array();
    $config = Mage::getStoreConfig('payment', $store);
echo "<pre>";
var_dump($config);
echo "
"; foreach ($ config как $ code => $ methodConfig) { $ data = $ this -> _ getMethod ($ code, $ methodConfig); if (false! == $ data) { $ method [$ code] = $ data; } } вернуть $ методы; }

Как видите, я уже добавил некоторый код отладки, но все, что я получаю от этого, это просто NULL

Мой Magento в порядке (я думаю), потому что когда я использую Mage::getSingleton('payment/config')->getAllMethods() вне области установки модуля (в файле с импортированным app/Mage.php), я получаю хороший список всех способов оплаты.

1 Ответ

9 голосов
/ 24 ноября 2011

Ха, я всегда ищу причины, оправдывающие существование data -установок / обновлений сценариев для моих учеников Magento U, и это еще один отличный пример.

Если вы посмотрите на процесс инициализации (начиная с Mage::run() в index.php), вы быстро придете к Mage_Core_Model_App::run(). Там вы увидите звонок на _initModules(). Именно из этого метода запускаются «обычные» сценарии установки / обновления (через Mage_Core_Model_Resource_Setup::applyAllUpdates()). Позже в Mage_Core_Model_App::run() происходит вызов Mage_Core_Model_Resource_Setup::applyAllDataUpdates(). Здесь запускаются сценарии data-install / data-upgrade, и сразу после объект хранилища инициализируется с помощью _initCurrentStore().

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

Эти сценарии запускаются / именуются так же, как и «обычные» сценарии установки / обновления, с той лишь разницей, что имена файлов mysql4-data-[install|upgrade]-[version(s)].php для CE <1.6 и EE <1.11. Начиная с версии 1.6 / 1.11, сценарии данных теряют префикс mysql4 и помещаются в папку <code>data в каталоге вашего модуля (см. Пример Mage_Catalog dir).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...