De forma predeterminada, URL Key
la página del producto tiene un alcance global.
EDITAR: Según lo sugerido por FlorinelChis, el alcance puede ser cambios en Administrar atributos. Sin embargo, esto rompe el comportamiento del conmutador de vista de la tienda.
Esto se ha probado en 1.7.0.2 con datos de muestras y "Agregar código de tienda a URL" habilitado :
- editar un producto y establecer una url diferente para una tienda en particular (francés)
- Re-indexar
- Abra la página del producto en el sitio en la vista de la tienda en inglés
- Cambie a francés: tendrá la URL de la página que contiene
/French/
Vuelva al inglés -> error de página 404 (la URL pierde el código de la tienda
/default/
¿Cómo hacer que funcione correctamente con la vista de tienda / cambio de idioma?
Detalles:
- URL para inglés:
/default/sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html
- URL para francés:
/french/sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html
Si estoy en el sitio de inglés en esta página -> /default/sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html
Luego cambio al francés:
Obtuve esta URL ( se pierde el código de la tienda ):
MAGEDOMAIN/sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html
Entonces, Magento reescribió la URL correctamente, pero por alguna razón perdió el código de la tienda
Referencia:
Por supuesto, esto está relacionado con /core/model/store.php
y /core/model/url/rewrite.php
, y en particular con esos métodos:
Mage_Core_Model_Url_Rewrite::rewrite
Mage_Core_Model_Store::getCurrentUrl
ACTUALIZAR
Si está en 1.9.1 @Vinai, la corrección no funcionará, verifique la nueva respuesta que he agregado
Respuestas:
El problema es un error en el modelo
Mage_Core_Model_Url_Rewrite_Request
(Magento 1.8) yMage_Core_Model_Url_Rewrite
(versiones anteriores).La sección del código central en 1.8 se ve así:
El error: el valor del parámetro de consulta es el código de la tienda, (en mi caso
de
,en
ofr
). Las claves de la matriz devueltasapp->getStores()
son los identificadores numéricos de la tienda. Por esoif (!empty($stores[$fromStore])) {
siempre falla.Una vez que se corrige ese error, otro error se vuelve aparente más adelante en el mismo método (creo que solo en 1.8):
La url base de los objetos de solicitud siempre es Magento base_url, sin el código de la tienda. Usando en su
$currentStore->getBaseUrl()
lugar, también corrige ese error.Una vez que se solucionan esos dos problemas, el conmutador de idiomas funciona bien. Aquí hay una extensión que hace exactamente eso para Magento 1.8 (CE): https://github.com/Vinai/VinaiKopp_StoreUrlRewrites
En Magento 1.7, el problema podría ser algo diferente. Todavía pensé que agregaría esta respuesta, en caso de que Google traiga a alguien más que esté ejecutando 1.8 o más reciente.
fuente
En realidad, encontré una solución para este problema en Magento 1.7.0.2 si está ejecutando Magento 1.8 mira a la explicación detallada de Vinai:
Parece que parte del problema está relacionado con el controlador de solicitud
Mage_Core_Controller_Request_Http
.Si observa la línea 161, existe esta condición:
Al comentarlo, corrijo el error 404 cuando cambio a una tienda diferente en una categoría / páginas de productos.
Sin embargo, por alguna razón desconocida, en algún momento se pierde el código de la tienda en la Url de respuesta, pero esto ya no causa problemas ya que ambas url funcionan ahora:
Todavía no me queda claro si el comentario de esta condición puede causar otro problema
fuente
Mage_Core_Controller_Request_Http
no se puede reescribir en un módulo.Alguna información actualizada para Magento 1.9.1
El error que @Vinai señaló parece estar resuelto en esta versión de todos modos por otra razón, la funcionalidad aún está rota (para productos configurables)
El problema real probablemente esté aquí,
Mage_Catalog_Model_Resource_Url
sin embargo, no tengo tiempo y no quiero tocar una parte tan delicada del núcleo.Explicación para una solución alternativa:
El punto de entrada es siempre esta clase
Mage_Core_Model_Url_Rewrite_Request
y, en particular, el método_rewriteDb()
Cómo
_rewriteDb()
funciona:(139):
$this->_rewrite->loadByRequestPath($requestCases);
___from_store
parámetro(142):
if (!$this->_rewrite->getId() && $fromStore) {
___from_store
:(152):
$this->_rewrite->setStoreId($fromStoreId)->loadByRequestPath($requestCases);
id_path
para cargar el de la tienda actual:(159):
$this->_rewrite->setStoreId($currentStore->getId())->loadByIdPath($this->_rewrite->getIdPath());
Todo se ve bien, sin embargo, hay un problema en los datos de url_rewrite y, por lo tanto, con la funcionalidad de índice (al menos para productos configurables):
El problema es que esta reescritura apunta al error
id_path
(en lugar de apuntar a la identificación del producto configurable, apunta a una de su identificación de producto simple)Ahora, una solución es eliminar la
!$this->_rewrite->getId()
condición y, por lo tanto, magento intenta encontrar una redirección siempre que haya un$fromstore
parámetrocatalog_url
índice y eliminar la reescritura incorrecta que crea.Aquí el código para la solución rápida (necesitará crear un módulo y reescribir la
Mage_Core_Model_Url_Rewrite_Request
clase usted mismo):fuente
La clave de URL es un atributo. Puede editarlo desde: Catálogo -> Atributos -> Administrar atributos . Buscar url_key y haga clic en él.
Cambiar el alcance y guardar.
Ahora puede tener diferentes claves de URL para productos en cada vista de la tienda.
fuente
¿Entonces quieres cambiar la URL para cada vista de tienda?
En la actualidad, ¿modificó la URL del producto en el alcance de la puntuación para que su tienda francesa sea diferente a su tienda inglesa? Y cuando cambias entre los dos, obtienes un 404. Este sería un comportamiento esperado.
Magento no almacenará diferentes reescrituras de URL para otras vistas de la tienda. Entonces, cuando ingresas
/french/product1
a la tienda francesa, la URL coincidirá en la tabla y se cargará. Pero cuando lo golpeas en la tienda en inglés, no habrá coincidencias y, por lo tanto, 404.Parece que lo que necesita es simplemente "Agregar códigos de tienda a la URL", lo que dejará sus claves de URL solas, pero prefijará todas las URL respectivas con su código de tienda. Esto debería permitir que su conmutador de tienda funcione.
fuente