При разработке пользовательских модулей в Magento мне часто приходится сталкиваться с проблемами установки и обновления скриптов. Обычно эти проблемы возникают из-за ошибок в соглашении об именах, неправильных номеров версий или неправильного синтаксиса. В этом посте мы сосредоточимся конкретно на том, как написать безошибочные сценарии установки и обновления Magento.
Сценарий установки и обновления Magento является частью разработки модуля, поэтому перед прочтением этой статьи рекомендуется иметь базовые знания о разработке модуля.
Всякий раз, когда вы устанавливаете или создаете какой-либо новый модуль, который содержит взаимодействие с базой данных, вы найдете скрипт установки и обновления в каталоге кода этого модуля, который будет запускаться после нажатия на URL. Основные модули Magento также следуют той же структуре установки и обновления. Если вы хотите увидеть некоторые примеры, откройте app/code/core/Mage/Catalog/sql/ catalog_setup
. Здесь вы найдете несколько сценариев установки и обновления с соответствующими соглашениями об именах и номерами версий.
Установить скрипт
Чтобы запустить скрипт установки, нам нужно создать собственный модуль. Мы не собираемся создавать совершенно новый модуль, поскольку он выходит за рамки этой статьи; скорее мы предполагаем, что у нас есть уже созданный пользовательский модуль с именем пакета Sitepoint и именем модуля Articles, который хранит записи всех написанных статей в базе данных.
Для краткого руководства давайте определим основные компоненты модуля прямо здесь:
- Blocks: экземпляр класса шаблонов внешнего интерфейса. Шаблоны внешнего интерфейса напрямую используют функции класса.
- Модели: содержат бизнес-логику так же, как в типичном шаблоне MVC.
- Модели ресурсов: Push и Pull данных из таблиц базы данных.
- Контроллеры: загрузка блоков макетов при нажатии на URL.
- и т.д.: XML-файл содержит связанные с модулем конфигурации.
- Помощники: Как следует из названия, классы, содержащие функции, которые могут быть доступны во всех модулях в качестве помощника, независимо от области видимости модуля.
- sql: файл, содержащий сценарии обновления и установки базы данных для создания и обновления схемы базы данных.
Структура каталогов модуля должна быть такой, как показано ниже.
app --code ---local ----Sitepoint ------Articles --------Block --------controllers --------etc --------Model --------sql
Перейдите в app/code/local/Sitepoint/Articles/etc
и откройте файл config.xml
. Нам нужно добавить некоторую конфигурацию, связанную с расположением скрипта установки в этом файле. В config.xml
под global
тегом добавьте следующие дочерние теги следующим образом:
<global> <models> <articles> <class>Sitepoint_Articles_Model</class> <!-- Model class files --> <resourceModel>articles_mysql4</resourceModel> <!--Resource model --> </articles> <articles_mysql4> <class>Sitepoint_Articles_Model_Mysql4</class> <entities> <articles> <table>articles</table> <!-- Db table name --> </articles> </entities> </articles_mysql4> </models> <resources> <articles_setup> <setup> <module>Sitepoint_Articles</module> </setup> <connection> <use>core_setup</use> </connection> </articles_setup> <articles_write> <connection> <use>core_write</use> </connection> </articles_write> <articles_read> <connection> <use>core_read</use> </connection> </articles_read> </resources> </global>
Существует очень важный тег articles_setup
, который находится под тегом resources
, который сообщает Magento, что наши установочные файлы базы данных находятся в каталоге article_setup.
Перейдите в Articles/sql/articles_setup
и создайте скрипт установки mysql4-install-0.1.0.php
<?php $installer = $this; $installer->startSetup(); $installer->run("-- DROP TABLE IF EXISTS {$this->getTable('articles')}; CREATE TABLE {$this->getTable('articles')} ( `articles_id` int(11) unsigned NOT NULL auto_increment, `title` varchar(255) NOT NULL default '', `short_desc` text NOT NULL default '', `long_desc` text NOT NULL default '', `status` tinyint(2) NOT NULL default '0', `created_time` datetime NULL, `update_time` datetime NULL, PRIMARY KEY (`articles_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; "); $installer->endSetup();
Чтобы сделать наш скрипт совместимым между базами данных, вот альтернативный способ использования объекта DDL:
<?php $installer = $this; $installer->startSetup(); $table = $installer->getConnection()->newTable($installer->getTable('articles')) ->addColumn('articles_id', Varien_Db_Ddl_Table::TYPE_INTEGER, 11, array( 'unsigned' => true, 'nullable' => false, 'primary' => true, 'identity' => true, ), 'Article ID') ->addColumn('title', Varien_Db_Ddl_Table::TYPE_VARCHAR, 255, array( 'nullable' => false, 'default' => '', ), 'Title') ->addColumn('short_desc', Varien_Db_Ddl_Table::TYPE_TEXT, null, array( 'nullable' => false, 'default' => '', ), 'Short Desc') ->addColumn('long_desc', Varien_Db_Ddl_Table::TYPE_TEXT, null, array( 'nullable' => false, 'default' => '', ), 'Long Desc') ->addColumn('status', Varien_Db_Ddl_Table::TYPE_TINYINT, 2, array( 'nullable' => false, 'default' => '0', ), 'Status') ->addColumn('created_time', Varien_Db_Ddl_Table::TYPE_DATE, null, array( 'nullable' => true, 'default' => null, ), 'Created Date') ->addColumn('update_time', Varien_Db_Ddl_Table::TYPE_DATE, null, array( 'nullable' => true, 'default' => null, ), 'Update Date') ->setComment('Articles table'); $installer->getConnection()->createTable($table); $installer->endSetup();
Чтобы получить имя таблицы, мы используем $this->getTable('articles')
как он автоматически добавит префикс таблицы (настроенный в процессе установки Magento) к имени таблицы.
Номер версии следует за именем нашего установочного скрипта. Этот номер совпадает с определенным в файле config.xml
.
<modules> <Sitepoint_Articles> <version>0.1.0</version> <!-- Version of module --> </Sitepoint_Articles> </modules>
Номер версии сообщает Magento о последней версии скрипта установки. После настройки сценария установки обновите URL-адрес Magento и посмотрите базу данных. Если ваш скрипт установки успешно запущен, ваша таблица должна быть создана.
Теперь перейдите в редактор SQL и откройте таблицу core_resource
в базе данных Magento. Здесь вы можете увидеть запись вашего установочного скрипта с именем articles_setup
и номером версии 0.1.0.
Каждый раз, когда вы обновляете URL-адрес, Magento проверяет наличие запускаемых сценариев установки на основе номера версии в файле конфигурации и в таблице базы данных core_resource
. Если версии не совпадают, будет выполнен поиск соответствующего файла версии. Предположим, вы изменили версию на 0.1.1 в вашем config.xml
. Magento обнаружит, что ваша таблица core_resource
содержит номер версии 0.1.0 и, как вы упомянули новую версию, будет искать скрипт с номером версии 0.1.1.
Если он найдет этот файл в каталоге core_resource
, он запустит его и обновит номер версии до 0.1.1 в таблице core_resource
. Вот как работает скрипт установки и обновления. Все основные модули Magento соответствуют этой версии системы. Фактически, весь процесс обновления Magento следует той же самой процедуре.
Обратите внимание, что скрипт установки запускается только один раз — при его создании и обновлении URL-адреса. Если вы хотите изменить схему базы данных, вы можете сделать это с помощью сценария обновления. Ярлык должен удалить вашу запись установки из таблицы core_resource
и обновить ваш URL. Сценарий запустится снова, и ваши новые изменения будут отражены в таблице базы данных.
Скрипт обновления
Если вы хотите обновить свой модуль с точки зрения новых полей базы данных, чтобы обеспечить новую функциональность, вам нужно изменить свою схему, изменить типы данных полей, ввести новые столбцы и так далее.
Это когда скрипт обновления пригодится. Вы не можете вносить какие-либо прямые изменения с помощью редактора SQL, выполняя запросы строк, потому что всякий раз, когда другой пользователь устанавливает ваш модуль, это новое изменение базы данных не будет работать при их установке. Magento рекомендует использовать скрипт обновления для изменения схемы базы данных.
Сценарий обновления аналогичен сценарию установки — единственное изменение — это имя и другой номер версии. Давайте посмотрим на пример.
Предположим, мы хотим добавить еще один столбец и изменить другой столбец. Для этого мы создадим скрипт обновления с именем mysql4-upgrade-0.1.0-0.1.1.php
в Articles/sql/articles_setup
. Добавьте следующий код.
<?php $installer = $this; $installer->startSetup(); $installer->run(" ALTER TABLE {$this->getTable('articles')} CHANGE COLUMN `long_desc` `long_desc` text NULL, ADD COLUMN `sub_title` VARCHAR(45) NOT NULL AFTER `title`; "); $installer->endSetup();
Вот альтернативный способ сделать это с помощью DDL:
<?php $installer = $this; $installer->startSetup(); $installer->getConnection() ->changeColumn($installer->getTable('articles'), 'long_desc', 'long_desc', array( 'type' => Varien_Db_Ddl_Table::TYPE_TEXT, 'nullable' => true, )) ->addColumn($installer->getTable('articles'), 'sub_title', array( 'type' => Varien_Db_Ddl_Table::TYPE_VARCHAR, 'nullable' => false, 'comment' => 'Sub title' )); $installer->endSetup();
Теперь нам нужно сообщить Magento, что у нас готов новый скрипт обновления. Для этого нам нужно изменить номер версии в нашем файле config.xml
:
<modules> <Sitepoint_Articles> <version>0.1.1</version> <!-- Upgrade Version of module --> </Sitepoint_Articles> </modules>
Как только вы обновите свой URL, Magento обнаружит, что ваш файл config.xml
содержит более высокую версию, чем версия, хранящаяся в таблице core_resource
. Он будет искать сценарий обновления той же версии, а затем запустить его. После обновления URL-адреса вы сможете увидеть обновление схемы базы данных.
Вывод
Вот как работают скрипты установки и обновления Magento. Вы можете попробовать его, создав новый модуль и запустив сценарии — все, что мы здесь написали, доступно на Github . Если у вас возникли проблемы при разработке сценариев установки или обновления, не стесняйтесь упомянуть об этом в разделе комментариев, и мы обсудим это! Обратная связь приветствуется!