EC-CUBE3でプラグインを使ったテーブルの作り方

シェアする

今回はEC-CUBE3のプラグインでテーブルを作成していく手順の紹介になります。
EC-CUBE3では、エンティティを通じてデータの取得や更新などのテーブル操作を行います。

まず、テーブルとエンティティをマッピングするための設定ファイルdcm.ymlを作り、その後にEC-CUBE3で用意されているコマンドを実行して、必要なファイルやテーブルを作成します。

プラグインの雛形の作成方法はこちらの記事を参考にしてください。

EC-CUBE3.0.13以降で搭載されたプラグインジェネレーターを使って、プラグインの雛形をコンソールコマンドで簡単に生成出来るようになったので、その使い方の紹介です。

以下この記事の例では、プラグインコード「TestPlugin」、エンティティ名「SampleContent」とします。

作業環境は下記の通りです。

  • EC-CUBE(3.0.16)
スポンサーリンク

dcm.ymlを定義

dcm.ymlとは、テーブルとエンティティをマッピングするための設定ファイルです。

ファイル名はPlugin.{PluginCode}.Entity.{EntityName}.dcm.ymlというパターンで、Plugin/TestPlugin/Resource/doctrine ディレクトリ内に作成します。

今回の例では、プラグインコード「TestPlugin」、エンティティ名「SampleContent」なので、Plugin.TestPlugin.Entity.SampleContent.dcm.ymlという名前になります。

Plugin\TestPlugin\Entity\SampleContent:
    type: entity
    table: plg_testplugin_content
    repositoryClass: Plugin\TestPlugin\Repository\SampleContentRepository
    id:
        id:
            type: integer
            nullable: false
            unsigned: false
            id: true
            column: content_id
            generator:
                strategy: NONE

    fields:
        content:
            type: text
            nullable: true
    lifecycleCallbacks: {}

エンティティとレポジトリの生成

dcm.ymlを作成したら、下記のコマンドを実行して、エンティティとレポジトリファイルを生成します。

$ php app/console plugin:develop entity
[+]Please enter Plugin Code (First letter is uppercase alphabet only. alphabet and numbers are allowed.)
Input[1] : TestPlugin
[+]Plese enter yml file name
Input[2] : Plugin.TestPlugin.Entity.SampleContent.dcm.yml
--- your entry list
 - Plugin.TestPlugin.Entity.SampleContent.dcm.yml

--- Press Enter to move to the next step ---
[+]Plese enter yml file name
Input[2] : 
[+]Do you want to support old versions too? [y/n]
Input[3] : n

---Entry confirmation
[+]Plugin Code:  TestPlugin
[+]Yml file name: 
  Plugin.TestPlugin.Entity.SampleContent.dcm.yml
[+]Old version support:  No

[confirm] Do you want to proceed? [y/n] : y
  1. プラグインコード名入力
  2. 作成したymlファイル名を入力、空行を入れるまで複数登録可能
  3. EC-CUBE3.0.8以下も対応するか?

最後に入力内容が正しいか訊かれるので(Do you want to proceed?)、問題がなければ「y」を押して処理を続けます。そうすると、プラグインコード内にエンティティやレポジトリ、マイグレーションファイルが生成されます。

[+]File system

 this files and folders were created.
 - /Applications/MAMP/htdocs/eccube_test/app/Plugin/TestPlugin/Entity
 - /Applications/MAMP/htdocs/eccube_test/app/Plugin/TestPlugin/Repository
 - /Applications/MAMP/htdocs/eccube_test/app/Plugin/TestPlugin/Resource/doctrine/migration
 - /Applications/MAMP/htdocs/eccube_test/app/Plugin/TestPlugin/Entity/SampleContent.php
 - /Applications/MAMP/htdocs/eccube_test/app/Plugin/TestPlugin/Repository/SampleContentRepository.php
 - /Applications/MAMP/htdocs/eccube_test/app/Plugin/TestPlugin/Resource/doctrine/migration/Version20181002143547.php

プラグインマネージャーの作成

マイグレーションファイルができたら、テーブル作成のためにプラグインマネージャーを定義します。ファイル名は Plugin/TestPlugin/PluginManager.php です。

namespace Plugin\TestPlugin;

use Eccube\Application;
use Eccube\Plugin\AbstractPluginManager;

class PluginManager extends AbstractPluginManager
{

   //プラグインインストール時の処理
   public function install($config, Application $app)
   {
   }

   //プラグインアンインストール時にマイグレーションの「down」メソッドを実行します
   public function uninstall($config, Application $app)
   {
       $this->migrationSchema($app, __DIR__.'/Resource/doctrine/migration', $config['code'], 0);
   }

   //プラグイン有効時にマイグレーションの「up」メソッドを実行します
   public function enable($config, Application $app)
   {
       $this->migrationSchema($app, __DIR__.'/Resource/doctrine/migration', $config['code']);
   }

   //プラグイン無効時の処理
   public function disable($config, Application $app)
   {
   }

   //プラグイン更新時の処理
   public function update($config, Application $app)
   {
   }

}

テーブルの作成

プラグインのインストールと有効化をコマンドで行います。その際にプラグインマネージャー経由でテーブルが作成されます。

$ php app/console plugin:develop uninstall --code TestPlugin
$ php app/console plugin:develop install --code TestPlugin
$ php app/console plugin:develop enable --code TestPlugin

追加されたエンティティをEC-CUBEに認識させるために、一度プラグインをアンインストールする必要があります。enableまで完了したら、DBを確認し、テーブルが追加されていれば完了です。

ServiceProviderにRepositoryの定義を行う

app/Plugin/TestPlugin/ServiceProvider/TestPluginServiceProvider.phpに、Repositoryを定義します。
registerメソッド内に、以下のように記載をしてください。

    // Repository
    $app['test_plugin.repository.sample_content'] = $app->share(function () use ($app) {
        return $app['orm.em']->getRepository('Plugin\TestPlugin\Entity\SampleContent');
    });

コントローラーなどで呼び出す際は以下のようにします。

$SampleContent = $app['test_plugin.repository.sample_content']->findAll();

まとめ

dcm.ymlの定義をすれば、あとはコマンドで必要なファイルを生成してくれるので、簡単にテーブルを追加することができます。
あとはRepository定義をするだけで、呼び出せるようになり、データの更新や取得が可能になります。

実際に今回作ったテーブルを呼び出してデータを扱うのは、また別の記事でやっていこうと思います。

新卒1年目のエンジニアです。
主にPHPを勉強中で、今まで学んできたことを記事にしていきたいと思っております。

スポンサーリンク

シェアする

フォローする