Domyślnie URL Key
na stronie produktu ma zasięg globalny.
EDYCJA: Zgodnie z sugestią FlorinelChis zakres może być zmianami w Zarządzaj atrybutami. Jednak psuje to zachowanie przełącznika widoku sklepu.
Zostało to przetestowane w wersji 1.7.0.2 z włączonymi przykładowymi danymi i włączonym „Dodaj kod sklepu do adresu URL” :
- edytuj produkt i ustaw inny adres URL dla konkretnego widoku sklepu (francuski)
- Ponownie indeksuj
- Otwórz stronę produktu na stronie w widoku sklepu w języku angielskim
- Przełącz się na francuski: będziesz mieć podany URL strony
/French/
Przełącz się z powrotem na angielski -> błąd strony 404 (w adresie URL brakuje kodu sklepu
/default/
jak sprawić, by działał poprawnie z przełącznikiem widoku sklepu / języka?
Detale:
- URL dla angielskiego:
/default/sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html
- URL dla francuskiego:
/french/sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html
Jeśli jestem na angielskiej stronie na tej stronie -> /default/sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html
Następnie przechodzę na francuski:
Mam ten adres URL ( brakuje kodu sklepu ):
MAGEDOMAIN/sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html
Więc magento ponownie wpisz adres URL poprawnie, ale z jakiegoś powodu przegap kod sklepu
Odniesienie:
Na pewno jest to związane /core/model/store.php
i /core/model/url/rewrite.php
, w szczególności do tych metod:
Mage_Core_Model_Url_Rewrite::rewrite
Mage_Core_Model_Store::getCurrentUrl
AKTUALIZACJA
Jeśli korzystasz z wersji 1.9.1 @Vinai, poprawka nie będzie działać, sprawdź nową odpowiedź, którą dodałem
Odpowiedzi:
Problemem jest błąd w modelu
Mage_Core_Model_Url_Rewrite_Request
(Magento 1.8) iMage_Core_Model_Url_Rewrite
(wcześniejsze wersje).Sekcja kodu podstawowego w 1.8 wygląda następująco:
Bug: wartość parametru zapytania jest kod sklepu (w moim przypadku
de
,en
albofr
). Zwracane przez tablicę kluczeapp->getStores()
to numeryczne identyfikatory sklepu. To dlategoif (!empty($stores[$fromStore])) {
zawsze zawodzi.Gdy ten błąd zostanie naprawiony, kolejny błąd staje się widoczny później w tej samej metodzie (myślę tylko w 1.8):
Podstawowym adresem URL obiektów żądania jest zawsze Magento base_url, bez kodu sklepu. Użycie
$currentStore->getBaseUrl()
zamiast tego naprawia również ten błąd.Po rozwiązaniu tych dwóch problemów przełącznik języka działa poprawnie. Oto rozszerzenie, które robi dokładnie to dla Magento 1.8 (CE): https://github.com/Vinai/VinaiKopp_StoreUrlRewrites
W Magento 1.7 problem może być inny. Nadal myślałem, że dodam tę odpowiedź, na wypadek gdyby Google sprowadził tu kogoś, kto używa wersji 1.8 lub nowszej.
źródło
Właściwie znalazłem obejście tego problemu na Magento 1.7.0.2, jeśli używasz Magento 1.8 wygląda na szczegółowe wyjaśnienie Vinai:
Wygląda na to, że część problemu dotyczy kontrolera żądań
Mage_Core_Controller_Request_Http
.Jeśli spojrzysz na linię 161, jest to warunek:
Komentując to, napraw błąd 404, gdy przełączam się do innego sklepu na stronach kategorii / produktów.
Jednak z jakiegoś nieznanego powodu jakiś czas brakuje kodu sklepu w adresie URL odpowiedzi, ale nie powoduje to już problemu, ponieważ oba adresy działają teraz:
Nie jest dla mnie jasne, czy komentarz do tego warunku może powodować inny problem
źródło
Mage_Core_Controller_Request_Http
nie można przepisać w module.Niektóre zaktualizowane informacje dla Magento 1.9.1
Błąd wskazany przez @Vinai wygląda na rozwiązany w tej wersji z innego powodu, że funkcjonalność jest nadal zepsuta (w przypadku produktów konfigurowalnych)
Problem prawdziwy problem jest prawdopodobnie tutaj,
Mage_Catalog_Model_Resource_Url
jednak nie mam czasu i nie chcę dotykać tak delikatnej części rdzenia.Objaśnienie obejścia:
Punktem wejścia jest zawsze ta klasa,
Mage_Core_Model_Url_Rewrite_Request
a w szczególności metoda_rewriteDb()
Jak
_rewriteDb()
działa:(139):
$this->_rewrite->loadByRequestPath($requestCases);
___from_store
parametr(142):
if (!$this->_rewrite->getId() && $fromStore) {
___from_store
:(152):
$this->_rewrite->setStoreId($fromStoreId)->loadByRequestPath($requestCases);
id_path
do załadowania tego dla bieżącego sklepu:(159):
$this->_rewrite->setStoreId($currentStore->getId())->loadByIdPath($this->_rewrite->getIdPath());
Wszystko wygląda dobrze, jednak występuje problem z danymi url_rewrite, a więc z funkcją indeksu (przynajmniej w przypadku produktów konfigurowalnych):
Problem polega na tym, że to przepisywanie wskazuje na zły
id_path
(zamiast wskazywać na konfigurowalny identyfikator produktu, wskazuje jeden z jego prostego identyfikatora produktu)Teraz obejściem tego problemu jest usunięcie
!$this->_rewrite->getId()
warunku, dlatego magento próbuje znaleźć przekierowanie zawsze, gdy istnieje$fromstore
parametrcatalog_url
indeks i usunąć utworzone przez niego nieprawidłowe przepisywanie.Oto kod szybkiego obejścia (musisz samodzielnie utworzyć moduł i przepisać
Mage_Core_Model_Url_Rewrite_Request
klasę):źródło
Klucz URL jest atrybutem. Możesz go edytować w: Katalog -> Atrybuty -> Zarządzaj atrybutami . Wyszukaj klucz url_key i kliknij go.
Zmień zakres i zapisz.
Teraz możesz mieć różne klucze URL dla produktów w każdym widoku sklepu.
źródło
Chcesz zmienić adres URL każdego widoku sklepu?
W chwili obecnej zmodyfikowałeś adres URL produktu w zakresie punktacji, aby Twój francuski sklep był inny niż Twój angielski? A kiedy przełączasz się między nimi, dostajesz 404. To byłoby oczekiwane zachowanie.
Magento nie będzie przechowywać różnych zapisów adresów URL dla innych widoków sklepu. Więc kiedy trafisz
/french/product1
na francuski sklep, adres URL będzie pasował do tabeli i się załaduje. Ale kiedy trafisz go w angielskim sklepie, nie będzie meczu, a więc 404.Wygląda na to, że potrzebujesz po prostu „Dodaj kody sklepu do adresu URL” - co pozostawi twoje klucze URL w spokoju, ale poprzedzi wszystkie odpowiednie adresy URL kodem sklepu. Powinno to umożliwić działanie przełącznika sklepu.
źródło