Fatal Error: Unexpected BLOG

主に自分用の備忘録として

【EC-CUBE】動的ブロックを追加する

EC-CUBEに動的ブロックを追加する方法です。
以下のサイトを参考にしました。

環境

管理画面からブロックを追加

まずは通常通り、EC-CUBEの管理画面からブロックを追加します。
もはや説明不要ですね。

DBに情報を追加

管理画面からブロックを追加すると、データベースにレコードが追加されますが、そのままだとただ内容を表示するだけの静的なブロックとしてしか機能しません。
ので、該当のレコードに値を追加します。

UPDATE `dtb_bloc` SET `php_path` = 'frontparts/bloc/new_bloc.php';

ブロックが呼び出された時に実行されるPHPファイルを`php_path`に指定します。
パスは各々の環境に合わせて読み替えて下さい。

ファイルを設置

当たり前ですが、上記で追加したPHPファイルのパスにPHPファイルを作成しておきます。
同じディレクトリにある別のブロックのものをコピーすると楽ちんです。
大体以下の感じになると思います。

<?php
require_once realpath(dirname(__FILE__)) . '/../../require.php';
require_once CLASS_EX_REALDIR . 'page_extends/frontparts/bloc/LC_Page_FrontParts_Bloc_NewBloc_Ex.php';

$objPage = new LC_Page_FrontParts_Bloc_NewBloc_Ex();
$objPage->blocItems = $params['items'];
$objPage->init();
$objPage->process();

「NewBloc」の部分は作成するブロックの名前にしておくと良いでしょう。

クラス設置

上記のPHPでrequireしているクラスを実際に作成します。
EC-CUBEのお作法としてクラスとそれを継承するクラスを作成します。
継承先のクラスで何も変更しないとしても、一応両方作ります。
今回の場合は以下の2つのファイルを設置します。

/data/class/pages/frontparts/bloc/LC_Page_FrontParts_Bloc_NewBloc.php
/data/class_extends/page_extends/frontparts/bloc/LC_Page_FrontParts_Bloc_NewBloc_Ex.php

こちらも同じディレクトリにある別のブロックのものをコピーして作成します。

継承クラス実装

extendsの方はほとんどいじらないので先にやっつけちゃいます。

<?php
require_once CLASS_REALDIR . 'pages/frontparts/bloc/LC_Page_FrontParts_Bloc_NewBloc.php';

class LC_Page_FrontParts_Bloc_NewBloc_Ex extends LC_Page_FrontParts_Bloc_NewBloc
{
    /**
     * Page を初期化する.
     *
     * @return void
     */
    function init()
    {
        parent::init();
    }

    /**
     * Page のプロセス.
     *
     * @return void
     */
    function process()
    {
        parent::process();
    }
}

ファイル名とクラス名を変えただけです。

クラス作成

こちらが実装の本番。

<?php
require_once CLASS_EX_REALDIR . 'page_extends/frontparts/bloc/LC_Page_FrontParts_Bloc_Ex.php';

class LC_Page_FrontParts_Bloc_NewBloc extends LC_Page_FrontParts_Bloc_Ex
{
    public function init()
    {
        parent::init();
    }

    public function process()
    {
        $this->action();
        $this->sendResponse();
    }

    public function action()
    {

        //ここにメインの処理を書く

    }

このクラスでの処理結果をテンプレートの方へ渡す場合はaction()メソッド内で以下のようにします。

<?php
    public function action()
    {
        ....
        $var = /*なにがしかの処理結果*/;
        $this->result = $var;
    }

こうしておくとtplファイルの方で同名の変数に$varが格納された状態になります。

<!--{$result}-->

↑これでアクセス出来ます。

以上。