it-roy-ru.com

Мой скрипт установки расширения Magento не запустится

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

Я уверен, что сценарий даже не вызывается, потому что я поместил метод exit () в начале, и сайт работал нормально.

Вот что у меня есть в моем файле конфигурации XML. Это помещено в глобальный -> путь ресурсов:

<nie_setup>
    <setup>
        <module>Nie_Nie</module>
    </setup>
    <connection>
        <use>core_setup</use>
    </connection>
</nie_setup>

Мой скрипт установки выглядит следующим образом:

$installer = $this;
$setup = new Mage_Eav_Model_Entity_Setup('core_setup');
$installer->startSetup();

$setup->addAttribute('customer', 'nie_admin', array(
    'input'                 => 'text',
    'type'                  => 'text',
    'backend'               => '',
    'visible'               => 0,
    'required'          => 0,
    'user_defined'  => 1,
));

$installer->endSetup();

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

30
Josh Pennington

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

Как только вы это сделаете, из всего, что вы сказали в этой ветке вопросов, звучит так, будто ваш ресурс «установлен», но сценарий установки никогда не запускается. Я думаю, что номер версии, которую вы использовали в 

//0.0.1 is your version number
mysql4-install-0.0.1.php

не совпадает с версией вашего модуля

<modules>
    <Nie_Nie>
        <version>?.?.?</version>
    </Nie_Nie>
</modules>

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

В любом случае, вот как вы можете увидеть, какой файл (ы) magento пытается запустить, когда он запускает ваш установочный ресурс. Удалите все записи из core_resource, относящиеся к вашему модулю. Очистите кеш. Затем найдите следующие места в классе установки

app/code/core/Mage/Core/Model/Resource/Setup.php:

protected function _modifyResourceDb($actionType, $fromVersion, $toVersion)
{
    ... 

    $sqlFilesDir = Mage::getModuleDir('sql', $modName).DS.$this->_resourceName;        

    if (!is_dir($sqlFilesDir) || !is_readable($sqlFilesDir)) {
        return false;
    }

    ...

    $sqlDir->close();

    if (empty($arrAvailableFiles)) {
        return false;
    }

    ...

    $arrModifyFiles = $this->_getModifySqlFiles($actionType, $fromVersion, $toVersion, $arrAvailableFiles);
    if (empty($arrModifyFiles)) {
        return false;
    }

а затем измените их, чтобы добавить некоторые временные исключения отладки 

    if (!is_dir($sqlFilesDir) || !is_readable($sqlFilesDir)) {
        throw new Exception("$sqlFilesDir not found");
        return false;
    }

    ...

    if (empty($arrAvailableFiles)) {
        throw new Exception("No files found to run");
        return false;
    }

    ...

    $arrModifyFiles = $this->_getModifySqlFiles($actionType, $fromVersion, $toVersion, $arrAvailableFiles);
    if (empty($arrModifyFiles)) {
        throw new Exception("No valid upgrade files found to run for ");
        return false;
    }

    throw new Exception("If you're getting here, we have a file.  Remove your exceptions here and place one in your installer to make sure it's the one you think it is.");

Перезагрузите страницу, и вы получите сообщение об исключении с жалобами на то, что Magento не может найти. Этого должно быть достаточно, чтобы помочь вам отследить, какой установочный скрипт Magento пытается запустить, но не может найти. Просто не забудьте удалить строку вашего модуля в core_resource и очистить кеш. (Magento кеширует, какие модули нужно проверить для установки/обновления)

Если это не сработает, начните копаться в логике applyAllDataUpdates и выясните, почему класс не включает ваш файл установщика. 

70
Alan Storm

Самый простой и информативный способ отследить эту ошибку - настроить IDE для отладки Magento и установить точку останова в вашем mysql4-install-0.0.1.php. Если точка останова не была достигнута, то вы знаете, есть ли проблема в вашей конфигурации XML. Если точка останова попала в цель, вы можете проследить код, чтобы найти источник ошибки. 

На настройку может уйти полдня, но отладка Magento в реальном времени, безусловно, лучший способ выучить и понять код. Сделайте себе одолжение, сделайте инвестиции сейчас. 

14
Jonathan Day

Когда я столкнулся с этой проблемой, мне фактически пришлось отключить кеш. Просто смывание это не помогло по любой причине.

12
Björn Tantau

Согласно База знаний Magento вы можете попробовать включить тег <class> в свой <setup>. Таким образом, вы можете убедиться, что используется правильная модель установки, и (если она зашла так далеко) передает модель в сценарий установки, что исключает необходимость создания $setup вручную.

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

3
clockworkgeek

Вы можете проверить в Magento, какие модули загружены и какая версия этого модуля загружена:

  1. Перейти к app/code/core/Mage/Core/Model/Resource/Setup.php
  2. Перейти к функции __construct()
  3. В конце функции напишите:

    Mage::log($modName); Mage::log($this->_moduleConfig);

Он будет регистрировать все модули, загруженные с номером версии. Здесь вы можете проверить, загружен ваш модуль или нет.

3
Arvind Bhardwaj

Вы должны изменить версию вашего модуля на одну точку вверх, чтобы ваш скрипт обновления выполнялся.

<modules>
    <Nie_Nie>
        <version>1.5.0.0</version>
    </Nie_Nie>
</modules>

Если эта версия равна версии ресурса из таблицы core_resources, скрипт обновления не будет выполнен. И версия должна соответствовать названию вашего скрипта обновления

2
Eugene Tulika

У нас была такая же проблема для нашего магазина http://www.looxis.de Чтобы обновить используемое расширение, мы передали все файлы через FTP, но база данных не обновлялась сама после очистки кеш. Таким образом, обновленное расширение не удалось запустить, мы не смогли войти в бэкэнд.

В поисках решения мы нашли эту страницу.

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

когда мы попытались обновить модуль, который теперь был совместим с другим расширением (конфликт был удален), скрипт обновления sql не запускался.

Это было связано с таблицей "core_resources". там номер версии модуля был установлен на самую новую версию, которую мы установили за несколько недель до этого - поэтому magento не узнает, что новое обновление было выполнено снова, предполагая, что самая новая версия уже была там.

Мы вручную изменили номер версии на более низкую версию, и boom запустил скрипт обновления, и все работало нормально!

1
Etienne Renaud

Убедитесь, что вы проверили файл вашего приложения/etc/modules, убедитесь, что имя вашего модуля является точным и что кодовый пул точно указан.

0
Coolster