純正のやつ
3.0系|ポイントプラグイン|株式会社イーシーキューブ(EC-CUBE開発元)
これ。
Contents
はじめに
先に言っとくけど、このプラグイン作ったやつは頭がおかしい。
「「p#detail_description_box__item_range_code」の手前に表示する」っていう狂った仕様になってる。ぶっ飛んでるとかの騒ぎじゃない。
idを検索してようやくプラグイン関連の記事が出てきたけど、なんで冷静でいられるんですかね。
ちょっとマジで引いた。
やるにしても純正プラグインなのに仕様書すら無いってなんなんだとか、ほんともうしんどい。
好きなところにポイントを表示させる
参考
扱い方というか考え方というか
Controllerを初めて触れたので理解に至るまでくっそ悩んだ。
とりあえずこのプラグインはタグを貼ればどこでも出してくれるみたいな機能は付けてくれてないので、データ取得~表示までを全部自分でやらないといけない。どんな塩梅でやってるのかを確認するためにはプラグインのコントローラーを覗く。
「\app\Plugin\Point\Controller\FrontPointController.php」
コメントが付きまくってるので何をどうやって引っ張ったりしてるのかがわかるし、どういう値をあれやこれやしてるのかが見えてくる。
1 2 3 4 5 6 7 8 9 10 11 12 | return $app->render( 'Point/Resource/template/default/point_use.twig', array( 'form' => $form->createView(), // フォーム 'pointRate' => $pointRate, // 換算レート 'currentPoint' => $currentPoint, // 保有ポイント // 利用ポイント上限. 保有ポイントが小さい場合は保有ポイントを上限値として表示する 'maxUsePoint' => ($maxUsePoint < $currentPoint) ? $maxUsePoint : $currentPoint, 'total' => $totalPrice, // すべての値引きを除外した合計金額 ) ); |
最後のあたりのこれ。この建付けは他のControllerでも使うから抑えておく。どこで使うか(point_use.twig)、何を使うか(array())をまとめてある。手前に書いてるなんちゃらかんちゃらは、そのためのお膳立てみたいに思っとけばとりあえずいい。
こうやる
まずやりたいことを決める。
- 「template\***\Block\cart.twig」でポイント残高を表示させたい。
いじるファイルは2つ
- src\Eccube\Controller\Block\CartController.php
- app\template\***\Block\cart.twig
扱えるようにするやつと、表示するやつ。
ECCUBE本体とテンプレートの両方をいじらないといけないのは正直つらい。
まずはCartController.phpを編集。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | namespace Eccube\Controller\Block; use Eccube\Application; class CartController { public function index(Application $app) { /** @var $Cart \Eccube\Entity\Cart */ $Cart = $app['eccube.service.cart']->getCartObj(); $currentPoint = null; $pointRate = null; // ログインしているかどうかチェック if($app->isGranted('ROLE_USER') && isset($app['eccube.plugin.point.repository.pointcustomer'])){ // ポイント換算レートの取得. $PointInfo = $app['eccube.plugin.point.repository.pointinfo']->getLastInsertData(); $pointRate = $PointInfo->getPlgPointConversionRate(); // 保有ポイントの取得. $Customer = $app->user(); $currentPoint = $app['eccube.plugin.point.repository.pointcustomer']->getLastPointById($Customer->getId()); } return $app->render('Block/cart.twig', array( 'Cart' => $Cart, 'currentPoint' => $currentPoint , 'pointRate' => $pointRate , )); } } |
元々のやつと見比べたらどこを追加してるかがわかると思います。
プラグインのControllerに書いてる内容をそのまま使えるので超便利ですね。
保有ポイントと換算レート(1pt = ○円)を出力できるようにした。
ログインしてるかどうかのifを付けないと非ログイン状態でのアクセス時にエラーを吐くので注意。
cart.twigはこう。
1 2 3 4 5 6 7 | {% if is_granted('ROLE_USER') %} <p> 保有ポイント:{{ currentPoint }}Pt<br> ※1pt=¥{{ pointRate }} </p> {% endif %} |
ログインしてたら表示するよって感じで。
購入履歴のとこ
「利用ポイント」「加算ポイント」は「p#summary_box__payment_total」の上に表示される、しかも<br>までついてくる。
controllerを見てもこの2つを生成する内容が出てこなかったもんで、こうやって格納してcssで調整するのが無難かなって感じに思った。
1 2 3 | <div class="point"> <p id="summary_box__payment_total"></p> </div> |
分かってれば生成できるんだろうけどまあこのくらいなら呑めるかなみたいなね。
カート画面の任意の箇所に「加算ポイント」を表示させる
どう頑張っても加算ポイントを表示させるタグなり呼び出し方なりがわからんかった。
めっちゃ調べても何も出てこない。購入履歴と違ってこれはどうしようもなく諦められない点なのでやっていくしかない。
プラグインは特定のhtmlタグにアレして表示させてるので、それに倣ってやってくしかないのだという結論を出した。
加算ポイントはcontrollerに書いてないんだもん、別枠のやつかもしれない。
symfonyの仕組みがなんもわからんので、ただただ、出せるよっていうやり方。
app\template\***\Cart\index.twig
どこに表示するか決める。
こういうのをやりたいとする。
1 2 3 4 5 6 7 | <div class="total"><span>小計(税込):</span>¥ 999,999</div> <div class="shipping"><span>送料:</span>¥ 0</div> <div class="point"><span>加算ポイント:</span>200</div> <div class="links"> <div class="link"><a href="">レジに進む</a></div> <div class="link"><a href="">お買い物を続ける</a></div> </div> |
挿入位置の直後のやつに何でもいいからidをつけて、加算ポイントの部分は削る。
1 2 3 4 5 6 | <div class="total"><span>小計(税込):</span>¥ 999,999</div> <div class="shipping"><span>送料:</span>¥ 0</div> <div id="gotoBuy" class="links"> <div class="link"><a href="">レジに進む</a></div> <div class="link"><a href="">お買い物を続ける</a></div> </div> |
おしまい。
次はプラグインを編集する。
app\Plugin\Point\Event\WorkPlace\FrontCart.php
ここではcart/index.twigへ挿入するお膳立てが成されてる。
簡単な中身の説明としては、
- 表示したい各種ポイントのやつを取得
- 表示タグを埋め込んだパーツを読み込んでタグを各種データに置換
- 指定の文字列をキーにしてパーツをcart/index.twigに埋め込む
ということなので、パーツを新しく用意してキーになる文字列も指定するをやっていく。
こんな感じで。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | $template = 'Point/Resource/template/default/Event/Cart/point_box.twig'; $template2 = 'Point/Resource/template/default/Event/Cart/point_box_XXXX.twig'; } else { $template = 'Point/Resource/template/default/Event/Cart/point_box_no_customer.twig'; $template2 = 'Point/Resource/template/default/Event/Cart/point_box_no_customer_XXXX.twig'; } $snippet = $this->app->renderView($template, array('point' => $point)); $search = '<div id="cart_item_list"'; $this->replaceView($event, $snippet, $search); $snippet2 = $this->app->renderView($template2, array('point' => $point)); $search2 = '<div id="gotoBuy"'; $this->replaceView($event, $snippet2, $search2); } } |
デフォルト状態だったら57行目以降を置き換えたらOK。
次はパーツを作る。
$Templateで指定してる.twigがそれになるんで、ディレクトリをたどっていく。
app\Plugin\Point\Resource\template\default\Event\Cart
元々のやつを複製して前項のコードに合わせたファイル名にして中身を編集。
コードは簡単で初心者でもやれる範囲だから割愛。
全部保存してページを読み込めば動作してるはず。
購入ページ(ポイント利用画面)
ディレクトリとファイルはここ。
app\Plugin\Point\Resource\template\default\point_use.twig
プラグインいじりたくないけどさ、もうここまで来たら諦めよう。どうしようもないよ。
Blockみたいにテンプレート側に生成されないから各自で元のファイルをコピーしてバックアップは取っておく。
ポイント利用に関してのみのページなので特筆することはないけど、敢えて言うなら、これもflame.twigを読み込んで表示させてるからその作り込みによってはレイアウトの設定が反映されるので、ポイント利用の諸々と購入ページへのリンク以外が存在しないポイントに完結したflame.twigを作ったほうがいいかも知れない。
購入ページ(ポイント利用画面へのリンクとか)
前項までに何度も書いてるけど、リンクは置換でもって表示させてるのでルールを変えたりして対応しないといけない。
購入ページ(/shopping)はポイント利用画面へのリンクと利用ポイント・加算ポイントの表示で2つをアレしてるわけで、めんどくさいのが2倍。
まずは表示内容を整える。
パーツ
加算ポイント・利用ポイント
app\Plugin\Point\Resource\template\default\Event\ShoppingConfirm\point_summary.twig
ポイント利用画面へのリンク
app\Plugin\Point\Resource\template\default\Event\ShoppingConfirm\use_point_button.twig
それぞれ複製して自分好みのやつに変える。
各所呼び出しのやつ
app\Plugin\Point\Event\WorkPlace\FrontShopping.php
最後らへんのこの部分を複製して、ファイル名と設置場所直下のタグを書き換える。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | // 加算ポイント/利用ポイントを表示する $snippet = $this->app->renderView( 'Point/Resource/template/default/Event/ShoppingConfirm/point_summary.twig', array( 'point' => $point, ) ); $search = '<p id="summary_box__total_amount"'; $this->replaceView($event, $snippet, $search); // ポイント利用画面へのボタンを表示する $snippet = $this->app->renderView( 'Point/Resource/template/default/Event/ShoppingConfirm/use_point_button.twig', array( 'point' => $point, ) ); $search = '<h2 class="heading02">お問い合わせ欄</h2>'; $this->replaceView($event, $snippet, $search); |
コメント