「カートへ進む」をクリックした際にログインチェック。ログイン後は、再度カートに移行。
デフォルトの設定では、「レジに進む」をクリックした際、ログイン画面に移行します。(未ログイン時)
実装
先ず初めにカートへ進むをクリックした際に通るControllerを確認します。
確認すると、src/Eccube/Contorller/CartController.phpのindexメソッドで実行されています。
その中にログイン状態をチェックするコードを書いていきます。
その前にカスタマイズする場合は、Customizeのディレクトリ内にファイルを作成する必要があるので、app/Customize/Controller/CartController.phpを作成してEccubeディレクトリのCartController.phpをコピーします。
74行目あたりのindexメソッドに下記のように追記していきます。
// 74: /** * カート画面. * * @Route("/cart", name="cart") * @Template("Cart/index.twig") */ public function index(Request $request) { // ログイン状態チェック if( ! $this->isGranted('ROLE_USER') ){ // ログイン後のリダイレクト先をカートに $this->setLoginTargetPath('cart'); return $this->redirectToRoute('mypage_login'); }
実は、今回の実現したいことはこれだけで完了です。
ログインしていない状態で、カートへ進むをクリックするとログイン画面へ移行して、ログイン後にカート画面へ戻ります。
ソースコードの詳しい解説していきます。
83行目にisGranted('ROLE_USER')でログイン状態がチェックできます。こちらは、symfonyで用意されているメソッドで、ControllerTrait というファイルの中で作成されています。このControllerTraitがOrderHelperで利用されています。そしてCartControler.phpの中でuseでインポートされているので、isGranted が使用できるという流れです。
これで、ユーザーの権限を判定してくれます。
if条件の頭に!を付けているので、もしログインされていなかったらtrueとなり、if文の中を通ります。
85行目でログイン後にcartの画面に移行するように、setLoginTargetPath() メソッドを使用しています。こちらはAbstaractController.phpで作成されています。引数に遷移先のRouteのnameを入れることで、session内に値を保存しています。Eccbueのデフォルトでログイン時にsession内の値を確認するので、カートの画面に戻るという流れです。
86行目では、書いてある通りにマイページのログイン画面にリダイレクトをかけています。
以上となります!
isGranted()とsetLoginPath()便利ですね。
もし他の用途で必要箇所があれば、応用が利くと思います。
Have a good development day~~!