Magento2 エクステンションの作成 その1
1. 概要
Magento2 エクステンションのサンプルのサンプルをベースに基本的なエクステンションの作成方法を説明していく。
完成形は https://github.com/kztomita/magento-module-topic を参照。
対象Magentoのバージョンは2.2系。
2. 空のエクステンションを作成
まずは、空のエクステンションを作成しMagentoに登録をする。
モジュール名はBitHive_Topicなので、app/code/以下にBitHive/Topicディレクトリを作成し、Topicディレクトリ配下にregistration.phpファイルとetc/module.xmlを作成する。
registration.php
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'BitHive_Topic',
__DIR__
);
registration.phpで登録するモジュール名を'BitHive_Topic'を指定する。
etc/module.xml
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> <module name="BitHive_Topic" setup_version="1.0.0"> </module> </config>
module.xmlではモジュール名とバージョン番号を指定する。
現時点でTopic配下は以下のようになっている。
./registration.php ./etc/module.xml
この状態で以下のコマンドを実行し、モジュールを登録する。
# cd (Magentoのトップディレクトリ) # ./bin/magento module:enable BitHive_Topic # ./bin/magento setup:upgrade
正常に登録できていれば、module:statusでモジュール名が表示される。
# ./bin/magento module:status | grep Topic BitHive_Topic
3. テーブルの作成
次にDBにテーブルを作成する。このエクステンションでは、bithive_topic_postテーブルを一つだけ作成する。bithive_topic_postのテーブルの構造は以下のとおり。
bithive_topic_postのテーブルの構造
+----------+------------------+------+-----+---------------------+-------------------------------+ | Field | Type | Null | Key | Default | Extra | +----------+------------------+------+-----+---------------------+-------------------------------+ | post_id | int(10) unsigned | NO | PRI | NULL | auto_increment | | message | varchar(255) | YES | | NULL | | | date | timestamp | YES | MUL | NULL | | | created | timestamp | NO | | current_timestamp() | | | modified | timestamp | NO | | current_timestamp() | on update current_timestamp() | +----------+------------------+------+-----+---------------------+-------------------------------+
テーブルを作成するにはSetup/InstallSchema.phpファイルを作成する。bitive_topic_postテーブルを作成するInstallSchema.phpは次のとおり。このインストール処理は./bin/magento setup:upgrade実行時に実行される。
Setup/InstallSchema.php
<?php namespace BitHive\Topic\Setup; class InstallSchema implements \Magento\Framework\Setup\InstallSchemaInterface { public function install(\Magento\Framework\Setup\SchemaSetupInterface $setup, \Magento\Framework\Setup\ModuleContextInterface $context) { $installer = $setup; $installer->startSetup(); if (!$installer->tableExists('bithive_topic_post')) { $table = $installer->getConnection()->newTable( $installer->getTable('bithive_topic_post') ) ->addColumn( 'post_id', \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER, null, [ 'identity' => true, 'nullable' => false, 'primary' => true, 'unsigned' => true, ], 'Post ID' ) ->addColumn( 'message', \Magento\Framework\DB\Ddl\Table::TYPE_TEXT, 255, ['nullable => false'], 'Post Message' ) ->addColumn( 'date', \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP, null, ['nullable => false'], 'Date' ) ->addColumn( 'created', \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP, null, ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT], 'Created Time' ) ->addColumn( 'modified', \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP, null, ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT_UPDATE], 'Modified Time' ) ->addIndex( $installer->getIdxName('bithive_topic_post', ['date']), ['date'] ) ->setComment('News Table'); $installer->getConnection()->createTable($table); } $installer->endSetup(); } }
現時点でTopic配下は以下のようになっている。
./registration.php ./Setup/InstallSchema.php ./etc/module.xml
通常、モジュールをインストールする時は./bin/magento setup:upgradeを実行すればテーブルも作成されるが、ここでは、既に./bin/magento setup:upgradeを実行してモジュールをver.1.0.0で登録してしまっているため、setup:upgradeを実行してもテーブルは作成されない。このため、DBからモジュールの登録を削除してsetup:upgradeを実行することで、テーブルの作成処理を実行させる。
テーブルの作成
MySQLに接続して、一旦モジュールを削除 MariaDB [magento]> DELETE FROM setup_module WHERE module ='BitHive_Topic'; # ./bin/magento setup:upgrade これでテーブルが作成される MariaDB [magento]> show tables LIKE 'bithive_%'; +-------------------------------+ | Tables_in_magento (bithive_%) | +-------------------------------+ | bithive_topic_post | +-------------------------------+
開発中はテーブルの内容を変更したくなる時があるが、その場合、わざわざバージョン番号を上げていくのは無駄なので、上記のようにすればテーブルを再作成することができる。
とりあえずはここまで。次回はルートの作成。Magento2 エクステンションの作成 その2に続きます。