EC-CUBE3ではログアウト時にカート内の商品が消えてしまいます。これはログアウト時にinvalidateメソッドによりセッションの破棄を行っているためです。
カートの商品を維持するにはinvalidate_sessionの設定をfalseに設定する方法があります。invalidate_sessionがtrueのままですとログアウト時にセッションが破棄されてしまい、カート内の商品が破棄されることになります。一方、invalidate_sessionをfalseにするとセッションは維持されます。
Application.phpにて下記コードのように、ショップ・管理画面共にログアウト時のinvalidate_sessionをfalseに指定してやります。
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
$this['security.firewalls'] = array( 'admin' => array( 'pattern' => "^/{$this['config']['admin_route']}/", 'form' => array( 'login_path' => "/{$this['config']['admin_route']}/login", 'check_path' => "/{$this['config']['admin_route']}/login_check", 'username_parameter' => 'login_id', 'password_parameter' => 'password', 'with_csrf' => true, 'use_forward' => true, ), 'logout' => array( 'logout_path' => "/{$this['config']['admin_route']}/logout", 'target_url' => "/{$this['config']['admin_route']}/", 'invalidate_session' => false, ), 'users' => $this['orm.em']->getRepository('Eccube\Entity\Member'), 'anonymous' => true, ), 'customer' => array( 'pattern' => '^/', 'form' => array( 'login_path' => '/mypage/login', 'check_path' => '/login_check', 'username_parameter' => 'login_email', 'password_parameter' => 'login_pass', 'with_csrf' => true, 'use_forward' => true, ), 'logout' => array( 'logout_path' => '/logout', 'target_url' => '/', 'invalidate_session' => false, // これ ), 'remember_me' => array( 'key' => sha1($this['config']['auth_magic']), 'name' => $this['config']['cookie_name'].'_rememberme', // lifetimeはデフォルトの1年間にする // 'lifetime' => $this['config']['cookie_lifetime'], 'path' => $this['config']['root_urlpath'] ?: '/', 'secure' => $this['config']['force_ssl'], 'httponly' => true, 'always_remember_me' => false, 'remember_me_parameter' => 'login_memory', ), 'users' => $this['orm.em']->getRepository('Eccube\Entity\Customer'), 'anonymous' => true, ), ); |
このカスタマイズを行うことでセッションを利用している機能やプラグインで予期せぬ動作が起こる可能性がございますので、慎重にご使用ください。
単純にinvalidate_session=falseに設定する以外にも、独自のSessionLogoutHandlerを実装してやるという方法もあります。