- 追加された行はこの色です。
- 削除された行はこの色です。
#author("2018-09-24T09:46:25+00:00","","")
#author("2018-09-24T11:34:51+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>)
** 共通のヘッダー、フッターを表示する場合 [#xb0f2277]
#html(<div style="padding-left:10px">)
default_frame.twigを継承して共通のヘッダー、フッターを表示する場合は dtb_page_layout にデータを登録する必要があるので、
PluginManager.php の enable 辺りでデータを登録しておく。
app/Plugin/プラグイン名/PluginManager.php
#mycode2(){{
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'");
}
:
:
}
}}
#html(</div>)
** 管理画面のメニューに設定画面を追加する [#bd265353]
#html(<div style="padding-left:10px">)
ServiceProvider.php の register メソッドに以下の通り追加する。
app/Plugin/TestPlugin01/ServiceProvider/TestPlugin01ServiceProvider.php
#mycode2(){{
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;
}));
}
:
:
}}
#html(</div>)
** プラグインのパッケージング [#r7ffddc8]
#html(<div style="padding-left:10px">)
アーカイブ時は以下の点に注意する。
- 形式は tar.gz とする。
- フォルダごとアーカイブしない。
#myterm2(){{
cd app/Plugin/プラグイン名
tar -czf ~/プラグイン名.tar.gz *
}}
#html(</div>)