404 tentang Switch Toko dengan Kunci Sampul URL Lihat Produk Store

13

Secara default URL Keypada halaman produk Global scoped.

EDIT: Seperti yang disarankan oleh FlorinelChis, ruang lingkupnya bisa berupa perubahan dalam Mengelola atribut. Namun ini merusak perilaku pengalih tampilan toko.

Ini telah diuji pada 1.7.0.2 dengan data sampel dan "Tambahkan kode toko ke URL" diaktifkan :

  1. mengedit produk dan mengatur url yang berbeda untuk tampilan toko tertentu (Perancis)
  2. Indeks ulang
  3. Buka halaman produk di situs pada tampilan toko bahasa inggris
  4. Beralih ke bahasa Prancis: Anda harus membuat URL halaman /French/
  5. Beralih kembali ke bahasa Inggris -> 404 halaman kesalahan (url ketinggalan kode toko /default/

    bagaimana membuatnya bekerja dengan benar dengan saklar tampilan toko / bahasa?

Detail:

  • URL untuk bahasa Inggris: /default/sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html
  • URL untuk bahasa Prancis: /french/sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html

Jika saya di situs bahasa Inggris di halaman ini -> /default/sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html

Lalu saya beralih ke bahasa Prancis:

Saya mendapatkan URL ini ( kode toko tidak terjawab ):
MAGEDOMAIN/sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html

Jadi magento menulis ulang url dengan benar tetapi ketinggalan kode toko karena suatu alasan

Referensi:

Pasti ini terkait dengan /core/model/store.phpdan /core/model/url/rewrite.php, dan khususnya untuk metode-metode tersebut:

Mage_Core_Model_Url_Rewrite::rewrite
Mage_Core_Model_Store::getCurrentUrl

MEMPERBARUI

Jika Anda menggunakan perbaikan 1.9.1 @Vinai tidak akan berfungsi, periksa jawaban baru yang saya tambahkan

Fra
sumber
versi Magento mana yang Anda gunakan?
FlorinelChis
Magento 1.7.0.2
Fra
Tim saya sedang menguji beberapa jawaban dan akan menerimanya setelah konfirmasi mereka berfungsi.
Fra

Jawaban:

12

Masalahnya adalah bug dalam model Mage_Core_Model_Url_Rewrite_Request(Magento 1.8) dan Mage_Core_Model_Url_Rewrite(versi sebelumnya).

Bagian dari kode inti di 1.8 terlihat seperti ini:

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

Bug: nilai parameter kueri adalah kode toko, (dalam kasus saya de, enatau fr). Kunci-kunci array yang dikembalikan oleh app->getStores()adalah ID toko numerik . Karena itu if (!empty($stores[$fromStore])) {selalu gagal.

Setelah bug itu diperbaiki, bug lain menjadi jelas kemudian dengan metode yang sama (saya pikir hanya dalam 1.8):

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

Url basis objek permintaan selalu adalah base_url Magento, tanpa kode toko. Menggunakan $currentStore->getBaseUrl()sebaliknya ada perbaikan bug itu juga.

Setelah kedua masalah tersebut diperbaiki, pengalih bahasa berfungsi dengan baik. Berikut ini adalah ekstensi yang tepat untuk Magento 1.8 (CE): https://github.com/Vinai/VinaiKopp_StoreUrlRewrites

Dalam Magento 1.7 masalahnya mungkin sesuatu yang berbeda. Saya masih berpikir saya akan menambahkan jawaban ini, kalau-kalau google membawa orang lain di sini yang menjalankan 1,8 atau lebih baru.

Vinai
sumber
apakah menurut Anda perbaikan yang saya implementasikan aman?
Fra
Sejujurnya, saya belum melihat penyebab masalah ini di 1.7. Menerapkan perbaikan tanpa memahami apa yang menyebabkan perilaku selalu berisiko.
Vinai
maaf membuka kembali diskusi ini setelah 2 tahun tapi saya lagi pada bug ini ... pada 1.9.1 masalah adalah dengan kondisi if $ this -> _ rewrite-> getId () ... pada dasarnya untuk tampilan store magento kedua mengelola untuk memuat penulisan ulang dan karena itu tidak memicu pengalihan ... namun penulisan ulang ini memiliki id_path yang salah (id produk +1) sehingga memuat 404
Fra
4

Sebenarnya saya menemukan solusi untuk masalah ini di Magento 1.7.0.2 jika Anda menjalankan Magento 1.8 melihat penjelasan rinci Vinai:

Tampaknya bagian dari masalah terkait dengan pengontrol permintaan Mage_Core_Controller_Request_Http.

Jika Anda melihat baris 161 ada kondisi ini:

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

Mengomentariya memperbaiki kesalahan 404 ketika saya beralih ke Toko yang berbeda di kategori / halaman produk.

Namun untuk beberapa alasan yang tidak diketahui beberapa saat kode toko tidak terjawab dalam Url respons tetapi ini tidak menyebabkan masalah lagi karena kedua url berfungsi sekarang:

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

Masih belum jelas bagi saya jika komentar tentang kondisi ini dapat menyebabkan masalah lain

Fra
sumber
Saya dapat mengkonfirmasi ini juga berfungsi untuk saya - setiap kali beralih ke bahasa lain ketika melihat suatu produk, saya akan mendapatkan 404. Ini memperbaikinya, dan melakukan seperti yang Anda katakan, menghilangkan kode toko dari URL yang aneh. Saya tidak bisa membayangkan ini adalah solusi terbaik karena mengedit inti controller seperti ini tidak baik, saya bertanya-tanya apakah Anda akhirnya menemukan solusi lain?
waffl
Anda tidak perlu mengedit file inti apa pun, Anda dapat membuat modul Anda sendiri dan menulis ulang kelas / metode itu.
Fra
1
Mage_Core_Controller_Request_Httptidak dapat ditulis ulang dalam modul.
patokan
4

Beberapa info terbaru untuk Magento 1.9.1

Bug @Vinai menunjukkan penampilan yang dipecahkan dalam versi ini karena alasan lain fungsionalitasnya masih rusak (untuk produk yang dapat dikonfigurasi)

Masalah masalah sebenarnya mungkin ada di sini Mage_Catalog_Model_Resource_Urlnamun saya tidak punya waktu dan saya tidak ingin menyentuh bagian inti yang begitu halus.

Penjelasan untuk solusinya:

Titik masuk selalu kelas ini Mage_Core_Model_Url_Rewrite_Request dan khususnya metode ini_rewriteDb()

Bagaimana cara _rewriteDb()kerjanya:

  1. Pertama mencoba memuat permintaan untuk toko saat ini

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

  1. maka jika saya tidak dapat menemukannya (tidak ada id) dan memiliki ___from_storeparameter

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

  1. coba muat ulang untuk ___from_store:

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

  1. jika menemukannya, gunakan id_pathuntuk memuat satu untuk toko saat ini:

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

Semuanya terlihat baik tetapi ada masalah dalam data url_rewrite dan dengan fungsi indeks (setidaknya untuk produk yang dapat dikonfigurasi):

  • bahkan jika kita beralih toko dan toko baru memiliki url yang berbeda menulis ulang di baris 139 dimuat.

Masalahnya adalah bahwa penulisan ulang ini menunjuk ke yang salah id_path(alih-alih menunjuk ke id produk yang dapat dikonfigurasi, melainkan menunjuk ke salah satu id produknya yang sederhana)

Sekarang solusinya adalah menghapus !$this->_rewrite->getId()kondisi dan magento mencoba mencari pengalihan selalu ketika ada $fromstoreparameter

  • Cara terbaik adalah memperbaiki catalog_urlindeks dan menghapus penulisan ulang yang salah.

Di sini kode untuk solusi cepat (Anda perlu membuat modul dan menulis ulang Mage_Core_Model_Url_Rewrite_Requestkelas sendiri):

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;
    }
Fra
sumber
3

Kunci URL adalah atribut. Anda dapat mengeditnya dari: Katalog -> Atribut -> Kelola Atribut . Cari url_key dan klik. Edit atribut url_key

Ubah Lingkup dan Simpan.

Sekarang Anda dapat memiliki kunci URL yang berbeda untuk produk di setiap tampilan toko.

FlorinelChis
sumber
Saya telah memperbarui pertanyaan, jawaban Anda baik tetapi tidak berfungsi
Fra
ketika Anda mengganti toko Anda harus mendarat di beranda toko itu bukan halaman produk.
FlorinelChis
Tempat Anda mendarat adalah tempat yang sama dengan tempat Anda memulai: jika Anda berada di halaman kategori Anda harus mendarat di halaman yang sama dalam bahasa yang berbeda
Fra
1

Jadi, Anda ingin mengubah URL untuk setiap tampilan toko?

Saat ini, Anda memodifikasi URL produk pada lingkup skor untuk toko Prancis Anda agar berbeda dengan toko Inggris Anda? Dan ketika Anda beralih di antara keduanya, Anda mendapatkan 404. Ini adalah perilaku yang diharapkan.

Magento tidak akan menyimpan penulisan ulang URL yang berbeda untuk tampilan toko lainnya. Jadi ketika Anda menekan /french/product1di toko Prancis, URL akan cocok di tabel dan itu akan dimuat. Tetapi ketika Anda menekannya di toko Inggris, tidak akan ada kecocokan dan dengan demikian akan 404.

Kedengarannya seperti yang Anda butuhkan adalah dengan hanya "Tambahkan kode toko ke URL" - yang akan membiarkan kunci URL Anda sendiri, tetapi awali semua URL masing-masing dengan kode toko Anda. Ini kemudian akan memungkinkan switcher toko Anda berfungsi.

Ben Lessani - Sonassi
sumber
1
seperti yang dikonfirmasi oleh Vinai ini adalah bug
Fra