読者です 読者をやめる 読者になる 読者になる

ただの技術者ぶろぐ

大阪に住んでる技術者が書く覚書ぶろぐ。

EC-CUBE3で遊ぼう2日目

EC-CUBE3 技術話

前回の改修で作ったプラグインに機能を追加してみます。

今回のテーマとしては、

  • 管理画面に画面を作る
  • 管理画面のサイドメニューに親メニューを追加する
  • 管理画面のサイドメニューに子メニューを追加する
  • 子メニューから作成した画面に移動する

この辺りを達成してみます。

作成した画面では、$appの内容をダンプする以下のような形にしましょう。 f:id:rock-3:20170215191226j:plain

各画面へ移動する為のパスを設定するのは、ServiceProviderと呼ばれるファイルです。

プラグインジェネレーターで作成した場合、[プラグイン名]ServiceProvider.phpという名前で作られているので、そこに追加していきます。

(例)NewSample0001ServiceProvider.php
    public function register(BaseApplication $app)
    {
        // プラグイン用設定画面
        $app->match('/'.$app['config']['admin_route'].'/plugin/NewSample0001/config', 'Plugin\NewSample0001\Controller\ConfigController::index')->bind('plugin_NewSample0001_config');

        // 独自コントローラ
        $app->match('/plugin/[lower_code]/hello', 'Plugin\NewSample0001\Controller\NewSample0001Controller::index')->bind('plugin_NewSample0001_hello');

        // Form
        $app['form.types'] = $app->share($app->extend('form.types', function ($types) use ($app) {
            $types[] = new NewSample0001ConfigType();

            return $types;
        }));

        $app->match('/'.$app['config']['admin_route'].'/support/new',
            'Plugin\NewSample0001\Controller\NewSample0001Controller::new_page')->bind('debug_viewer');

        // Repository

        // Service

        // メッセージ登録
        // $file = __DIR__ . '/../Resource/locale/message.' . $app['locale'] . '.yml';
        // $app['translator']->addResource('yaml', $file, $app['locale']);

        // load config
        // プラグイン独自の定数はconfig.ymlの「const」パラメータに対して定義し、$app['[lower_code]config']['定数名']で利用可能
        // if (isset($app['config']['NewSample0001']['const'])) {
        //     $config = $app['config'];
        //     $app['[lower_code]config'] = $app->share(function () use ($config) {
        //         return $config['NewSample0001']['const'];
        //     });
        // }

        // ログファイル設定
        $app['monolog.logger.[lower_code]'] = $app->share(function ($app) {

            $logger = new $app['monolog.logger.class']('[lower_code]');

            $filename = $app['config']['root_dir'].'/app/log/[lower_code].log';
            $RotateHandler = new RotatingFileHandler($filename, $app['config']['log']['max_files'], Logger::INFO);
            $RotateHandler->setFilenameFormat(
                '[lower_code]_{date}',
                'Y-m-d'
            );

            $logger->pushHandler(
                new FingersCrossedHandler(
                    $RotateHandler,
                    new ErrorLevelActivationStrategy(Logger::ERROR),
                    0,
                    true,
                    true,
                    Logger::INFO
                )
            );

            return $logger;
        });
    }

このregisterメソッドの中に、

         // 管理画面 親メニューを追加する
        $app['config'] = $app->share($app->extend('config', function ($config) {
            $nav = array(
                'id' => 'support',
                'url' => 'support',
                'name' => 'サポート',
                'has_child' => 'false',
                'icon' => 'cb-eye',
                'child' => array(
                    //管理画面 子メニューを追加する
                    array(
                        'id' => 'debug_viewer',
                        'url' => 'debug_viewer',
                        'name' => 'デバッグ機能',
                    ),
                ),
            );

            $config['nav'][] = $nav;

            return $config;
        }));

みたいな形で記述するとサイドメニューが作成されます。 [support]というIDがついたarray型が親のメニューを定義して、[child]というIDがついたarray型が子のメニューを定義しています。 親メニュー:support → 子メニュー:debug_viewerという形ですね。 iconの種類はcb-eyeという目のマーク。なんかセンスないですね。すいません。

ただ、この状態で管理画面を起動しても、以下のようにエラーになってしまいます。 f:id:rock-3:20170215191233j:plain

これは、debug_viewerというurlを指定しているが、対応する処理が存在しませんという事です。

その為、registerメソッド内に

$app->match('/'.$app['config']['admin_route'].'/support/new',     'Plugin\NewSample0001\Controller\NewSample0001Controller::show_debugview')->bind('debug_viewer');
//※$app['config']['admin_route']にはインストール時に指定した、管理画面のパスが入っています。

という記述を追加してやる事で、エラーが出なくなります。

ちなみに簡単に説明すると、 $app->matchというのはルーティング(URLのあて先)を指定するメソッドで、 GET、POST、PUT、DELETEいずれのルーティングであっても、対応するという意味です。これがたとえばPOSTのみしか受け入れない(直リンクは拒否するがformの値を渡すとか)場合だったら$app->postで指定する事になります。 二つのパラメータはそれぞれ、ルーティング名と対応するコントローラを指します。

さて、ルーティング名と対応するコントローラーを設定したので、管理画面自体の表示はできるようになりましたが、クリックしてもエラーが発生します。

対応するコントローラがないためなので、コントローラを作成しましょう。 先に記述したコントローラでは「'プラグイン名\Controller\NewSample0001Controller::show_debugview'」と記述しています。指定クラスファイル::指定メソッドという構成になっているので、show_debugviewというメソッドを定義します。

既にNewSample0001Controllerクラスにはindexメソッドが定義されているので、そのままコピーしてメソッド名のみshow_debugviewに書き換えます。

プラグイン名/Controller/NewSample0001Controller::show_debugviewメソッド
public function show_debugview(Application $app, Request $request)
{
    return $app->render('NewSample0001/Resource/template/index.twig', array(
        // add parameter...
    ));
}

$app->renderは画面を描画するメソッドですが、対応するtwigファイル(描画html)が存在しません。

プラグイン名/Resource/template/admin関数内にdebug_write.twigファイルを作って以下のように記述します。

プラグイン名/Controller/NewSample0001Controller::show_debugviewメソッド
public function show_debugview(Application $app, Request $request)
{
    return $app->render('NewSample0001/Resource/template/admin/debug_write.twig', array(
        // add parameter...
    ));
}
プラグイン名/Resource/template/admin/debug_write.twig
{% extends 'default_frame.twig' %}

{% block title %}サポート画面{% endblock %}
{% block sub_title %}デバッグ機能{% endblock %}

{% block main %}
    <div class="debug_area" id="debug_area">
        {{ dump(app) }}
    </div>
{% endblock main %}

これで目的の管理機能が達成できました。