EC-CUBE3.0.9から個別フックポイントがより細かく定義され、
メイン処理の前後にしか挿入できなかった処理が
より細かな位置に挿入できるようになりました!!
個人的に嬉しいのはカートへの商品投入時にプラグインから処理を挿入できるところでしょうか。
ただ、実際にWEBページなどで公開されているプラグインのサンプルを見てみると
挿入したい処理のfunctionで引数EventArgsを受け取って、何やら処理をしています。
※下のソースは、管理画面の商品編集初期化時の個別フックポイントに処理をセットする際のサンプルです
今から表示しようとしている商品をEventArgsから取得しています。
public function onAdminProductEditInitialize(EventArgs $event)
$Product = $event->getArgument(‘Product’);
プラグイン側で受け取ったEventArgsを利用して、
その処理の途中のデータを受け取る仕組みとなっている為、
getArgumentに何のデータが欲しいのか指定する必要があります。
一体、何を指定したらいいのやら?という疑問をお持ちの方はいらっしゃらないでしょうか?
この点の説明は特に見かけなかったので、私はかなり悩みました。
多分、この処理ではこのデータが取得できるはず、と予想でソースを記述していたのでは、
いつまで経っても開発効率は上がりません。
で、EventArgsに何がセットされているのか確認する方法ですが、
呼び出し側のソースを確認する事で、確実に内容を知る事が出来ます。
上記ソースの例でいうと、
管理画面の商品編集画面の初期表示ですので、
該当の記述のあるソースは、/src/Eccube/Controller/Admin/Product/ProductController.phpになります。
EC-CUBE3は、MVCアーキテクチャが採用されていますので、
ほとんどの処理はControllerディレクトリ以下のファイルに記述されています。
個別フックポイントも必ず*****Controller.phpに記述されています。
で、個別フックポイントの見つけ方ですが
ソース内にある「$app[‘eccube.event.dispatcher’]->dispatch」という
記述を探してください。
次にEccubeEvents::に続く文言を確認して、大まかな処理の意味を把握してください。
管理画面の商品編集画面の初期表示の場合、278行目付近に以下の記述があります。
$event = new EventArgs(
array(
‘builder’ => $builder,
‘Product’ => $Product,
),
$request
);
$app[‘eccube.event.dispatcher’]->dispatch(EccubeEvents::ADMIN_PRODUCT_EDIT_INITIALIZE, $event);
「EccubeEvents::ADMIN_PRODUCT_EDIT_INITIALIZE」とありますので、
管理画面、商品編集、イニシャライズ(初期化)と意味が伝わってきます。
プラグインで個別フックポイントに処理の挿入を指定した場合、
実行時には、ここで処理が呼ばれる事になります。
ここで注目していただきたいのは、
dispatchの処理の上に、EventArgsをnewしている処理があります。
しかもよくよく見ると、コンストラクタの引数に連装配列を渡しています。
この例では、builderとProductになります。
これがプラグイン側の引数でEventArgsから取り出せる情報になります。
以下の記述だとProductController.phpの271行目時点の$Productを取得する事となります。
$Product = $event->getArgument(‘Product’);
ちなみに取得した$Productですが、オブジェクト参照となっているようで、
呼び出されたプラグイン側で値を更新すると、
呼出し元の処理にその変更が継続されます。
商品名をプラグイン側の処理で書き換えたいと思った場合、
プラグイン側の処理で、以下の記述をすれば、任意の文言に商品名を変更可能です。
$Product->setName(“必ずこの名前になる”);
この探し方さえできれば、どんな個別フックポイントだろうと対応できると思います。
暗記は流石に難しいと思いますので、
いつか一覧にまとめたものを記事にしたいと思います。
以上、個別フックポイントの引数EventArgsの内容の調べ方でした。