2016年4月26日火曜日

【ECcube3】追加したブロックにスクリプトを割り当てたい カゴの中身変数など

(この記事でのECcubeのヴァージョンは3.0.8 です。)

ECcube3で、「ロゴ」「カゴの中」「ログイン」のみっつのブロックをひとつにまとめたヘッダーブロックを新規に作成したいとする。

しかし、管理画面から新規作成したブロック内では、カゴの中ブロックで使われている「Cart」など、プログラムが用意しているであろう高機能な変数が使えない。

自ら追加したブロックにおいて、通常は使えないECcube変数などを使えるようにするにはどうするか。
自分が追加したブロックに対応するスクリプト(コントローラー)が追加でき、コントローラーで作成した変数をView(twigファイル)に渡すことができればよい。

ECcube2系では、データベースの「dtb_bloc」テーブルの「php_path」が鍵だった。
以前仕事でECcube2系をカスタマイズした時につけておいたメモがあったのでコピペしておく。

-------------------------------------
ECキューブのディフォルトのページには、ページのクラスとその拡張クラスとが紐付いていて、いろいろPHPで複雑なことが出来る。

大雑把に言って4つのPHPファイルがワンセットになってる。
■HTML側のPHP(URLに対応するもの)
 例:products/list.php
■テンプレートファイル
 例:data/Smarty/templates/default/products/list.tpl
■DATA側、ECキューブ標準の処理の書かれたクラスファイル
 例:data/class/pages/products/LC_Page_Products_List.php
■DATA側、ユーザーが拡張処理を書くための拡張クラスファイル
 例:data/class_extends/page_extends/products/LC_Page_Products_List_Ex.php

これらのファイルがあらかじめいろいろな処理をして、テンプレートで使える変数や配列を作っている。
管理画面から新規に作成したページで、他のページが使っているECキューブの変数が使えないのは、ECキューブ標準ページはこれらのファイルによってあらかじめ処理を経てきているから。
なので、新規追加ページでECキューブのいろいろな変数を使いたい場合、上記のクラスファイルや拡張クラスファイルを同様に追加して、処理を書いておかないといけない。


で、
そういう感じでPHPで色々なことを仕込んだ、ブロックも作りたい。

【方法】
管理画面からブロックを新規作成。

\public_html\frontparts\bloc に、block_任意の名前.php というファイル(※)を作成。
\public_html\data\class_extends\page_extends\frontparts\bloc に、LC_Page_FrontParts_Bloc_任意の名前_Ex.php という拡張クラスファイルを作成。その処理の内容は、同ディレクトリにある他のクラスを参考に。
このクラスファイルを、このHTMLディレクトリ側のPHPから呼び出す。

データベース管理画面に入り、「dtb_blocテーブル」を開く。
追加したブロックの「php_path」コラムに、「frontparts/bloc/block_任意の名前.php」と入力。(※)で作成したファイル。

LC_Page_FrontParts_Bloc_任意の名前_Ex.phpに、処理を書く!
-------------------------------------


今回はECcube3系で、フレームワークが変わってしまっているので同じ手法は使えない。だが似たような方法でできるはず。

うまくいったのでやり方をメモる。

-----------------
1.データベースのレコードの書き換え
管理画面からブロックを追加すると「dtb_block」テーブルに該当のレコードが増えている。
「logic_flg」のフィールドの値を1にすると、対応するクラスを読み込みに行くらしい。対応するクラスは何らかの命名規則があるはずで自動的に導き出されるはず。

-----------------
2.ブロックのためのコントローラーを作成
\src\Eccube\Controller\Block に、自分が追加したブロックのためのコントローラーを作成する。名前はおそらく、ブロックのファイル名をキャメル表記にしてControllerをつけたもの。

【例】
ブロックのファイル名 : my_header
→ブロックのコントローラーファイル名 MyHeaderController.php
→ブロックのコントローラー名 MyHeaderController

既存のブロックのためのコントローラーファイルを参考にして処理を書く。
indexという名前のファンクションが必要らしい。

ログインブロックのように、
public function index(Application $app, Request $request)
という、引数がふたつある関数にする場合、

use Symfony\Component\HttpFoundation\Request;
の指定が必要なので注意。

戻り値は
$app->render(
'Block/対応するブロックのファイル名.twig',
twigファイル(View)に渡す連想配列
)
にするらしい。

-----------------
3.コントローラープロバイダーの編集
\src\Eccube\ControllerProvider\FrontControllerProvider.php
を編集。
72行目あたりからブロックのための設定が書かれているのが見つかるので、自分のブロックのための記述を追加。

こんな感じ。
$c->match('/block/my_header', '\Eccube\Controller\Block\MyHeaderController::index')->bind('block_my_header');

これで、スクリプトにエラーがなければ動く(コントローラーで用意してViewに渡した変数がtwigファイル内で使える)はず。

0 件のコメント:

コメントを投稿