Product Store ViewスコープURLキーを持つストアスイッチ上の404


13

URL Key製品ページのデフォルトでは、グローバルスコープです。

編集: FlorinelChisが示唆するように、スコープは属性の管理で変更できます。ただし、これによりストアビュースイッチャーの動作が壊れます。

これは、サンプルデータと「ストアコードをURLに追加」を有効にして1.7.0.2でテストされています

  1. 製品を編集し、特定のストアビューに別のURLを設定します(フランス語)
  2. 再インデックス
  3. 英語のストアビューでサイトの製品ページを開く
  4. フランス語に切り替える:ページのURLが含まれます /French/
  5. 英語に戻す-> 404ページエラー(URLがストアコードを見逃している /default/

    ストアビュー/言語スイッチで正しく動作させる方法は?

詳細:

  • 英語のURL: /default/sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html
  • フランス語のURL: /french/sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html

このページの英語サイトにいる場合-> /default/sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html

次に、フランス語に切り替えます。

このURLを取得しました(ストアコードが見つかりません):
MAGEDOMAIN/sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html

そのため、magentoはURLを正しく書き直しますが、何らかの理由でストアコードを見逃します

参照:

確かにこれはに関連している/core/model/store.php/core/model/url/rewrite.php、特にこれらのメソッドに:

Mage_Core_Model_Url_Rewrite::rewrite
Mage_Core_Model_Store::getCurrentUrl

更新

1.9.1を使用している場合、@ Vinaiの修正が機能しない場合は、追加した新しい回答を確認してください


どのMagentoバージョンを使用していますか?
FlorinelChis

Magento 1.7.0.2
Fra

ティム私は現在いくつかの答えをテストしており、それらが機能していることを確認してから受け入れます。
フラ

回答:


12

問題は、モデルMage_Core_Model_Url_Rewrite_Request(Magento 1.8)およびMage_Core_Model_Url_Rewrite(以前のバージョン)のバグです。

1.8のコアコードのセクションは次のようになります。

    // Section from Mage_Core_Model_Url_Rewrite_Request::_rewriteDb()

    $fromStore = $this->_request->getQuery('___from_store');
    if (!$this->_rewrite->getId() && $fromStore) {
        $stores = $this->_app->getStores();
        if (!empty($stores[$fromStore])) {
            $store = $stores[$fromStore];
            $fromStoreId = $store->getId();
        } else {
            return false;
        }

バグ:クエリパラメータの値は店舗コードです(私の場合deenまたはfr)。によって返される配列のキーapp->getStores()は、数値のストアIDです。それがif (!empty($stores[$fromStore])) {常に失敗する理由です。

そのバグが修正されると、後で同じメソッドで別のバグが明らかになります(1.8のみだと思います)

$targetUrl = $this->_request->getBaseUrl() . '/' . $this->_rewrite->getRequestPath();

要求は、ベースURLは常に、MagentoのBASE_URLあるオブジェクトなしで店舗コード。$currentStore->getBaseUrl()代わりに使用すると、そのバグも修正されます。

これらの2つの問題が修正されると、言語スイッチャーは正常に動作します。これは、Magento 1.8(CE)でまさにそれを行う拡張機能です:https : //github.com/Vinai/VinaiKopp_StoreUrlRewrites

Magento 1.7では、問題は何か異なる可能性があります。googleが1.8以降を実行している他の誰かをここに連れてきた場合に備えて、私はまだこの答えを追加すると思いました。


私が実装した修正は安全だと思いますか?
Fra

正直に言うと、1.7の問題の原因は調べていません。動作の原因を正確に理解せずに修正プログラムを実装することは、常に危険です。
ヴィナイ

2年後にこの議論を再開して申し訳ありませんが、私は再びこのバグにいます... 1.9.1で問題はif条件$ this-> _ rewrite-> getId()にあります...基本的に2番目のストアビューリライトをロードするので、それはリダイレクトをトリガしない...しかし、この書き換えは(製品IDが+1である)、それは404読み込むように間違ったid_pathを有する
フラ

4

実際、Magento 1.8を実行している場合、Magento 1.7.0.2でこの問題の回避策が見つかりました。Vinaiの詳細な説明を参照してください。

問題の一部が要求コントローラーに関連しているように見えMage_Core_Controller_Request_Httpます。

161行目を見ると、次の条件があります。

                elseif ($storeCode !== '') {
                    $this->setActionName('noRoute');
                }

コメントアウトすると、カテゴリ/製品ページで別のストアに切り替えたときの404エラーが修正されます。

ただし、何らかの理由で、応答Urlでストアコードが欠落する場合がありますが、両方のURLが機能するようになったため、問題は発生しなくなりました。

  • MAGEDOMAIN / sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html
  • MAGEDOMAIN / sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html

この条件のコメントが他の問題を引き起こす可能性があるかどうかは、私には明確ではありません


私もこれが機能することを確認できます。製品を表示しているときに別の言語に切り替えると、404が表示されます。このようにコアコントローラーを編集するのは良いことではないので、これが最良のソリューションだとは想像できません。
ワッフル

コアファイルを編集する必要はありません。独自のモジュールを作成して、そのクラス/メソッドを書き換えることができます。
フラ

1
Mage_Core_Controller_Request_Httpモジュール内で書き換えることはできません。
ベンマーク

4

Magento 1.9.1の更新情報

@Vinaiが指摘したバグは、機能がまだ壊れている他の理由のためにこのバージョンで解決されたようです(設定可能な製品の場合)

問題の本当の問題はおそらくここMage_Catalog_Model_Resource_Urlにありますが、時間がないので、コアのこのような繊細な部分には触れたくありません。

回避策の説明:

エントリポイントは常にこのクラスMage_Core_Model_Url_Rewrite_Request 、特にメソッドです_rewriteDb()

仕組み_rewriteDb()

  1. まず、現在のストアのリクエストをロードしようとします

(139): $this->_rewrite->loadByRequestPath($requestCases);

  1. その後、私はそれを見つけることができず(IDなし)、___from_storeパラメータを持っている場合

(142): if (!$this->_rewrite->getId() && $fromStore) {

  1. の書き換えをロードしてみてください___from_store

(152): $this->_rewrite->setStoreId($fromStoreId)->loadByRequestPath($requestCases);

  1. 見つかった場合は、を使用id_pathして現在のストア用にロードします。

(159): $this->_rewrite->setStoreId($currentStore->getId())->loadByIdPath($this->_rewrite->getIdPath());

すべて正常に見えますが、url_rewriteデータに問題があるため、インデックス機能に問題があります(少なくとも構成可能な製品の場合)。

  • ストアを切り替えていて、新しいストアのURLが異なっていても、行139のリライトがロードされます。

問題は、この書き換えが間違っているid_pathことを指していることです(構成可能な製品IDを指すのではなく、単純な製品IDの1つを指している)

現在、回避策は!$this->_rewrite->getId()条件を削除することです。そのため、magentoは$fromstoreパラメーターがある場合は常にリダイレクトを見つけようとします

  • 最良の方法は、catalog_urlインデックスを修正し、作成した誤った書き換えを削除することです。

ここで、高速な回避策のコード(モジュールを作成し、Mage_Core_Model_Url_Rewrite_Request自分でクラスを書き換える必要があります):

protected function _rewriteDb()
    {
        if (null === $this->_rewrite->getStoreId() || false === $this->_rewrite->getStoreId()) {
            $this->_rewrite->setStoreId($this->_app->getStore()->getId());
        }

        $requestCases = $this->_getRequestCases();
        $fromStore = $this->_request->getQuery('___from_store');

        if ($fromStore) {
            $stores = $this->_app->getStores(false, true);
            if (!empty($stores[$fromStore])) {
                /** @var $store Mage_Core_Model_Store */
                $store = $stores[$fromStore];
                $fromStoreId = $store->getId();
            } else {
                return parent::_rewriteDb();
            }

            $this->_rewrite->setStoreId($fromStoreId)->loadByRequestPath($requestCases);
            if (!$this->_rewrite->getId()) {
                return parent::_rewriteDb();
            }

            // Load rewrite by id_path
            $currentStore = $this->_app->getStore();
            $this->_rewrite->setStoreId($currentStore->getId())->loadByIdPath($this->_rewrite->getIdPath());

            $this->_setStoreCodeCookie($currentStore->getCode());

            $targetUrl = $currentStore->getBaseUrl() . $this->_rewrite->getRequestPath();
            $this->_sendRedirectHeaders($targetUrl, true);
        }

        if (!$this->_rewrite->getId()) {
            return parent::_rewriteDb();
        }

        $this->_request->setAlias(Mage_Core_Model_Url_Rewrite::REWRITE_REQUEST_PATH_ALIAS,
            $this->_rewrite->getRequestPath());
        $this->_processRedirectOptions();

        return true;
    }

3

URLキーは属性です。カタログ->属性->属性の管理から編集できます。url_keyを検索してクリックします。 url_key属性を編集

スコープを変更して保存します。

これで、ストアビューごとに製品に異なるURLキーを設定できます。


私はあなたの答えは良いですが、質問を更新しましたが、それは動作していない
フラ

ストアを切り替えるときは、製品ページではなく、そのストアのホームページにアクセスする必要があります。
FlorinelChis

あなたの土地は、あなたから始めるところと同じである場所:あなたはカテゴリページ上にある場合は、異なる言語で同じページに着陸する必要があります
フラ

1

各ストアビューのURLを変更したいですか?

現時点では、フランス語のストアのスコア範囲で製品のURLを英語のストアとは異なるように変更しましたか?そして、2つを切り替えると404が返されます。これは予想される動作です。

Magentoは、他のストアビューに対して異なるURL書き換えを保存しません。その/french/product1ため、フランスのストアにアクセスすると、URLはテーブル内で一致し、ロードされます。しかし、英語ストアでヒットした場合、一致するものがないため、404になります。

必要なように思えるのは、「URLに店舗コードを追加する」だけです。これにより、URLキーはそのままになりますが、それぞれのURLにはすべて店舗コードが付加されます。これにより、ストアスイッチャーが機能できるようになります。


1
Vinaiによって確認されるよう、これはバグです
フラ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.