Мой Скрипт Установки Расширения 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();

Есть ли что-то очевидное, чего мне здесь не хватает, что могло бы стать причиной того, что сценарий не будет запущен?

Author: Josh Pennington, 2011-01-17

8 answers

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

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

//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 и выясните, почему класс не включает ваш установочный файл.

 69
Author: Alan Storm, 2018-09-17 09:42:15

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

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

 14
Author: Jonathan Day, 2017-05-23 10:31:07

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

 10
Author: Björn Tantau, 2015-11-26 09:47:38

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

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

 3
Author: clockworkgeek, 2011-01-21 23:05:18

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

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

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

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

 3
Author: Arvind Bhardwaj, 2015-12-25 12:04:58

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

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

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

 2
Author: Eugene Tulika, 2011-01-17 21:16:31

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

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

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

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

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

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

 1
Author: Etienne Renaud, 2013-08-01 10:22:37

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

 0
Author: Coolster, 2013-05-29 15:34:22