Как использовать сценарии установки для вашего модуля?


Я понимаю, что вы можете использовать сценарии установки для своего собственного модуля, объявив их в etc/config.xml файл вашего модуля в пространстве <global> вот так:

<resources>
    <catalog_setup>
        <setup>
            <module>Mage_Catalog</module>
            <class>Mage_Catalog_Model_Resource_Setup</class>
        </setup>
    </catalog_setup>
</resources>

Некоторые модули затем используют файл mysql4-install-0.0.1.php, в то время как другие используют install-0.0.1.php. Итак, когда я должен использовать mysql4 перед именем файла, а когда я его не использую?

Кроме того, что я могу сделать, если мой сценарий установки не запущен, чтобы выяснить, почему это не так?

Author: nukala satish, 2013-01-24

4 answers

Начиная с Magento 1.6 и выше, вам больше не нужно использовать mysql4 из-за добавленной поддержки нескольких СУБД.

Чтобы узнать, почему он не запускается, вы можете проверить исключение.журнал или system.log, возможно, Magento не смог найти ваш класс настройки. Однако создание сценария установки довольно просто.

Также проверьте руководство Алана Шторма: http://alanstorm.com/magento_setup_resources

 21
Author: Erfan, 2013-01-25 02:06:48

Как @erfan saif, magento получил поддержку нескольких СУБД с версии 1.6. Но в реальном мире я знаю только бэкэнды mysql.

Важно понимать, что magento может иметь разные сценарии установки/обновления/передачи данных для разных бэкэндов. Если вам нужен специальный тип индекса, который поддерживается mysql, но не стандартным SQL, вы можете реализовать mysql4-install-1.0.0.php сценарий. Если ваш сценарий является универсальным, используйте install-1.0.0.php

Если вы взглянете на Mage_Core_Model_Resource_Setup Я могу найти две интересные вещи:

  1. Вы можете назвать свои файлы (%s-)%s-ВЕРСИЯ.(php|sql)
  2. Если у вас есть два сценария установки (но со сценариями данных, это одно и то же (приложение/код/ядро/Маг/Ядро/Модель/Ресурс/Настройка.php:520)) magento предпочитает специализированный сценарий над общим сценарием (как и следовало ожидать)

Приложение/код/ядро/Маг/Ядро/Модель/Ресурс/Настройка.php:488

$regExpDb   = sprintf('#^%s-(.*)\.(php|sql)$#i', $actionType);
$regExpType = sprintf('#^%s-%s-(.*)\.(php|sql)$#i', $resModel, $actionType);

while (false !== ($file = $handlerDir->read())) {
    $matches = array();
    if (preg_match($regExpDb, $file, $matches)) {
        $dbFiles[$matches[1]] = $filesDir . DS . $file;
    } else if (preg_match($regExpType, $file, $matches)) {
        $typeFiles[$matches[1]] = $filesDir . DS . $file;
    }
}
[...]
foreach ($typeFiles as $version => $file) {
    $dbFiles[$version] = $file;
}

Будьте осторожны, если вы назовете свой скрипт .sql, это вызывается непосредственно в базу данных:

// app/code/core/Mage/Core/Model/Resource/Setup.php:621
switch ($fileType) {
    case 'php':
        $conn   = $this->getConnection();
        $result = include $fileName;
        break;
    case 'sql':
        $sql = file_get_contents($fileName);
        if (!empty($sql)) {

            $result = $this->run($sql);

Кроме того, что я могу сделать, если мой сценарий установки не запущен, чтобы выяснить, почему это не так?

Я предпочитаю штамп ('sadf') в начале моего файла установки/обновления, потому что я могу запустить его несколько раз, если он будет вызван, чтобы я мог проверить, все ли переменные, которые я установил, верны, прежде чем что-либо изменится в базе данных. Если я вижу "sadf" на экране, я знаю, что сценарий запущен.

Я загружаю magento (вместо sadf), пришло время отлаживать, мои две стандартные ошибки:

  1. Я забыл добавить скрипт в конфигурацию
  2. Я забыл каталог в sql/, например, sql/install-1.0.0.php вместо sql/my_module_setup/install-1.0.0.php

И поскольку я думаю, что это подходит здесь, будьте осторожны с именами ваших переменных: http://blog .fabian-blechschmidt.de/articles/file-kills-setup-script.html

ОБНОВЛЕНИЕ @rouven-rieker добавил через twitter, что данные - и отсутствующий mysql4 - были добавлены в magento 1.6. Если вам нужна обратная совместимость, будьте осторожны!

 11
Author: Fabian Blechschmidt, 2013-01-25 12:31:50

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

<modules>
    <Your_Module>
        <version>0.0.1</version>
    </Your_Module>
</modules> 
 3
Author: Anna Völkl, 2013-01-25 10:26:06

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

 1
Author: Petar Dzhambazov, 2013-01-25 14:10:11