こんにちは。
ショッピングサイトを作って欲しいと言われ、ECCUBEを触り始めたケーラボです。
Symfony系システムはLaravelくらいしか触った事ありませんが、とりあえずすぐ構築できちゃうし楽しいですね。
ECCUBE4がリリースされて結構経ってるようですが、まだまだバグはあるようです。
https://github.com/EC-CUBE/ec-cube/issues
先日、開発中にある問題に遭遇。
未ログイン状態で商品詳細ページからお気に入りボタンを押すと、まずログインページに飛ばされます。
そこまでは良いんですが、ログイン後お気に入りに追加されてるかと思いきや、されてない!
しかもTOP画面へ飛ばされる!
分からなすぎたので、中の人にも聞きましたがどうやらバグのようです。
てことで、とりあえずの解決策をば。
なってほしい遷移の流れ
未ログインの場合の期待する流れ
1.商品詳細画面お気に入りボタン押下
(ProductControllerのadd_favorite()の未ログイン時の処理実行)
↓
2 リダイレクトがかかりログイン画面表示
(Mypage/login.twig)
↓
3.ログイン
(ProductControllerのaddFavorite()のログイン時処理実行) // ここが呼ばれてない!
↓
お気に入りに追加され、詳細画面へ戻る // 3が呼ばれないので表示されない
ショピングログインの記述方法を参考にする
購入の場合、ログアウト状態で購入へ進んだときはShopping/login.twigが呼ばれますが、そこのお作法を使ってください。とのこと。中の人いわく。
Shopping/login.twigでは購入時未ログイン状態だった場合、inputタグ「_target_path」に遷移先のhidden値が定義してあり、購入画面へ戻るようになっています。
// src/Eccube/Resource/template/default/Shopping/login.twig // _target_pathでログイン後の遷移を繋げている <form name="shopping_login" id="shopping_login" method="post" action="{{ url('mypage_login') }}"> <input type="hidden" name="_target_path" value="shopping" /> <input type="hidden" name="_failure_path" value="shopping_login" />
どこを修正する?
修正箇所は1箇所でした
src/Eccube/Resource/template/default/Mypage/login.twig
// src/Eccube/Resource/template/default/Mypage/login.twig 22行目付近 に追加 // ProductControllerで定義しているsetLoginTargetPath()を取り出している ... <form name="login_mypage" id="login_mypage" method="post" action="{{ url('mypage_login') }}"> {# 以下を追加 #} {% for target_path in app.session.flashbag.get('eccube.login.target.path') %} <input type="hidden" name="_target_path" value="{{ target_path }}" /> {% endfor %} <input type="hidden" name="_failure_path" value="mypage_login" /> {# ここまで #} ...
これで・・やった!ちゃんと追加されて戻ってきてる!
・ProductController.phpのsetLoginTargetPath()の設定値が取り出されていないことが原因っぽいです。Mypage/loginで取得してセットしてあげてます。
//src/Eccube/Controller/ProductController.php 348行目付近 ... } else { // 非会員の場合、ログイン画面を表示 // ログイン後の画面遷移先を設定 【これが取得されていない??】 $this->setLoginTargetPath($this->generateUrl('product_add_favorite', ['id' => $Product->getId()])); $this->session->getFlashBag()->set('eccube.add.favorite', true); ...
注意点は?
・flashbagの値は一度取得すると消え去ります!デバッグ時などは注意してください!
dump()で一度表示したら消えてて一瞬訳わかんなくなったw
・今回はsrcのファイルを直接書き換えちゃいましたが、適宜読み替え・書き換えてください!
まとめ
・Shopping/login.tiwgの作法をつかう!
・Mypage/login.twigの_target_pathのhidden値として渡す!
・Symfony勉強しないとなあ・・泣
今回お気に入り周りが少し理解できた。
いろいろこねくりまわして、商品一覧にこんなお気に入りボタンをつくることができました!
以上です!
間違い等ございましたら指摘していただけるとありがたいです。
ここまでお読みいただきありがとうございました!