404 ऑन स्टोर स्विच विथ प्रोडक्ट स्टोर व्यू स्कूप्ड URL की


13

URL Keyउत्पाद पृष्ठ पर डिफ़ॉल्ट रूप से ग्लोबल स्कॉप्ड है।

EDIT: जैसा कि फ्लोरिनसेल ने सुझाया है कि मैनेज मैनेज फीचर्स में बदलाव किया जा सकता है। हालाँकि यह स्टोर व्यू स्विचर व्यवहार को तोड़ देता है।

यह नमूने डेटा और "URL में स्टोर कोड जोड़ें" सक्षम के साथ 1.7.0.2 पर परीक्षण किया गया है :

  1. एक उत्पाद को संपादित करें और एक विशेष स्टोरव्यू (फ्रेंच) के लिए एक अलग यूआरएल सेट करें
  2. फिर से सूचकांक
  3. अंग्रेजी स्टोर दृश्य पर साइट पर उत्पाद पृष्ठ खोलें
  4. फ्रेंच में स्विच करें: आपके पास पृष्ठ URL containg होगा /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 के संस्करण का उपयोग कर रहे हैं?
फ्लोरिनसेल यह

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;
        }

बग: क्वेरी पैरामीटर का मान स्टोर कोड है, (मेरे मामले में de, enया fr)। सरणी की चाबी द्वारा लौटाए गए app->getStores()हैं सांख्यिक दुकान आईडी। यही कारण है कि if (!empty($stores[$fromStore])) {हमेशा विफल रहता है।

एक बार उस बग को ठीक करने के बाद, एक और बग बाद में उसी विधि में स्पष्ट हो जाता है (मुझे लगता है कि केवल 1.8 में):

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

अनुरोध ऑब्जेक्ट बेस url हमेशा स्टोर कोड के बिना Magento Base_url है । $currentStore->getBaseUrl()इसके बजाय का उपयोग करके उस बग को भी ठीक करता है।

एक बार उन दो मुद्दों तय हो जाने के बाद भाषा स्विचर ठीक काम करता है। यहाँ एक एक्सटेंशन दिया गया है, जो Magento 1.8 (CE) के लिए ठीक यही करता है: https://github.com/Vinai/VinaiKopp_StoreUrlRewrites

Magento 1.7 में मुद्दा कुछ अलग हो सकता है। मैंने अभी भी सोचा था कि मैं इस जवाब को जोड़ दूंगा, बस अगर Google किसी और को यहाँ लाता है जो 1.8 या नया चला रहा है।


क्या आपको लगता है कि मैंने जो फिक्स लागू किया है वह सुरक्षित है?
फ्रा

ईमानदार होने के लिए, मैंने 1.7 में इस मुद्दे के कारण पर ध्यान नहीं दिया। व्यवहार को ठीक से समझे बिना एक निर्धारण को लागू करना हमेशा जोखिम भरा होता है।
विनय

खेद 2 साल के बाद इस चर्चा को फिर से खोलने पर लेकिन मैं फिर से इस बग पर हूँ ... 1.9.1 पर यह मुद्दा अगर $ इस स्थिति के साथ है -> _ फिर से लिखना-> getId () ... मूल रूप से दूसरे स्टोर के लिए देखें magento प्रबंधन एक पुनर्लेखन को लोड करने के लिए और इसलिए यह रीडायरेक्ट को ट्रिगर नहीं करता है ... हालांकि इस पुनर्लेखन में गलत id_path (उत्पाद आईडी +1 है) इसलिए यह एक 404 लोड करता है
Fra

4

वास्तव में मुझे इस मुद्दे पर मैगेंटो 1.7.0.2 के लिए वर्कअराउंड मिला, अगर आप मैगनेटो 1.8 चला रहे हैं तो विनय की विस्तृत व्याख्या है:

ऐसा लगता है कि समस्या का हिस्सा अनुरोध नियंत्रक से संबंधित है Mage_Core_Controller_Request_Http

अगर आप लाइन 161 को देखें तो यह स्थिति है:

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

जब मैं किसी श्रेणी / उत्पाद पृष्ठों में किसी भिन्न स्टोर पर जाता हूं, तो यह टिप्पणी करना 404 त्रुटि को ठीक करता है।

हालांकि कुछ अज्ञात कारणों से कुछ समय के लिए स्टोर कोड प्रतिक्रिया यूआरएल में याद किया जाता है, लेकिन यह अब मुद्दा नहीं बन रहा है क्योंकि दोनों यूआरएल अब काम करते हैं:

  • MAGEDOMAIN / सोनी-VAIO-VGN-txn27n-बी-11-1-नोटबुक-पीसी-french.html
  • MAGEDOMAIN / सोनी-VAIO-VGN-txn27n-बी-11-1-नोटबुक-pc.html

यह मेरे लिए स्पष्ट नहीं है अगर इस स्थिति की टिप्पणी अन्य मुद्दे का कारण बन सकती है


मैं अपने लिए भी इस काम की पुष्टि कर सकता हूं - जब भी किसी उत्पाद को देखने पर किसी अन्य भाषा में स्विच किया जाता है, तो मुझे 404 मिलेगा। इसने इसे ठीक कर दिया, और जैसा आपने कहा, URL से स्टोर कोड को छोड़ दें, जो अजीब है। मैं कल्पना नहीं कर सकता कि यह सबसे अच्छा समाधान है क्योंकि कोर नियंत्रक को संपादित करना इस तरह अच्छा नहीं हो सकता है, मैं सोच रहा था कि क्या आपने कभी दूसरा समाधान ढूंढ लिया?
waffl

आपको किसी भी कोर फ़ाइल को संपादित करने की आवश्यकता नहीं है, आप अपना खुद का मॉड्यूल बना सकते हैं और उस वर्ग / विधि को फिर से लिख सकते हैं।
फ्रा

1
Mage_Core_Controller_Request_Httpएक मॉड्यूल में फिर से नहीं लिखा जा सकता है।
बर्कमार्क

4

मैगेंटो 1.9.1 के लिए कुछ अद्यतन जानकारी

बग @Vaiai ने बताया कि इस संस्करण में वैसे भी हल दिखता है, जबकि अन्य कारण से कार्यक्षमता अभी भी टूटी हुई है (विन्यास योग्य उत्पादों के लिए)

समस्या वास्तविक समस्या शायद यहाँ है, Mage_Catalog_Model_Resource_Urlहालांकि मेरे पास समय नहीं है और न ही मैं कोर के ऐसे नाजुक हिस्से को छूना चाहता हूं।

वर्कअराउंड के लिए स्पष्टीकरण:

प्रवेश बिंदु हमेशा इस वर्ग Mage_Core_Model_Url_Rewrite_Request और विशेष रूप से विधि है_rewriteDb()

कैसे _rewriteDb()काम करता है:

  1. पहले यह वर्तमान स्टोर के लिए अनुरोध को लोड करने का प्रयास करता है

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

  1. तब अगर मुझे यह नहीं मिल रहा है (कोई आईडी नहीं) और एक ___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 डेटा में एक समस्या है और इसलिए सूचकांक कार्यक्षमता (कम से कम विन्यास उत्पादों के लिए):

  • यहां तक ​​कि अगर हम स्टोर स्विच कर रहे हैं और नए स्टोर में अलग-अलग यूआरएल हैं, तो लाइन 139 पर फिर से लिखा जाता है।

समस्या यह है कि यह फिर से गलत id_pathको इंगित करता है (इसके बजाय कॉन्फ़िगर करने योग्य उत्पाद आईडी की ओर इशारा करते हुए यह उसके सरल उत्पाद आईडी में से एक की ओर इशारा करता है)

अब !$this->_rewrite->getId()स्थिति को हटाने के लिए एक वर्कअराउंड है और इसलिए मैगेंटो एक $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 कुंजियाँ हो सकती हैं।


मैंने प्रश्न को अपडेट कर दिया है, आप का जवाब अच्छा है लेकिन यह काम नहीं कर रहा है
Fra

जब आप स्टोर को स्विच करते हैं तो आपको उस स्टोर होमपेज पर उतरना चाहिए उत्पाद पृष्ठ नहीं।
फ्लोरिनसेल यह

जिस स्थान पर आप उतरते हैं वही स्थान है जहाँ से आप शुरू करते हैं: यदि आप एक श्रेणी पृष्ठ पर हैं तो आपको उसी पृष्ठ पर अलग भाषा में उतरना चाहिए
Fra

1

तो क्या आप प्रत्येक स्टोर दृश्य के लिए URL बदलना चाहते हैं?

वर्तमान में, आपने अपने फ़्रेंच स्टोर के लिए उत्पाद स्कोप को अपने अंग्रेज़ी स्टोर से अलग करने के लिए स्कोर स्कोप में संशोधित किया है? और जब आप दोनों के बीच स्विच करते हैं, तो आपको 404 मिलते हैं। यह अपेक्षित व्यवहार होगा।

Magento अन्य स्टोर दृश्य के लिए अलग-अलग URL पुनर्लेखन नहीं करेगा। इसलिए जब आप /french/product1फ़्रेंच स्टोर पर आते हैं, तो URL तालिका में मेल खा जाएगा और यह लोड हो जाएगा। लेकिन जब आप इसे अंग्रेजी स्टोर में मारते हैं, तो कोई मेल नहीं होगा और इस प्रकार 404 होगा।

आपको जो चाहिए वह लगता है कि "URL में स्टोर कोड जोड़ें" - जो आपके URL कुंजी को अकेला छोड़ देगा, लेकिन आपके स्टोर कोड के साथ सभी संबंधित URL को उपसर्ग करेगा। इसके बाद अपने स्टोर स्विचर को काम करने देना चाहिए।


1
जैसा कि विनय द्वारा पुष्टि की गई है कि यह एक बग है
फ्रा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.