404 ในการสลับร้านค้าด้วย Product Store ดูคีย์ URL ที่กำหนดขอบเขต


13

ตามค่าเริ่มต้นURL Keyในหน้าผลิตภัณฑ์จะกำหนดขอบเขตทั่วโลก

แก้ไข: ตามที่ FlorinelChis แนะนำขอบเขตสามารถเปลี่ยนแปลงได้ในการจัดการคุณสมบัติ อย่างไรก็ตามสิ่งนี้จะหยุดพฤติกรรมการสลับมุมมองร้านค้า

สิ่งนี้ได้รับการทดสอบใน 1.7.0.2 ด้วยข้อมูลตัวอย่างและเปิดใช้งาน "เพิ่มรหัสร้านค้าไปยัง URL" :

  1. แก้ไขผลิตภัณฑ์และตั้ง url อื่นสำหรับ storeview เฉพาะ (ภาษาฝรั่งเศส)
  2. Re-ดัชนี
  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

ดังนั้นคุณภาพเยี่ยมอีกครั้งเขียน URL ได้อย่างถูกต้อง แต่พลาดรหัสร้านค้าด้วยเหตุผลบางอย่าง

อ้างอิง:

แน่นอนว่าสิ่งนี้เกี่ยวข้องกับ/core/model/store.phpและ/core/model/url/rewrite.phpโดยเฉพาะอย่างยิ่งกับวิธีการเหล่านั้น:

Mage_Core_Model_Url_Rewrite::rewrite
Mage_Core_Model_Store::getCurrentUrl

UPDATE

หากคุณใช้งาน 1.9.1 @Vinai fix จะไม่ทำงานให้ตรวจสอบคำตอบใหม่ที่ฉันเพิ่มเข้าไป


คุณใช้เวอร์ชั่นวีโอไอพีรุ่นใด
FlorinelChis

วีโอไอพี 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 หรือใหม่กว่า


คุณคิดว่าการแก้ไขที่ฉันนำมาใช้นั้นปลอดภัยหรือไม่
Fra

พูดตามตรงฉันไม่ได้มองหาสาเหตุของปัญหาใน 1.7 การใช้การแก้ไขโดยไม่เข้าใจว่าสิ่งที่ทำให้เกิดพฤติกรรมนั้นมีความเสี่ยงเสมอ
Vinai

ขออภัยการเปิดการสนทนานี้อีกครั้งหลังจาก 2 ปี แต่ฉันอีกครั้งในข้อผิดพลาดนี้ ... ใน 1.9.1 ปัญหาอยู่ที่ว่าถ้าเงื่อนไข $ this -> _ rewrite-> getId () ... โดยทั่วไปสำหรับมุมมองร้านที่สองจัดการ magento เพื่อโหลดการเขียนซ้ำและดังนั้นจึงไม่ทริกเกอร์การเปลี่ยนเส้นทาง ... อย่างไรก็ตามการเขียนซ้ำนี้มี id_path ที่ไม่ถูกต้อง (รหัสผลิตภัณฑ์คือ +1) ดังนั้นจึงโหลด 404
Fra

4

ที่จริงฉันพบวิธีแก้ปัญหาสำหรับปัญหานี้ใน Magento 1.7.0.2 ถ้าคุณกำลังใช้ Magento 1.8 ดูคำอธิบายโดยละเอียดของ Vinai:

Mage_Core_Controller_Request_Httpดูเหมือนว่าส่วนหนึ่งของปัญหาที่เกี่ยวข้องกับการควบคุมการร้องขอ

หากคุณดูบรรทัดที่ 161 มีเงื่อนไขนี้:

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

การแสดงความคิดเห็นออกมาแก้ไขข้อผิดพลาด 404 เมื่อฉันเปลี่ยนไปใช้ Store อื่นในหน้าหมวดหมู่ / ผลิตภัณฑ์

อย่างไรก็ตามด้วยเหตุผลที่ไม่ทราบสาเหตุบางครั้งรหัสร้านค้าไม่ได้รับการตอบสนองใน Url แต่สิ่งนี้ไม่ได้ทำให้เกิดปัญหาอีกต่อไปเนื่องจาก url ทั้งสองทำงานในขณะนี้:

  • MAGEDOMAIN / sony-VAIO-VGN-TXN27N-B-11-1-โน้ตบุ๊คพีซี french.html
  • MAGEDOMAIN / sony-VAIO-VGN-TXN27N-B-11-1-โน้ตบุ๊ค pc.html

มันไม่ชัดเจนสำหรับฉันหากความคิดเห็นของเงื่อนไขนี้อาจทำให้เกิดปัญหาอื่น


ฉันสามารถยืนยันได้ว่าสิ่งนี้ใช้ได้กับฉันเช่นกัน - เมื่อใดก็ตามที่เปลี่ยนไปใช้ภาษาอื่นเมื่อดูผลิตภัณฑ์ฉันจะได้รับ 404 ซึ่งเป็นการแก้ไขและตามที่คุณพูดให้ละเว้นรหัสร้านค้าจาก URL ที่แปลก ฉันไม่สามารถจินตนาการได้ว่านี่เป็นทางออกที่ดีที่สุดในการแก้ไขตัวควบคุมหลักเช่นนี้ไม่สามารถทำได้ดีฉันสงสัยว่าคุณเคยพบวิธีแก้ปัญหาอื่นหรือไม่
วาฟเฟิล

คุณไม่จำเป็นต้องแก้ไขไฟล์หลักใด ๆ คุณสามารถสร้างโมดูลของคุณเองและเขียนคลาส / วิธีการนั้นใหม่
รา

1
Mage_Core_Controller_Request_Httpไม่สามารถเขียนใหม่ในโมดูล
benmarks

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 ผลิตภัณฑ์ที่เรียบง่ายของมัน)

ตอนนี้วิธีแก้ปัญหาคือการลบ!$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

เมื่อคุณเปลี่ยนร้านค้าคุณควรลงจอดในหน้าแรกของร้านค้านั้นไม่ใช่หน้าผลิตภัณฑ์
FlorinelChis

สถานที่ที่คุณลงจอดเป็นสถานที่เดียวกันกับที่คุณเริ่มต้น: หากคุณอยู่ในหน้าหมวดหมู่คุณควรลงจอดที่หน้าเดียวกันในภาษาอื่น

1

ดังนั้นคุณต้องการเปลี่ยน URL สำหรับแต่ละมุมมองร้านค้าหรือไม่

ปัจจุบันคุณปรับเปลี่ยน URL ผลิตภัณฑ์ที่ขอบเขตคะแนนสำหรับร้านค้าฝรั่งเศสของคุณแตกต่างจากร้านค้าภาษาอังกฤษของคุณหรือไม่ และเมื่อคุณสลับระหว่างสองตัวนี้คุณจะได้ 404 นี่เป็นพฤติกรรมที่คาดหวัง

Magento จะไม่จัดเก็บการเขียน URL ที่แตกต่างกันสำหรับมุมมองร้านค้าอื่น ๆ ดังนั้นเมื่อคุณกด/french/product1ที่ร้านค้าฝรั่งเศส URL จะจับคู่ในตารางและจะโหลด แต่เมื่อคุณตีมันในร้านค้าภาษาอังกฤษจะไม่มีการแข่งขันและจะ 404

สิ่งที่ดูเหมือนว่าคุณต้องการเพียงแค่ "เพิ่มรหัสร้านค้าใน URL" - ซึ่งจะปล่อยให้คีย์ URL ของคุณอยู่คนเดียว แต่นำหน้า URL ที่เกี่ยวข้องทั้งหมดด้วยรหัสร้านค้าของคุณ สิ่งนี้จะช่วยให้ร้านค้า switcher ของคุณทำงานได้


1
ได้รับการยืนยันโดย Vinai นี่เป็นข้อผิดพลาด
Fra
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.