今回はデータベースに関してです。
既存ページの変更/新規ページの追加のどちらのカスタマイズの場合でもデータベースに対してテーブルや項目の追加はよくある話です。
EC-CUBE3系の場合はプラグインにてカスタマイズを行うことを前提とするため、標準のデータベース構造を勝手に変更することは良いことではありません。
オフィシャルでもカスタマイズによるデータベース変更は標準のデータベースとは少し違う扱いをするように案内されています。
他のプラグインと競合させないためにも厳密に分ける必要があるのだと思います。
もちろんプラグインの作成時も例外ではありません。
(むしろ「プラグインの作成時にこそ」というべきでしょうか。)
ということでプラグイン作成時のデータベース周りを調べる必要があります。
とりあえずマイグレーションと云う機能を使うことは解ってはいるのですが・・・
まぁ、まずは進めて行きたいと思います。
・
・
・
出来ました。
とりあえず、以下の形式でデータベースの構築はできるようです。
■プラグインファイル
config.yml
PluginManager.php
Migration/Version20161218094000.php
▼config.yml
name: データベース追加のみのプラグイン code: NakwebTest006 version: 0.0.1
▼PluginManager.php
<?php /** * This file is part of EC-CUBE */ namespace Plugin\NakwebTest006; use Eccube\Plugin\AbstractPluginManager; class PluginManager extends AbstractPluginManager { public function install($config, $app) { // データベース作成 $this->migrationSchema( $app, __DIR__ . '/Migration', $config['code'] ); } public function uninstall($config, $app) { // データベース削除 $this->migrationSchema( $app, __DIR__ . '/Migration', $config['code'], 0 ); } public function enable($config, $app) { } public function disable($config, $app) { } public function update($config, $app) { } }
install と uninstall の処理としてデータベースの登録処理を設定しています。
migrationSchema の処理として次に指定する処理の「up」か「down」の処理を実行する形です。
▼Migration/Version20161218094000.php
※Migrationフォルダに保存しています。
<?php namespace DoctrineMigrations; use Doctrine\DBAL\Migrations\AbstractMigration; use Doctrine\DBAL\Schema\Schema; class Version20161218094000 extends AbstractMigration { public function up(Schema $schema) { // データベースの削除 $table = $schema->createTable('plg_nakweb_test006'); $table->addColumn('plg_test_id', 'integer'); $table->addColumn('test_name', 'text', array('notnull' => false)); $table->addColumn('test_data', 'text', array()); $table->setPrimaryKey(array('plg_test_id')); } public function down(Schema $schema) { // データベースの削除 $schema->dropTable('plg_nakweb_test006'); } }
作成するスキーマ名は「Version」+「yyyymmddHHiiss」+「.php」という形になります。
自動的に最新の定義を確認してくれる形なんかと思います。
内容自体は「$table->addColumn」の処理にて追加するようです。
バージョンアップなどの場合は項目の変更や削除も必要なのかと存じます。
既存データが存在する場合には注意が必要ですね。
なお、今回作成してデータベースに関しては エンティティを定義したり dcm.yml を定義することで仕様出来るようにしていきます。
この辺りは次回改めて調べて行きたいと思います。
ということで今回はここまでとさせて頂きます。