> EC-CUBEメモ

EC-CUBEのプラグイン作成

以下、EC-CUBE3のプラグイン作成手順を記載する。

雛形の作成

プラグインジェネレータを利用して雛形を作成する
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

php app/console plugin:develop generate

プラグインジェネレータはインタラクティブなモードで起動するようになっている。
以下を次々に入力して [Enter] を押下する。

  • プラグインコードの入力
  • プラグインバージョン
  • 作成者
  • 旧バージョン(3.0.8以下)のサポート有無
  • 共通イベント設定
  • フロント、管理イベント設定
  • orm.pathの設定

全て入力して最後に y を入力すると、以下のようにファイルが生成される。
※ここでは、プラグインコード、プラグイン名とも TestPlugin01 として作成した。

[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 の各メソッドに、プラグインのインストール時やアンインストール時に行う処理を定義する事ができる。

メソッド説明
installプラグインインストール時の処理
uninstallプラグイン削除時の処理
enableプラグイン有効時の処理
disableプラグイン無効時の処理
updateプラグイン更新時の処理

ドキュメントには、以下の記載があり、マイグレーションを作成して PluginManager.php から呼び出すのが良いように見える。

以下、http://downloads.ec-cube.net/manual/v3/plugin.pdf より抜粋

# 注意
Installのタイミングでは、プラグインはまだロードされておらず、ServiceProviderで行う
ルーティング定義やレポジトリ定義は利用できません。そのため、enableでマイグレーシ
ョンを実行しています。

ServiceProviderの編集

app/Plugin/プラグイン名/ServiceProvider 配下にサービスプロバイダーが生成されているので、これを必要に応じて編集する。
※register に記述を追加する事でルーティング定義を行う事ができる。

以下、生成直後の状態を記載する。

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 と同じ。

コントローラー、テンプレートの確認

生成直後のコントローラ、テンプレートは以下のようになっている。
※プラグインを有効化して /plugin/プラグイン名/hello にアクセスすると、”こんにちわ” という画面が表示される。

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 にデータを登録する必要があるので、
PluginManager.php の enable 辺りでデータを登録しておく。

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;
        }));
    }
    :
    :

プラグインのパッケージング

アーカイブ時は以下の点に注意する。

  • 形式は tar.gz とする。
  • フォルダごとアーカイブしない。
cd app/Plugin/プラグイン名
tar -czf ~/プラグイン名.tar.gz *

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-09-24 (月) 18:40:08 (76d)