Pregunta

Por URL Key por defecto en la página del producto está en el ámbito global.

EDIT: Según lo sugerido por el alcance FlorinelChis puede haber cambios en los atributos Administrar. Sin embargo, esto se rompe el comportamiento tienda selector de visualización.

Esto se ha probado en 1.7.0.2 con los datos de las muestras y los "Añadir código de tienda para URL" habilitado

  1. editar un producto y establecer una URL diferente para un storeview en particular (francés)
  2. Re-index
  3. Abre la página del producto en el sitio de la tienda en Inglés
  4. Cambiar a francés: usted tendrá la URL de la página containg /French/
  5. Atrás Cambiar a Inglés -> página de error 404 (la url se pierda el código de la tienda /default/

    ¿Cómo hacer que funcione correctamente con el interruptor tienda Ver / idioma?

Detalles de:

  • URL de Inglés: /default/sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html
  • URL de francés: /french/sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html

Si estoy en el sitio Inglés en esta página -> /default/sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html

A continuación, me cambio a francés:

Tengo esta URL ( el código de la tienda se pierde ):
MAGEDOMAIN/sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html

Así Magento re-escribir la dirección URL correctamente, pero se pierda el código de la tienda por alguna razón

Referencia:

Para que esto se relaciona con /core/model/store.php y /core/model/url/rewrite.php, y en particular a aquellos métodos:

Mage_Core_Model_Url_Rewrite::rewrite
Mage_Core_Model_Store::getCurrentUrl

Actualizar

Si usted está en 1.9.1 fix @Vinai no trabajo, comprobar la nueva respuesta que he añadido

¿Fue útil?

Solución 3

Algo de información actualizada para Magento 1.9.1

El error @Vinai señaló miradas resueltos en esta versión de todos modos por otra razón la funcionalidad todavía está roto (para productos configurables)

El problema real es probablemente un problema aquí, sin embargo Mage_Catalog_Model_Resource_Url no tengo tiempo y yo no' quieren tocar una tan delicada parte del núcleo.

Explicación para una solución:

El punto de entrada es siempre esta classMage_Core_Model_Url_Rewrite_Request y en particular la _rewriteDb() método

Cómo funciona _rewriteDb():

  1. En primer lugar, tratar de cargar la solicitud de la tienda actual

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

  1. a continuación, si yo no lo encuentro (sin identificación) y tiene una ___from_store parámetro

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

  1. intentará cargar una reescritura de la ___from_store:

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

  1. si lo encuentra, utilice el id_path para cargar el uno para 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 url_rewrite Y así, con la funcionalidad de índice (al menos para productos configurables):

  • incluso si estamos cambiando tienda y la nueva tienda tiene diferentes url una reescritura en la línea 139 se carga.

El problema es que esta reescritura apunta a la id_path mal (en vez de apuntar a la Identificación del producto configurable que está apuntando a uno de su simple identificación del producto)

Ahora, una solución consiste en remover la condición !$this->_rewrite->getId() Magento y así tratar de encontrar una redirección siempre cuando hay un $fromstore parámetro

  • Lo mejor sería fijar el índice catalog_url y quitar el mal reescribir que crea.

A continuación, el código para la solución rápida (se necesita para crear un módulo y volver a escribir la clase Mage_Core_Model_Url_Rewrite_Request por su cuenta propia):

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

Otros consejos

El problema es un error en el modelo Mage_Core_Model_Url_Rewrite_Request (Magento 1.8) y Mage_Core_Model_Url_Rewrite (versiones anteriores).

La sección del código del núcleo en 1.8 se ve así:

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

El error: el valor del parámetro de consulta es el código de la tienda, (en mi caso de, en o fr). Las claves de la matriz devuelta por app->getStores() son los identificadores numéricos . Es por eso que if (!empty($stores[$fromStore])) { siempre falla.

Una vez que el error se corrige, otro error se hace evidente más adelante en el mismo método (creo que sólo en 1.8):

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

La solicitud de objetos URL base siempre es la base_url Magento, sin el código de tienda. Utilizando en su lugar hay $currentStore->getBaseUrl() corrige ese error, también.

Una vez que esos dos problemas se corrigen el idioma conmutador funciona bien. Aquí es 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 pensaba que me gustaría añadir esta respuesta, por si acaso Google trae a alguien más aquí que se está ejecutando 1.8 o posterior.

En realidad he encontrado una solución para este problema en Magento 1.7.0.2 si está ejecutando Magento 1.8 miradas a la explicación detallada de Vinai:

Parece que parte del problema está relacionado con el controlador de Mage_Core_Controller_Request_Http petición.

Si nos fijamos en la línea 161 no es esta condición:

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

Al comentar a cabo corregir el error 404 cuando cambio a una tienda diferente en una categoría de productos / páginas.

Sin embargo, por alguna razón desconocida algún tiempo, el código de la tienda se pierde en la respuesta Url pero esto no causa problema más ya que ambos url funciona ahora:

  • MAGEDOMAIN / sony-vaio-VGN-TXN27N-b-11-1-notebook-pc-french.html
  • MAGEDOMAIN / Sony-vaio-vgn-TXN27N-b-11-1-notebook-pc.html

stil no me queda claro si el comentario de esta condición puede causar otro problema

clave URL es un atributo. Puede editarlo en: Catálogo -> Atributos -> Administrar Atributos . Buscar url_key y haga clic en él. Editar atributo url_key

Cambiar la Alcance y Guardar.

Ahora usted puede tener diferentes claves de URL para los productos en cada vista de tienda.

Así que desea cambiar la URL de cada vista de tienda?

En la actualidad, se modifica la URL del producto en el ámbito marcador para su tienda francesa sea diferente a su tienda de Inglés? Y cuando se cambia entre los dos, se obtiene un comportamiento 404. Esto era de esperar.

Magento no almacenará diferentes reescrituras de URL para otros puntos de vista de las tiendas. Así que cuando se pulse /french/product1 en la tienda francesa, la URL coincidirá en la tabla y se carga. Pero cuando le pegas en la tienda Inglés, no habrá partido y así lo hará 404.

Lo que suena como que necesita es simplemente "Añadir códigos de tienda a URL" - que dejar las llaves de URL solo, pero delante de todos los URL respectivos con su código de tienda. Esto debería permitir que su tienda de conmutación a la función.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top