EC-CUBEのプラグイン作成 †以下、EC-CUBE3のプラグイン作成手順を記載する。
雛形の作成 †プラグインジェネレータを利用して雛形を作成する php app/console plugin:develop generate プラグインジェネレータはインタラクティブなモードで起動するようになっている。
全て入力して最後に y を入力すると、以下のようにファイルが生成される。 [confirm] Do you want to proceed? [y/n] : y [+]File system this files and folders were created. - /path_to_eccube_root/app/Plugin/TestPlugin01 - /path_to_eccube_root/app/Plugin/TestPlugin01/ServiceProvider - /path_to_eccube_root/app/Plugin/TestPlugin01/Controller - /path_to_eccube_root/app/Plugin/TestPlugin01/Form/Type - /path_to_eccube_root/app/Plugin/TestPlugin01/Resource/template/admin - /path_to_eccube_root/app/Plugin/TestPlugin01/config.yml - /path_to_eccube_root/app/Plugin/TestPlugin01/PluginManager.php - /path_to_eccube_root/app/Plugin/TestPlugin01/ServiceProvider/TestPlugin01ServiceProvider.php - /path_to_eccube_root/app/Plugin/TestPlugin01/Controller/ConfigController.php - /path_to_eccube_root/app/Plugin/TestPlugin01/Controller/TestPlugin01Controller.php - /path_to_eccube_root/app/Plugin/TestPlugin01/Form/Type/TestPlugin01ConfigType.php - /path_to_eccube_root/app/Plugin/TestPlugin01/Resource/template/admin/config.twig - /path_to_eccube_root/app/Plugin/TestPlugin01/Resource/template/index.twig - /path_to_eccube_root/app/Plugin/TestPlugin01/event.yml - /path_to_eccube_root/app/Plugin/TestPlugin01/TestPlugin01Event.php - /path_to_eccube_root/app/Plugin/TestPlugin01/LICENSE [+]Database Plugin information was added to table [DB.Plugin] (id=1) Plugin was created successfully ここまでやると、管理画面の [オーナーズストア] -> [プラグイン一覧] に作成したプラグインが表示され、プラグインの有効化/無効化ができる。 プラグインマネージャの作成 †app/Plugin/プラグイン名/PluginManager.php の各メソッドに、プラグインのインストール時やアンインストール時に行う処理を定義する事ができる。
ドキュメントには、以下の記載があり、マイグレーションを作成して PluginManager.php から呼び出すのが良いように見える。 以下、http://downloads.ec-cube.net/manual/v3/plugin.pdf より抜粋 # 注意 ServiceProviderの編集 †app/Plugin/プラグイン名/ServiceProvider 配下にサービスプロバイダーが生成されているので、これを必要に応じて編集する。 以下、生成直後の状態を記載する。 class TestPlugin01ServiceProvider implements ServiceProviderInterface { public function register(BaseApplication $app) { // プラグイン用設定画面 $app->match('/'.$app['config']['admin_route'].'/plugin/TestPlugin01/config', 'Plugin\TestPlugin01\Controller\ConfigController::index')->bind('plugin_TestPlugin01_config'); // 独自コントローラ $app->match('/plugin/testplugin01/hello', 'Plugin\TestPlugin01\Controller\TestPlugin01Controller::index')->bind('plugin_TestPlugin01_hello'); : : ※書き方は、FrontControllerProvider.php や AdminControllerProvider.php と同じ。 コントローラー、テンプレートの確認 †生成直後のコントローラ、テンプレートは以下のようになっている。 app/Plugin/TestPlugin01/Controller/TestPlugin01Controller.php (生成直後) class TestPlugin01Controller { /** * TestPlugin01画面 * * @param Application $app * @param Request $request * @return \Symfony\Component\HttpFoundation\Response */ public function index(Application $app, Request $request) { // add code... return $app->render('TestPlugin01/Resource/template/index.twig', array( // add parameter... )); } } app/Plugin/TestPlugin01/Resource/template/index.twig (生成直後) {# default_frame.twigを継承して共通のヘッダー、フッターを表示するにはdtb_page_layout に登録が必要 #} {% extends 'default_frame.twig' %} {% set body_class = 'testplugin01_page' %} {% block main %} <div class="row"> <div class="col-md-12"> <p class="text-danger">こんにちわ</p> </div> </div> {% endblock %} コントローラー、テンプレートの編集 †あとは ServiceProvider で定義したルーティング定義に従ってコントローラー、テンプレートを編集していくだけ。 app/Plugin/TestPlugin01/Controller/TestPlugin01Controller.php class TestPlugin01Controller { public function index(Application $app, Request $request) { $message = "こんにちわ!"; if ($app->isGranted('IS_AUTHENTICATED_FULLY')) { $Customer = $app['user']; $message .= $Customer->getName01() . $Customer->getName02() . "さん"; } else { $message .= "ゲストさん"; } return $app->render('TestPlugin01/Resource/template/index.twig', array( "message" => $message )); } } app/Plugin/TestPlugin01/Resource/template/index.twig {# default_frame.twigを継承して共通のヘッダー、フッターを表示するにはdtb_page_layout に登録が必要 #} {% extends 'default_frame.twig' %} {% set body_class = 'testplugin01_page' %} {% block main %} <div class="row"> <div class="col-md-12"> <p class="text-danger">{{ message }}</p> </div> </div> {% endblock %} これで、ログイン状態で /plugin/プラグイン名/hello にアクセスすると「こんにちわ!◯◯さん」と表示されるようになる。 共通のヘッダー、フッターを表示する場合 †default_frame.twigを継承して共通のヘッダー、フッターを表示する場合は dtb_page_layout にデータを登録する必要があるので、 app/Plugin/プラグイン名/PluginManager.php class PluginManager extends AbstractPluginManager { : : /** * プラグイン有効時の処理 * * @param $config * @param Application $app * @throws \Exception */ public function enable($config, Application $app) { $em = $app['orm.em']; $connection = $em->getConnection(); $connection->executeUpdate( "INSERT INTO dtb_page_layout (page_id, device_type_id, page_name, url, file_name, edit_flg, create_date, update_date)" . "VALUES (NULL, '10', 'テストプラグイン', 'plugin_TestPlugin01_hello', '/plugin/testplugin01/hello', '2', NOW(), NOW())" ); // ドキュメントには executeUpdate は非推奨と記載されている。※insert() などの組み込みメソッドを使えと書いてあるが、Doctrine の DateTime の扱いが良くわからん。 // migration の addSql で素のSQL書いて CURRENT_TIMESTAMP を記述した方が良い気がする。 // http://downloads.ec-cube.net/manual/v3/plugin.pdf //$connection->insert('dtb_page_layout', array( // 'page_id' => NULL, // 'device_type_id' => 10, // 'page_name' => 'テストプラグイン', // 'url' => 'plugin_TestPlugin01_hello', // 'file_name' => '/plugin/testplugin01/hello', // 'edit_flg' => '2', // 'create_date' => new \DateTime(), // 怒られる // 'update_date' => new \DateTime(), // 怒られる //)); } /** * プラグイン無効時の処理 * * @param $config * @param Application $app * @throws \Exception */ public function disable($config, Application $app) { $em = $app['orm.em']; $connection = $em->getConnection(); $connection->executeUpdate("delete from dtb_page_layout where url = 'plugin_TestPlugin01_hello'"); } : : } 管理画面のメニューに設定画面を追加する †ServiceProvider.php の register メソッドに以下の通り追加する。 app/Plugin/TestPlugin01/ServiceProvider/TestPlugin01ServiceProvider.php class TestPlugin01ServiceProvider implements ServiceProviderInterface { public function register(BaseApplication $app) { : : // 管理画面のメニューに追加 // ※設定画面のコントローラは app/Plugin/プラグイン名/Controller/ConfigController.php なので、必要に応じて処理を追加する。 $app['config'] = $app->share($app->extend('config', function ($config) { $config['nav'][4]['child'][] = array( // 0:商品管理、1:受注管理、2:会員管理、3:コンテンツ管理、4:設定、5:オーナーズストア 'id' => 'sample', 'name' => 'テストプラグイン', 'url' => 'plugin_TestPlugin01_config', // プラグイン用設定画面のurl ); return $config; })); } : : プラグインのパッケージング †アーカイブ時は以下の点に注意する。
cd app/Plugin/プラグイン名 tar -czf ~/プラグイン名.tar.gz * |