バージョン選択

フォーラム

メニュー

オンライン状況

53 人のユーザが現在オンラインです。 (46 人のユーザが フォーラム を参照しています。)
登録ユーザ: 1
ゲスト: 52
yu86 もっと...

サイト内検索

質問 > フロント機能 > サブディレクトリインストール お気に入り登録ボタン⇒ログイン⇒ページが見つかりません

フロント機能

新規スレッドを追加する

スレッド表示 | 古いものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
yamap
投稿日時: 2020/3/26 10:40
対応状況: −−−
新米
登録日: 2020/3/22
居住地:
投稿: 3
Re: サブディレクトリインストール お気に入り登録ボタン⇒ログイン⇒ページが見つかりません
開発環境ではサブディレクトリ、本番環境ではルートディレクトリとしているため、
ハードコーディングはなかなか厳しいです。。。
もう少し調べてみます。



ログイン失敗のパターンは、AbstractController:setLoginTargetPath()を参考に、
次のようなカスタムクラスを追加して試してみてうまく復元はできました。

リダイレクト先は相変わらずサブディレクトリですが。。。


<?php

/*
 * This file is part of EC-CUBE
 *
 * Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
 *
 * http://www.ec-cube.co.jp/
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Customize\EventListener;

use Eccube\EventListener\SecurityListener;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Security\Core\AuthenticationEvents;
use Symfony\Component\Security\Core\Event\AuthenticationFailureEvent;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
use Symfony\Component\Security\Http\SecurityEvents;

class CustomSecurityListener extends SecurityListener
{
    protected $requestStack;

    public function __construct(
        RequestStack $requestStack
    ) {
        $this->requestStack = $requestStack;
    }

    /**
     * @param AuthenticationFailureEvent $event
     */
    public function onAuthenticationFailure(AuthenticationFailureEvent $event)
    {
        $request = $this->requestStack->getCurrentRequest();
        $request->getSession()->set('_security.login_memory', (bool) $request->request->get('login_memory', 0));
        // リダイレクト先が指定されていれば復元
        $targetPath = $request->request->get('_target_path');
        if (!empty($targetPath)) {
            $request->getSession()->getFlashBag()->set('eccube.login.target.path', $targetPath);
        }
    }
}



AbstractController:setLoginTargetPath()では、

    /**
     * @param string $targetPath
     */
    public function setLoginTargetPath($targetPath, $namespace = null)
    {
        if (is_null($namespace)) {
            $this->session->getFlashBag()->set('eccube.login.target.path', $targetPath);
        } else {
            $this->session->getFlashBag()->set('eccube.'.$namespace.'.login.target.path', $targetPath);
        }
    }

となっており、$namespaceという引数で処理を分けているようなのですが、どのような利用を想定しているのかわかりませんが、
既存ソースからはそのような呼び出し方をしている個所は見当たりませんでしたので、とりあえず無視してみました。

もっといい方法があれば教えてください。
468
投稿日時: 2020/3/26 10:22
対応状況: −−−
登録日: 2008/10/26
居住地:
投稿: 3217
Re: サブディレクトリインストール お気に入り登録ボタン⇒ログイン⇒ページが見つかりません
サブディレクトリの件は私もハードコーディングによる文字列置換くらいしか思い付きません...

ログイン失敗時にリクエストから_target_pathを受け取ってセッションフラッシュに再度セットすれば問題が解決するのではないかと思いますが
ログイン失敗時のイベントハンドラを追加する時点で
私の認識ではsymfonyの理解が必要となる、ややこしい改修という認識です。
慣れている方にはすぐに改修出来るところかと思います。


----------------
株式会社シロハチ
■ECCUBE2系、3系構築カスタマイズご相談ください。
EC-CUBE3マニュアル
blog

yamap
投稿日時: 2020/3/26 10:01
対応状況: −−−
新米
登録日: 2020/3/22
居住地:
投稿: 3
Re: サブディレクトリインストール お気に入り登録ボタン⇒ログイン⇒ページが見つかりません
ご回答ありがとうございます。

サブディレクトリの件は、該当の箇所で含まれているのは確認できました。

ここでサブディレクトリを除くとなると、ハードコーディングしか思いつかないのですが、
サブディレクトリ部分だけを取得するような方法があったりするでしょうか?


また、ログイン失敗の件につきましてもご確認ありがとうございます。

ログイン失敗時に、セッションフラッシュで_target_pathを復元できれば、
遷移先を切り替えることができるのでは?
という浅はかな想像もしておりましたが、そう簡単にはいかないものなのですね。

もう少し考えてみます。ありがとうございました。
468
投稿日時: 2020/3/23 11:53
対応状況: −−−
登録日: 2008/10/26
居住地:
投稿: 3217
Re: サブディレクトリインストール お気に入り登録ボタン⇒ログイン⇒ページが見つかりません
サブディレクトリインストール時に「ページが見つかりません」のエラーが発生する原因ですが
商品詳細ページ→お気に入りに追加ボタンクリック→ログインページに遷移した際に
ログインフォームに戻り先URLとして埋め込まれる
<input type="hidden" name="_target_path" value="******" />
にサブディレクトリ込みのパスがセットされる事が原因と思われます。

_target_pathへどのような値がセットされているか
Mypage/login.twigを確認すると
{% if app.session.flashBag.has('eccube.login.target.path') %}
    {% for targetPath in app.session.flashBag.get('eccube.login.target.path') %}
        <input type="hidden" name="_target_path" value="{{ targetPath }}" />
    {% endfor %}
{% endif %}

のように1回のみ有効となるセッションフラッシュを利用する仕様となっているようです。
該当のセッションフラッシュは
/src/Eccube/Controller/ProductController.phpの347行目の
$this->setLoginTargetPath($this->generateUrl('product_add_favorite', ['id' => $Product->getId()]));
でセットされているようです。
ここでセットするURLからサブディレクトリを取り除く事で現象を解消できるのではないかと思います。

あと1度でもログインを失敗すると商品詳細ページに戻らないのは
_target_pathをセッションフラッシュで設定している事が原因です。
こちらは解消しようと思うと、かなりややこしい改修が必要になるような気がします。
(マイページトップに遷移したい時に商品詳細に遷移してしまったりする事が起きるようになりそうです)


----------------
株式会社シロハチ
■ECCUBE2系、3系構築カスタマイズご相談ください。
EC-CUBE3マニュアル
blog

yamap
投稿日時: 2020/3/22 16:19
対応状況: −−−
新米
登録日: 2020/3/22
居住地:
投稿: 3
サブディレクトリインストール お気に入り登録ボタン⇒ログイン⇒ページが見つかりません
▼テンプレート
[EC-CUBE] 4.0.3(新規インストール)
[レンタルサーバ] 自前サーバー
[OS] CentOS 6.2
[PHP] 7.1.33
[データベース] MySQL 5.6.37
[WEBサーバ] Apache 2.2.15
[ブラウザ] Google Chrome 80.0.3987.132
[導入プラグインの有無] 特になし
[カスタマイズの有無] 特になし
[現象] サブディレクトリにインストールした状態で、
商品詳細ページからログインせずにお気に入り登録ボタンをクリックして、
ログインページへ遷移後、ログイン処理をするとページが見つかりませんエラーとなる。


【再現手順】

1.商品詳細ページにアクセス
http://sample.com/shop/products/detail/1

2.お気に入りに追加ボタンをクリック

3.ログイン画面に遷移

4.ログイン処理

5.戻り先のURLがおかしくページが見つかりませんエラーになる
http://sample.com/shop/shop/products/add_favorite/1


サブディレクトリ部分が重複してURL生成されているのが原因のようです。
ソースを追いかけてもどこで処理されているかよくわかりませんでした。

サブディレクトリへインストールした際に、ベースURLを設定する箇所があったりするでしょうか?

ちなみに、.envファイルには、
ECCUBE_COOKIE_PATH=/shop/
という記述があります。

原因と対処法のご教示いただけると幸いです。

よろしくお願いいたします。



追記)
ドキュメントルート直下インストールで試すと問題なく遷移していました。

また、関連してですが、
1.お気に入りに登録ボタンクリック
2.ログインページ
3.ログインに失敗
4.ログイン成功
5.戻り先はTOPページに変わる(商品詳細ページに戻らない)
という現象も確認しました。
スレッド表示 | 古いものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBE公式 Amazon Payプラグイン

統計情報

総メンバー数は88,290名です
総投稿数は109,690件です

投稿数ランキング

1
seasoft
7365
2
468
3217
3
AMUAMU
2712
4
nanasess
2303
5
umebius
2085
6
yuh
1818
7
h_tanaka
1610
8
red
1568
9
mcontact
1240
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
796
14 ramrun 789
15 karin 689
16 sumida 641
17
homan
633
18 DELIGHT 572
19
patapata
502
20
flealog
485


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.