【EC-CUBE4.02】未ログイン状態でお気に入りボタン押しても登録されない問題を解決する方法

こんにちは。

ショッピングサイトを作って欲しいと言われ、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勉強しないとなあ・・泣

今回お気に入り周りが少し理解できた。

いろいろこねくりまわして、商品一覧にこんなお気に入りボタンをつくることができました!

以上です!

間違い等ございましたら指摘していただけるとありがたいです。

ここまでお読みいただきありがとうございました!

シェアしてもらえたりすると元気出ます。