404 Ürün Mağazası ile Mağaza Anahtarında Kapsamlı URL Anahtarını Görüntüle


13

URL KeyÜrün sayfasında varsayılan olarak Global kapsamlıdır.

EDIT: FlorinelChis tarafından önerildiği gibi kapsam Yönet niteliklerinde değişiklikler olabilir. Ancak bu, mağaza görünümü değiştirici davranışını bozar.

Bu, 1.7.0.2'de örnek veriler ve "URL'ye mağaza kodu ekle" etkinken test edilmiştir :

  1. bir ürünü düzenleme ve belirli bir mağaza görünümü için farklı bir URL ayarlama (Fransızca)
  2. Yeniden endeksi
  3. İngilizce mağaza görünümünde sitede ürün sayfasını aç
  4. Fransızca'ya geç: sayfa URL'sini içerir /French/
  5. İngilizceye dön -> 404 sayfa hatası (url mağaza kodunu kaçırıyor /default/

    mağaza görünümü / dil anahtarı ile nasıl düzgün çalışır?

Detaylar:

  • İngilizce için URL: /default/sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html
  • Fransızca için URL: /french/sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html

Bu sayfada ingilizce sitem varsa -> /default/sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html

Sonra fransızca diline geçiyorum:

Bu URL'yi aldım ( mağaza kodu kaçırıldı ):
MAGEDOMAIN/sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html

Magento, URL'yi doğru bir şekilde yeniden yazıyor, ancak bir nedenle mağaza kodunu kaçırıyor

Referans:

Elbette bu ilişkilidir /core/model/store.phpve /core/model/url/rewrite.phpve özellikle bu yöntemlere:

Mage_Core_Model_Url_Rewrite::rewrite
Mage_Core_Model_Store::getCurrentUrl

GÜNCELLEME

1.9.1 @Vinai düzeltmesi çalışmıyorsa, eklediğim yeni cevabı kontrol edin


Hangi Magento sürümünü kullanıyorsunuz?
FlorinelChis

Magento 1.7.0.2
Fra

Tim Şu anda bazı cevapları test ediyorum ve çalıştıklarını onayladıktan sonra kabul edeceğim.
Fra

Yanıtlar:


12

Sorun, modeldeki Mage_Core_Model_Url_Rewrite_Request(Magento 1.8) ve Mage_Core_Model_Url_Rewrite(önceki sürümlerde) bir hatadır .

1.8'deki çekirdek kod bölümü şöyle:

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

Hata: Sorgu parametresinin değeri (Benim durumda, mağaza kodu de, enya da fr). Dizinin anahtarları tarafından döndürülen app->getStores()olan sayısal deposu kimlikleri. Bu yüzden if (!empty($stores[$fromStore])) {hep başarısız olur.

Bu hata giderildikten sonra, başka bir hata aynı yöntemde daha sonra belirginleşir (sadece 1.8'de düşünüyorum):

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

İstek nesneleri temel url'si , mağaza kodu olmadan her zaman Magento base_url olur . Kullanılması $currentStore->getBaseUrl()yerine de o hatayı orada düzeltir.

Bu iki sorun giderildikten sonra dil değiştirici sorunsuz çalışır. Magento 1.8 (CE) için tam olarak bunu yapan bir uzantı: https://github.com/Vinai/VinaiKopp_StoreUrlRewrites

Magento 1.7'de konu farklı bir şey olabilir. Yine de google'ın buraya 1.8 veya daha yeni çalışan başka birini getirmesi durumunda bu yanıtı ekleyeceğimi düşündüm.


benim yaptığım düzeltmenin güvenli olduğunu düşünüyor musun?
Fra

Dürüst olmak gerekirse, 1.7'deki sorunun nedenini araştırmadım. Davranışa neyin neden olduğunu tam olarak anlamadan bir düzeltme uygulamak her zaman risklidir.
Vinai

özür dilerim 2 yıl sonra bu tartışmayı yeniden açıyorum ama yine bu böcek üzerinde ... 1.9.1 üzerinde sorun if koşulu ile $ $ -> _ rewrite-> getId () ... temelde ikinci mağaza görünümü için magento yönetmek bir yeniden yazma yüklemek ve bu yüzden Yönlendirmeyi tetiklemez ... ancak bu yeniden yazma yanlış id_path (ürün kimliği +1) vardır, bu yüzden bir 404
Fra

4

Aslında Magento 1.8 çalıştırıyorsanız, Magento 1.7.0.2'de bu sorun için bir çözüm buldum, Vinai'nin ayrıntılı açıklamasına bakar:

Sorunun bir kısmının istek denetleyicisiyle ilgili olduğu anlaşılıyor Mage_Core_Controller_Request_Http.

161. satıra bakarsanız, bu koşul vardır:

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

Yorum yapmak, bir kategori / ürün sayfasında farklı bir Mağazaya geçtiğimde 404 hatasını düzeltti.

Ancak bilinmeyen bir nedenden ötürü, yanıt URL'sinde mağaza kodu kaçırılır, ancak her iki url şu anda çalıştığı için artık soruna neden olmaz:

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

Bu durumun yorumunun başka bir soruna neden olup olmadığı benim için açık değil


Bunun benim için de işe yaradığını onaylayabilirim - bir ürünü görüntülerken başka bir dile geçtiğinizde 404 alırım. Bu düzeltildi ve söylediğiniz gibi garip olan URL'den mağaza kodunu atlayın. Bunun en iyi çözüm olduğunu düşünemiyorum, çünkü çekirdek denetleyiciyi düzenlemek bu kadar iyi olamaz, başka bir çözüm bulduğunuzu merak ettiniz mi?
waffl

herhangi bir çekirdek dosyayı düzenlemeniz gerekmez, kendi modülünüzü oluşturabilir ve bu sınıfı / yöntemi yeniden yazabilirsiniz.
Fra

1
Mage_Core_Controller_Request_Httpbir modülde yeniden yazılamaz.
benmarks

4

Magento 1.9.1 için bazı güncellenmiş bilgiler

@Vinai'nin işaret ettiği hata, bu sürümde yine de işlevselliğin hala kırılmış olması nedeniyle çözülmüş görünüyor (yapılandırılabilir ürünler için)

Sorun gerçek sorun muhtemelen burada Mage_Catalog_Model_Resource_Urlama zamanım yok ve çekirdeğin böyle hassas bir kısmına dokunmak istemiyorum.

Geçici çözümün açıklaması:

Giriş noktası her zaman bu sınıf Mage_Core_Model_Url_Rewrite_Request ve özellikle yöntemdir_rewriteDb()

Nasıl _rewriteDb()çalışır:

  1. İlk önce mevcut mağaza için istek yüklemeye çalışın

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

  1. o zaman bulamazsam (kimlik yok) ve bir ___from_storeparametresi varsa

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

  1. aşağıdakiler için bir yeniden yazma işlemi yüklemeyi deneyin ___from_store:

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

  1. bulursa id_path, geçerli mağaza için birini yüklemek için kullanın :

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

Her şey iyi görünüyor, ancak url_rewrite verilerinde bir sorun var ve dizin işleviyle ilgili (en azından yapılandırılabilir ürünler için):

  • Mağazayı değiştiriyor olsak ve yeni mağazanın farklı url'si olsa bile, 139 satırında bir yeniden yazma yüklenir.

Sorun şu ki, bu yeniden yazma yanlış id_pathişaret ediyor (yapılandırılabilir ürün kimliğine değil, basit ürün kimliğinden birine işaret ediyor)

Şimdi bir çözüm, !$this->_rewrite->getId()koşulu kaldırmaktır ve böylece bir $fromstoreparametre olduğunda her zaman bir yönlendirme bulmaya çalışır.

  • En iyisi, catalog_urldizini düzeltmek ve oluşturduğu yanlış yeniden yazmayı kaldırmaktır.

İşte hızlı geçici çözüm için kod (bir modül oluşturmanız ve Mage_Core_Model_Url_Rewrite_Requestsınıfı kendiniz yeniden yazmanız gerekir):

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 Anahtarı bir özelliktir. Şuradan düzenleyebilirsiniz: Katalog -> Özellikler -> Özellikleri Yönet . Ara url_key ve tıklayın. Url_key özelliğini düzenleyin

Kapsamı Değiştir ve Kaydet.

Artık her mağaza görünümünde ürünler için farklı URL anahtarlarınız olabilir.


Soruyu güncelledim, cevap iyi ama çalışmıyor
Fra

mağazayı değiştirdiğinizde, ürün sayfasına değil, o mağaza ana sayfasına gitmelisiniz.
FlorinelChis

İniş yaptığınız yer, başladığınız yerle aynıdır: bir kategori sayfasındaysanız, aynı sayfaya farklı dilde
inmelisiniz

1

Her mağaza görünümünün URL'sini değiştirmek mi istiyorsunuz?

Şu anda, Fransız mağazanızın İngilizce mağazanızdan farklı olması için ürün URL'sini puan kapsamında değiştirdiniz mi? İkisi arasında geçiş yaptığınızda, bir 404 elde edersiniz. Bu beklenen bir davranış olacaktır.

Magento, diğer mağaza görünümleri için farklı URL yeniden yazmalarını saklamaz. /french/product1Fransız mağazasına vurduğunuzda , URL tabloda eşleşecek ve yüklenecektir. Ama İngiliz mağazasında vurduğunuzda, maç olmayacak ve böylece 404 olacak.

İhtiyacınız olan şey, URL anahtarlarınızı tek başına bırakacak, ancak ilgili tüm URL'leri mağaza kodunuzla ön ek olarak yalnızca "URL'ye mağaza kodları ekleyin" dir. Bu daha sonra mağaza değiştiricinizin çalışmasına izin vermelidir.


1
Vinai tarafından onaylanan bu bir hata
Fra
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.