#author("2018-09-24T09:46:25+00:00","","") * EC-CUBEのプラグイン作成 [#b4033cef] #setlinebreak(on); 以下、EC-CUBE3のプラグイン作成手順を記載する。 #contents -- 参考 --- プラグイン機構の仕様&br;http://downloads.ec-cube.net/manual/v3/plugin.pdf --- プラグインジェネレータの利用方法&br;https://doc.ec-cube.net/plugin_tutorial-generate ** 雛形の作成 [#g592e4f0] #html(<div style="padding-left:10px">) プラグインジェネレータを利用して雛形を作成する ※ https://doc.ec-cube.net/plugin_tutorial-generate#%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%AC%E3%83%BC%E3%82%BF%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9 #myterm2(){{ php app/console plugin:develop generate }} プラグインジェネレータはインタラクティブなモードで起動するようになっている。 以下を次々に入力して [Enter] を押下する。 - プラグインコードの入力 - プラグインバージョン - 作成者 - 旧バージョン(3.0.8以下)のサポート有無 - 共通イベント設定 - フロント、管理イベント設定 - orm.pathの設定 全て入力して最後に y を入力すると、以下のようにファイルが生成される。 ※ここでは、プラグインコード、プラグイン名とも TestPlugin01 として作成した。 #myterm2(){{ [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 }} ここまでやると、管理画面の [オーナーズストア] -> [プラグイン一覧] に作成したプラグインが表示される。 #html(</div>) ** プラグインマネージャの作成 [#w1f3d28e] #html(<div style="padding-left:10px">) app/Plugin/プラグイン名/PluginManager.php の各メソッドに、プラグインのインストール時やアンインストール時に行う処理を定義する事ができる。 |メソッド|説明|h |install|プラグインインストール時の処理| |uninstall|プラグイン削除時の処理| |enable|プラグイン有効時の処理| |disable|プラグイン無効時の処理| |update|プラグイン更新時の処理| ドキュメントには、以下の記載があり、マイグレーションを作成して PluginManager.php から呼び出すのが良いように見える。 以下、http://downloads.ec-cube.net/manual/v3/plugin.pdf より抜粋 #html(<div style="padding:5px 10px; border:2px solid #090;display:inline-block;">) # 注意 Installのタイミングでは、プラグインはまだロードされておらず、ServiceProviderで行う ルーティング定義やレポジトリ定義は利用できません。そのため、enableでマイグレーシ ョンを実行しています。 #html(</div>) #html(</div>) ** ServiceProviderの編集 [#b5b6c018] #html(<div style="padding-left:10px">) app/Plugin/プラグイン名/ServiceProvider 配下にサービスプロバイダーが生成されているので、これを必要に応じて編集する。 ※register に記述を追加する事でルーティング定義を行う事ができる。 以下、生成直後の状態を記載する。 #mycode2(){{ 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 と同じ。 #html(</div>) ** コントローラー、テンプレートの確認 [#ab2d9a15] #html(<div style="padding-left:10px">) 生成直後のコントローラ、テンプレートは以下のようになっている。 ※プラグインを有効化して /plugin/プラグイン名/hello にアクセスすると、”&color(red){こんにちわ};” という画面が表示される。 app/Plugin/TestPlugin01/Controller/TestPlugin01Controller.php (生成直後) #mycode2(){{ 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 (生成直後) #mycode2(){{ {# 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 %} }} #html(</div>) ** コントローラー、テンプレートの編集 [#cefcab12] #html(<div style="padding-left:10px">) あとは ServiceProvider で定義したルーティング定義に従ってコントローラー、テンプレートを編集していくだけ。 ここでは、ログイン済みの場合は、ユーザ名を表示するように弄ってみる。 app/Plugin/TestPlugin01/Controller/TestPlugin01Controller.php  #mycode2(){{ 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 #mycode2(){{ {# 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 にアクセスすると「こんにちわ!◯◯さん」と表示されるようになる。 #html(</div>) ** プラグインのパッケージング [#r7ffddc8] #html(<div style="padding-left:10px">) アーカイブ時は以下の点に注意する。 - 形式は tar.gz とする。 - フォルダごとアーカイブしない。 #myterm2(){{ cd app/Plugin/プラグイン名 tar -czf ~/プラグイン名.tar.gz * }} #html(</div>)