[EC-CUBE3]初心者向け：一番小さいシンプルなプラグインの作り方

#はじめに
PHPやサーバの知識もあんまりない私がEC-CUBE3を触り始めて数週間。
プラグイン作成に挑戦したものの予想以上に苦戦したので、ひとまず勉強用に超ミニマムなプラグインを作ってリリースしてみた。少しでも同じ境遇に置かれた人の役に立てば幸い。

##本記事の対象者
- PHPとかあんまし触ったことない初心者
- いきなりEC-CUBEやることなってアタフタしてる人

##開発環境
- Windowsローカル（XAMPP）
- EC-CUBE 3.0.15

##プラグインの作り方（公式）
EC-CUBE公式ページ「[EC-CUBEプラグインをつくろう](https://www.ec-cube.net/plugin/)」
- [プラグイン仕様書](http://downloads.ec-cube.net/manual/v3/plugin.pdf)
- [プラグインチュートリアル](http://doc.ec-cube.net/plugin_tutorial)

・・・いろいろ書いてあるんですが、初心者の私にはイマイチよくわからず。なんか、ややこしすぎて。ファイルめっちゃ多いし。理解力なくてスミマセン。。。

#Hello World的な最小プラグインを作ろう

**目標：EC-CUBE3系プラグインの最小構成を知る。
仕様：プライバシーポリシーの「会社名」を「店名」に置き換える。**

上記１か所を置き換えるだけなら、Help/privacy.twig の { BaseInfo.company_name } を { BaseInfo.shop_name } に置き換える方が圧倒的に早い。今回はあくまで勉強用ということで。

テーブル追加も、カラム追加も、管理画面のページ追加も、フィールド追加も、とにかくそういうのは一切抜きの、最小構成を目指す。


##公式プラグインジェネレーターで作る（途中で断念）
上記チュートリアルを読み進めながらフォルダ作ったり、新規ファイル作ったりしていく内に、プラグインジェネレーターがあることに気づいた。~~（チュートリアルの冒頭に書いておいてほしかった。）~~
[(公式)プラグインジェネレータの利用方法](http://doc.ec-cube.net/plugin_tutorial-generate)

###プラグインジェネレータコマンドの実行方法
> `php app/console plugin:develop generate`
を実行します。

と書かれても、恥ずかしながら「それをどこで実行するんですか？？」状態でなわけで・・・。
本番サーバで実行するのも嫌な予感しかしないので、とりあえずローカルにXAMPP入れて、EC-CUBE格納して実験。

1. XAMPP ControlPanelを開く
2. 右上から3つ目の「Shell」をクリックして、コマンドプロンプト（XAMPP for Windows）起動
3. EC-CUBEを入れたフォルダまで移動
4. ここでようやく　`php app/console plugin:develop generate`

###問題勃発（１）イベント名がわからない
ジェネレータのチュートリアル見ながら進めるわけだけど、イベント名とやらが分からず。
他の無料プラグインをいくつかダウンロードして勉強させてもらったところ、今回はevent.ymlに

``` event.yml
Help/privacy.twig:
  - [onRenderHelpPrivacy, NORMAL]
```

と書けばいいことは分かったけれど、ジェネレータで「Help/privacy.twig」と入力してもそんなイベントないよと言われる。（私がわからなかっただけで、やり方あるのかもしれません。）

###問題勃発（２）大量のファイルが生成される
イベントをジェネレータで作るのはパスして（イベント作成の項目は無入力Enterで無視）、とりあえず最後までジェネレータを進めたところ、大量のファイルが生成された。最小プラグイン作るのが目的なのに・・・。

```
[+]File system
 this files and folders were created.
 - C:\xampp\htdocs\eccube-3.0.15/app/Plugin/T001
 - C:\xampp\htdocs\eccube-3.0.15/app/Plugin/T001/ServiceProvider
 - C:\xampp\htdocs\eccube-3.0.15/app/Plugin/T001/Controller
 - C:\xampp\htdocs\eccube-3.0.15/app/Plugin/T001/Form/Type
 - C:\xampp\htdocs\eccube-3.0.15/app/Plugin/T001/Resource/template/admin
 - C:\xampp\htdocs\eccube-3.0.15/app/Plugin/T001/config.yml
 - C:\xampp\htdocs\eccube-3.0.15/app/Plugin/T001/PluginManager.php
 - C:\xampp\htdocs\eccube-3.0.15/app/Plugin/T001/ServiceProvider/T001ServiceProvider.php
 - C:\xampp\htdocs\eccube-3.0.15/app/Plugin/T001/Controller/ConfigController.php
 - C:\xampp\htdocs\eccube-3.0.15/app/Plugin/T001/Controller/T001Controller.php
 - C:\xampp\htdocs\eccube-3.0.15/app/Plugin/T001/Form/Type/T001ConfigType.php
 - C:\xampp\htdocs\eccube-3.0.15/app/Plugin/T001/Resource/template/admin/config.twig
 - C:\xampp\htdocs\eccube-3.0.15/app/Plugin/T001/Resource/template/index.twig
 - C:\xampp\htdocs\eccube-3.0.15/app/Plugin/T001/LICENSE

[+]Database
 Plugin information was added to table [DB.Plugin] (id=4)
Plugin was created successfully
```

##で、結局テキストエディタで作った
どうこう書くより、ソース晒す方が早いと思うので。最終的に必要なのは４ファイル。

(1)config.yml：プラグインの概要。

```config.yml
name: プライバシーポリシーを店名に変更プラグイン
code: MGShopPrivacy
version: 1.0.0
event: MGShopPrivacyEvent

```

(2)event.yml：フックしたいイベントと、そのイベントを処理する関数名の定義

``` event.yml
Help/privacy.twig:
  - [onRenderHelpPrivacy, NORMAL]
```


(3)*****Event.php：event.ymlで定義したイベント関数の実処理

```MGShopPrivacyEvent.php
<?php

/*
 * This file is part of the MGShopPrivacyEvent
 *
 * Copyright (C) 2018 Meister Guild Inc.
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Plugin\MGShopPrivacy;

use Eccube\Application;
use Eccube\Event\EventArgs;
use Eccube\Event\TemplateEvent;

class MGShopPrivacyEvent
{

    /** @var  \Eccube\Application $app */
    private $app;

    /**
     * MGShopPrivacyEvent constructor.
     *
     * @param Application $app
     */
    public function __construct(Application $app)
    {
        $this->app = $app;
    }

    /**
     * プライバシーポリシー画面の会社名を店名に変更する.
     *
     * @param TemplateEvent $event
     */
    public function onRenderHelpPrivacy(TemplateEvent $event)
    {
        $sourceOrigin = $event->getSource();
        $search = 'BaseInfo.company_name';
        $replace = 'BaseInfo.shop_name';

        $source = str_replace($search, $replace, $sourceOrigin);
        $event->setSource($source);
    }
}
```


(4)PluginManager.php：プラグインのインストール、アンインストール、有効、無効の時に行われる処理。（今回は全て処理なしの空関数。）

```PluginManager.php
<?php

/*
 * This file is part of the MGShopPrivacy
 *
 * Copyright (C) 2018 Meister Guild Inc.
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Plugin\MGShopPrivacy;

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

class PluginManager extends AbstractPluginManager
{

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

    /**
     * プラグイン削除時の処理
     *
     * @param $config
     * @param Application $app
     */
    public function uninstall($config, Application $app)
    {
    }

    /**
     * プラグイン有効時の処理
     *
     * @param $config
     * @param Application $app
     * @throws \Exception
     */
    public function enable($config, Application $app)
    {
    }

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

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

}
```

#オーナーズストアに掲載された！
せっかく作ったんだし・・・ということで、~~こんなにしょぼいプラグインながら~~プラグインの登録申請をしてみた。EC-CUBE公式ページ「[EC-CUBEプラグインをつくろう](https://www.ec-cube.net/plugin/)」の資料を見れば、こっちはほとんど迷わずできた。
- 圧縮時のフォルダ構成間違えないように注意。
- 圧縮は7zip利用。いったんtarで圧縮してから、さらにgzip圧縮。
- プラグイン申請にはプラグインアイコン画像も必要。

きっとプラグインの需要はないけど、開発初心者向けの最初の１歩の勉強用には役立つかも！？
[プライバシーポリシーの会社名を店名に変更プラグイン](https://www.ec-cube.net/products/detail.php?product_id=1580)

以上！