404 w sprawie zmiany sklepu z kluczem sklepu z widokiem produktu

13

Domyślnie URL Keyna 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” :

  1. edytuj produkt i ustaw inny adres URL dla konkretnego widoku sklepu (francuski)
  2. Ponownie indeksuj
  3. Otwórz stronę produktu na stronie w widoku sklepu w języku angielskim
  4. Przełącz się na francuski: będziesz mieć podany URL strony /French/
  5. 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.phpi /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

Fra
źródło
jakiej wersji Magento używasz?
FlorinelChis
Magento 1.7.0.2
Fra
Tim aktualnie testuję odpowiedzi i zaakceptuję je po potwierdzeniu, że działają.
Fra

Odpowiedzi:

12

Problemem jest błąd w modelu Mage_Core_Model_Url_Rewrite_Request(Magento 1.8) i Mage_Core_Model_Url_Rewrite(wcześniejsze wersje).

Sekcja kodu podstawowego w 1.8 wygląda następująco:

    // 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: wartość parametru zapytania jest kod sklepu (w moim przypadku de, enalbo fr). Zwracane przez tablicę klucze app->getStores()to numeryczne identyfikatory sklepu. To dlatego if (!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):

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

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.

Vinai
źródło
czy uważasz, że poprawka, którą zaimplementowałem, jest bezpieczna?
Fra
Szczerze mówiąc, nie analizowałem przyczyny problemu w 1.7. Wdrożenie poprawki bez zrozumienia, co dokładnie powoduje zachowanie, jest zawsze ryzykowne.
Vinai
przepraszam, ponownie otwieram tę dyskusję po 2 latach, ale znów jestem w sprawie tego błędu ... w wersji 1.9.1 problem dotyczy warunku if $ this -> _ rewrite-> getId () ... w zasadzie dla drugiego widoku sklepu magento manage aby załadować przepisanie, więc nie wyzwala przekierowania ... jednak to przepisanie ma nieprawidłową ścieżkę id (identyfikator produktu to +1), więc ładuje 404
Fra
4

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:

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

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:

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

Nie jest dla mnie jasne, czy komentarz do tego warunku może powodować inny problem

Fra
źródło
Mogę również potwierdzić, że to działa dla mnie - za każdym razem, gdy przechodzę do innego języka podczas oglądania produktu, otrzymuję 404. To poprawiło to i robi, jak powiedziałeś, pomija kod sklepu z adresu URL, który jest dziwny. Nie mogę sobie wyobrazić, że jest to najlepsze rozwiązanie, ponieważ edytowanie podstawowego kontrolera w ten sposób nie może być dobre, zastanawiałem się, czy kiedykolwiek znalazłeś inne rozwiązanie?
waffl
nie musisz edytować żadnego pliku podstawowego, możesz stworzyć własny moduł i przepisać tę klasę / metodę.
Fra
1
Mage_Core_Controller_Request_Httpnie można przepisać w module.
zyskuje
4

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_Urljednak 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:

  1. Najpierw spróbuj załadować żądanie dla bieżącego sklepu

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

  1. to jeśli nie mogę go znaleźć (bez identyfikatora) i ma ___from_storeparametr

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

  1. spróbuj załadować przepisać dla ___from_store:

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

  1. jeśli go znajdzie, użyj id_pathdo 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):

  • nawet jeśli zmieniamy sklep i nowy sklep ma inny adres URL, ładowane jest przepisywanie w linii 139.

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 $fromstoreparametr

  • Najlepiej byłoby naprawić catalog_urlindeks i usunąć utworzone przez niego nieprawidłowe przepisywanie.

Oto kod szybkiego obejścia (musisz samodzielnie utworzyć moduł i przepisać Mage_Core_Model_Url_Rewrite_Requestklasę):

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
źródło
3

Klucz URL jest atrybutem. Możesz go edytować w: Katalog -> Atrybuty -> Zarządzaj atrybutami . Wyszukaj klucz url_key i kliknij go. Edytuj atrybut url_key

Zmień zakres i zapisz.

Teraz możesz mieć różne klucze URL dla produktów w każdym widoku sklepu.

FlorinelChis
źródło
Zaktualizowałem pytanie, odpowiedź jest dobra, ale nie działa
Fra
po zmianie sklepu powinieneś wylądować na stronie głównej tego sklepu, a nie na stronie produktu.
FlorinelChis,
Miejsce, w którym wylądujesz, to to samo, od którego zaczynasz: jeśli jesteś na stronie kategorii, powinieneś wylądować na tej samej stronie w innym języku
Fra
1

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/product1na 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.

Ben Lessani - Sonassi
źródło
1
co zostało potwierdzone przez Vinai jest to błąd
Od