2011-01-17 2 views
28

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

Я уверен, что сценарий даже не вызывается, потому что я положил 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(); 

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

+0

Пожалуйста, пост местоположения вашего скрипта установки –

+0

/app/code/local/Nie/Nie/sql/nie_setup/mysql4-install-0.0.1.php –

+2

Убедитесь, что корпус вашего имени модуля внутри имеет то же самое в качестве вашего в настройках ресурсов. Я просто столкнулся с этим вопросом. –

ответ

67

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

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

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

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

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

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

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

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

+3

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

+2

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

+0

Я бы согласился с sparcksoft о том, что Magento так не работает, даже запись в файл журнала будет стоить усилий. Мне все еще не нравится, как Magento будет слепо устанавливать все, что соответствует без какой-либо контрольной суммы. Кроме того, только один совет больше не понимает, что вы можете использовать '.sql' вместо' .php' для ваших установочных файлов, если вы просто делаете необработанный SQL на обновлениях/установках. – B00MER

1

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

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

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

+0

Я пытался изменить номер версии и не запускал скрипт. Он просто изменил номер версии в таблице core_resources. –

+0

Некоторые более очевидные вопросы: ваш скрипт обновления внутри dll sql/nie_setup? ваш модуль dir - app/code/local/Nie/Nie? –

+0

Yup. Оба находятся там. –

3

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

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

+1

+1 к записи удаления из core_resources – Populus

12

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

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

+0

Следует отметить, что живая отладка невозможна, если на базе кода используется модуль jon jbbbbish (что многие плохо разработанные сторонние модули требуется). –

0

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

1

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

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

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

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

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

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

5

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

+0

Ничего себе это правда ... необъяснимый тоже ... – JonaPkr

+0

spot on mateyyy – surfer190

3

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

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

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

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