2016年4月21日木曜日

【ECCUBE3】3.0.9で新しくなったプラグインのフックポイント

ECCUBE3.0.9からプラグインのフックポイントが「ページ毎」から「ページ毎&定義された場所」へと変更されました。

これが非常に便利で、変更前は本体の処理の前後にしか処理を差し込めなかったのが、本体の処理の途中(フックポイントが定義されていれば)に処理を差し込む事が出来ます。

今までは本体で「フォームの入力が確定⇒メールの送信」という処理をしている場合。
処理の前後にしかプラグインでの処理を差し込めませんでした(○の場所)。
「○⇒フォームの入力が確定⇒メールの送信⇒○」

「フォームの入力が確定⇒○⇒メールの送信」
なので、上記の様にフォームの確定とメールの送信の間に何か処理を入れたい場合はプラグイン側で「フォームの入力が確定⇒プラグインでの処理⇒メールの送信」をやって、
その後本体の処理はキャンセルする等の処理が必要でした。
本体側の処理もプラグインでやるという事が必要でした。

3.0.9からは「フォームの入力が確定⇒○⇒メールの送信」
この○の部分に個別フックポイントが用意されているため、そこに処理を挟むだけでフォームの確定やメール送信の処理に関して気にする必要がなくなりました。

個別フックポイントの詳細はこちらに。
プラグイン仕様書

個別フックポイントを実際に見ていきましょう。
試しに商品詳細ページを見てみます。
src/Eccube/Controller/ProductController.php

上記コントローラーのdetail内に下記の様な記述があります。ここが実際のフックポイントになります。
$app['eccube.event.dispatcher']->dispatch(EccubeEvents::FRONT_PRODUCT_DETAIL_INITIALIZE, $event);

上記フックポイントにイベント定義する場合は
event.ymlに下記の様に記述すればOKです。
front.product.detail.initialize
- [hoge, NORMAL]


下記ファイル内にイベント一覧が定義されているので
src/Eccube/Event/EccubeEvents.php

FRONT_PRODUCT_DETAIL_INITIALIZEは下記の様に記述されているので、=の右側をevent.ymlに書けばOKです。
const FRONT_PRODUCT_DETAIL_INITIALIZE = 'front.product.detail.initialize';

あとはコントローラーに処理を書いていきます。


この新しくなったフックポイントを利用して作ったのが、「在庫切れ商品通知(3.0系)」プラグイン。

注文が完了した時のフックポイントに在庫数を取得してしきい値以下になったらメールをする処理をはさんでいます。

これを3.0.8以下で実装しようとすると注文完了の処理自体もプラグインでする必要があったので、3.0.9になって便利になりました。

2016年4月20日水曜日

【ECCUBE 3】検索対象を増やす。

ECCUBE3のデフォルトで検索の対称となるのは「商品名」と「検索ワード」のみ。

ここに「商品説明(詳細)」を増やしたい。

検索は下記ファイル内で処理されています。
src/Eccube/Repository/ProductRepository.php


上記ファイル内のgetQueryBuilderBySearchData
if (isset($searchData['name']) && Str::isNotBlank($searchData['name'])) {
    $keywords = preg_split('/[\s ]+/u', $searchData['name'], -1, PREG_SPLIT_NO_EMPTY);
    foreach ($keywords as $index => $keyword) {
        $key = sprintf('keyword%s', $index);
        $qb
            ->andWhere(sprintf ('p.name LIKE :%s OR p.search_word LIKE :%s', $key, $key))
            ->setParameter($key, '%' . $keyword . '%');
    }
}

下記に書き換えればOK!!
andWhereの部分にdescription_detailを追加してます。

if (isset($searchData['name']) && Str::isNotBlank($searchData['name'])) {
    $keywords = preg_split('/[\s ]+/u', $searchData['name'], -1, PREG_SPLIT_NO_EMPTY);
    foreach ($keywords as $index => $keyword) {
        $key = sprintf('keyword%s', $index);
        $qb
            ->andWhere(sprintf ('p.name LIKE :%s OR p.search_word LIKE :%s OR p.description_detail LIKE :%s', $key, $key, $key))
            ->setParameter($key, '%' . $keyword . '%');
    }
}

【ECCUBE3】アクセスしているのはどのページか取得する。

ECCUBE3でのメモ。

アクセスしているページ毎に処理を変えたい時などに。ルートを取得して判定する。
既存のコントローラーとプラグインで書き方が異なったのでメモ。

既存のコントローラー。と言ってもブロックの場合。既存のページはそもそもルーティングされているので、ページの判別は必要ない。
$request = $app['request_stack']->getMasterRequest();
$route = $request->attributes->get('_route');

return $app->render('Block/hoge.twig', array(
    'route' => $route
));


プラグインの場合。基本的に全ページにイベントはさむけど、特定のページだけ別処理したい場合。
$request = $event->getRequest();
$route = $request->attributes->get('_route');

return $app->render('Plugin/hoge.twig', array(
    'route' => $route
));

2016年4月4日月曜日

【EC CUBE 3】twigでページに渡っている変数をデバッグしたい。

ECCUBE3のデバッグについて。

twigに渡っている変数の中身を取得したい!という場合に有効です。

まず、ECCUBEにデバッグモードでアクセス。URLにindex_dev.phpをつける
hoge.com/index_dev.php/

twigファイルにて出力したい変数をdemp
{{ dump($変数) }}


試しに、{{ dump(Product) }}してみます。
例) /index_dev.php/products/detail/2

ページ上部に変数が表示されます。

変数を出力したい場合はデバッグされた情報を元に、
商品名を出力したい場合は
{{ Product.name }}
idを出力したい場合は
{{ Product.id }}
と簡単に変数を見つけて出力できます。

EC-CUBE プラグインアワード 3.0にて入選しました。

EC-CUBE プラグインアワード 3.0にて

作ったプラグイン「配送伝票番号CSV一括登録プラグイン(3.0系)」が入選しました!
http://www.ec-cube.net/events/plugin_award_30/report.php

Silexってなに?って状態から道のりは長かったけど、形にできてよかった。

Yahooクリエイティブアワードにノミネートされました。

2015年 Yahooクリエイティブアワードにノミネートされました。

東京メトロ最寄り出入口案内
http://creative-award.yahoo.co.jp/nominate/2015_g051.html

賞は取れなかったけど、作ったアプリが評価されてめちゃめちゃ嬉しかった。

ECCUBE3 新規ページを作ったのにヘッダー・フッターが表示されない場合

コンテンツ管理>ページ管理から新規ページを追加
レイアウト管理でヘッダーやフッターを設定したのに表示されない場合。

下記を追加
{% extends 'default_frame.twig' %}

twigにてヘッダーやフッターを継承しないといけない。