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

はじめに

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

本記事の対象者

  • PHPとかあんまし触ったことない初心者
  • いきなりEC-CUBEやることなってアタフタしてる人

開発環境

  • Windowsローカル(XAMPP)
  • EC-CUBE 3.0.15

プラグインの作り方(公式)

EC-CUBE公式ページ「EC-CUBEプラグインをつくろう
- プラグイン仕様書
- プラグインチュートリアル

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

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

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

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

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

公式プラグインジェネレーターで作る(途中で断念)

上記チュートリアルを読み進めながらフォルダ作ったり、新規ファイル作ったりしていく内に、プラグインジェネレーターがあることに気づいた。(チュートリアルの冒頭に書いておいてほしかった。)
(公式)プラグインジェネレータの利用方法

プラグインジェネレータコマンドの実行方法

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

問題勃発(1)イベント名がわからない

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

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

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

問題勃発(2)大量のファイルが生成される

イベントをジェネレータで作るのはパスして(イベント作成の項目は無入力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

で、結局テキストエディタで作った

どうこう書くより、ソース晒す方が早いと思うので。最終的に必要なのは4ファイル。

(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プラグインをつくろう」の資料を見れば、こっちはほとんど迷わずできた。
- 圧縮時のフォルダ構成間違えないように注意。
- 圧縮は7zip利用。いったんtarで圧縮してから、さらにgzip圧縮。
- プラグイン申請にはプラグインアイコン画像も必要。

きっとプラグインの需要はないけど、開発初心者向けの最初の1歩の勉強用には役立つかも!?
プライバシーポリシーの会社名を店名に変更プラグイン

以上!

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.