Многоязычный Magento - двойная смена языковых результатов в 404 (или как изменить язык в магазинах, а не в представлениях) - PullRequest
4 голосов
/ 01 февраля 2012

У меня проблема с установкой magento. Я использовал Magento вер. 1.5.0.1, версия сообщества для разработки этого сайта http://cissmarket.com/.

Проблема возникает, когда я меняю язык с версии ЕС на французский, а затем на немецкий. Смена на французский в порядке, но когда на той же странице я перехожу на немецкий, я получаю ошибку 404. Кроме того, это ошибка 404 поколения в инструментах Google для веб-мастеров, и когда я пытаюсь, например, взять эту ссылку и вставить ее в браузер, она также выдает ошибку 404. У меня там около 50 продуктов и ~ 550 404 ошибок в инструментах Google для веб-мастеров. Я понимаю, что проблема в том, что я описал.

Кроме того, у меня проблема с SEO, так как у меня есть эта страница на французском языке:

http://cissmarket.com/de/cartouches-refilables.html

И когда я переключаюсь на немецкую версию сайта, я перехожу по этой ссылке

http://cissmarket.com/de/cartouches-refilables.html?___from_store=fr (если я попытаюсь сейчас перейти на Великобританию, я получу 404, упомянутых выше)

вместо того, чтобы перейти к этому:

http://cissmarket.com/de/nachfullpatronen.html

Уже проверил эту ошибку 404 при переключении между магазинами в категории на magento , но это не относится к моей проблеме.

О настройках:

  • Я использую службу кэширования, а также проиндексировал весь контент.
  • Продукт или категория, к которой я пытаюсь получить доступ, доступна и активна для всех языков.
  • Система> Общие> Интернет> Параметры URL> Добавить код магазина в URL установлен да.
  • Система> Общие> Интернет> Оптимизация поисковых систем> Использование веб-сервера Для перезаписи установлено значение yes.
  • В файл .htaccess не было внесено никаких других изменений, кроме те, которые сама система сделала.

Итак, в заключение: проблема заключается в 404, заданных двумя последовательными изменениями языка и неверным адресом URL, когда я переключаюсь с одной страницы на другую.

Будем благодарны за любые предложения.

ОБНОВЛЕНИЕ: пробовал это http://www.activo.com/how-to-avoid-the-___from_store-query-parameter-when-switching-store-views-in-magento, но это приводит к 404 при первом изменении языка

Редактировать # 1:

Обнаружена проблема: файл languages.phtml содержал этот код <?php echo str_replace ("/fr/","/de/",$_lang->getCurrentUrl()); ?> и фактически заменял только код языка, а не весь URL в соответствии с соответствующим переводом.

Так применимо к этому

http://cissmarket.com/fr/cartouches-refilables.html

вернется

http://cissmarket.com/de/cartouches-refilables.html

Так кто-нибудь знает, как получить соответствующий URL текущей страницы для других языков, доступных в магазине?

Редактировать # 2 (используя решение @Vinai):

Работает на страницах товара, но пока не в категории.

Ответы [ 6 ]

7 голосов
/ 08 февраля 2012

Насколько я знаю, в родном Magento такого нет.
Тем не менее, вы можете использовать следующий код, чтобы получить URL текущей страницы для каждого магазина.

$resource = Mage::getSingleton('core/resource');
$requestPath = Mage::getSingleton('core/url')->escape(
    trim(Mage::app()->getRequest()->getRequestString(), '/')
);

$select = $resource->getConnection('default_read')->select()
    ->from(array('c' => $resource->getTableName('core/url_rewrite')), '')
    ->where('c.request_path=?', $requestPath)
    ->where('c.store_id=?', Mage::app()->getStore()->getId())
    ->joinInner(
        array('t' => $resource->getTableName('core/url_rewrite')),
        "t.category_id=c.category_id AND t.product_id=c.product_id AND t.id_path=c.id_path",
        array('t.store_id', 't.request_path')
    );
$storeUrls = (array) $resource->getConnection('default_read')
    ->fetchPairs($select);

Это даст вам массив с ключом массива, являющимся идентификаторами хранилища, и значениями массива, являющимися путем запроса после базового URL Magento, например, если ваш французский магазин имеет идентификатор 1, а немецкий - 2, вы получите:

Array
(
    [1] => cartouches-refilables.html
    [2] => nachfullpatronen.html
)

Затем в цикле foreach, где выводится URL для каждого магазина, используйте

<?php $url = isset($storeUrls[$_lang->getId()]) ? $_lang->getUrl($storeUrls[$_lang->getId()]) : $_lang->getCurrentUrl() ?>

При вызове $_lang->getUrl() будет добавлен базовый URL, поэтому вы получите полный URL для каждого магазина (например, http://cissmarket.com/de/nachfullpatronen.html). Если в таблице core_url_rewrite не найдено значение представления магазина, оно будет возвращено к поведение по умолчанию.

Вам все еще нужен параметр запроса ___store=fr, потому что в противном случае Magento будет думать, что вы пытаетесь получить доступ к новому пути в контексте старого хранилища. К счастью, getUrl() модель магазина добавляет это для вас автоматически.

Код, запрашивающий базу данных, может быть где угодно (начиная с PHP), даже в шаблоне, но, пожалуйста, не помещайте его туда. Правильным местом для получения кода для доступа к базе данных является модель ресурса . Я предлагаю вам создать модель ресурса и поместить ее в метод там.

3 голосов
/ 22 октября 2012

Я нашел некрасивое исправление, пока не появился лучший подход.

В разделе администратора я добавил следующий javascript внутри wysiwyg в CMS> PAGES> (Мои 404 страницы) (в начале wysiwyg):

<script type="text/javascript" language="javascript">// <![CDATA[
var lang = "en";
var rooturl = "{{config path="web/unsecure/base_url"}}"
var url = document.location.href;
if(!(url.match("/"+lang+"/")))
{
  var newUrl = url.replace(rooturl , rooturl+lang+"/" );
  window.location.href = newUrl;
}
// ]]></script>

(Примечание: вам нужно сделать это для всех ваших переведенных 404 страниц. На каждой странице 404 вам нужно изменить lang = "en" в качестве значения URL-адреса вашего магазина)

Поскольку wysiwyg (tiny_mce) не разрешает угрожать javascript, вам придется изменить js /маг / adminhtml / WYSIWYG / TinyMCE / setup.js .Добавьте следующий код в строку 97 (под «var settings =»):

extended_valid_elements : 'script[language|type|src]',
1 голос
/ 02 марта 2013

Для Magento 1.7.0.2 и 1.8.0.0 это исправление:

Начиная со строки 251 /app/code/core/Mage/Core/Model/Url/Rewrite.php

Mage::app()->getCookie()->set(Mage_Core_Model_Store::COOKIE_NAME, $currentStore->getCode(), true);

// endur 02-03-2013 fix for missed store code

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

if (Mage::getStoreConfig('web/url/use_store') && $storeCode = Mage::app()->getStore()>getCode()) { 
    $targetUrl = $request->getBaseUrl(). '/' . $storeCode . '/' .$this->getRequestPath();
    } else {
      $targetUrl = $request->getBaseUrl(). '/' . $this->getRequestPath();
    }

// endur 02-03-2013 end

Обязательно создайте пользовательскую копию файла в: /app/code/local/Mage/Core/Model/Url/Rewrite.php или: /app/code/local/YourTheme/Mage/Core/Model/Url/Rewrite.php

Источник:

0 голосов
/ 11 марта 2014

ребята.Для этой ошибки есть модуль magento.Уже переписали 2 модели http://www.magentocommerce.com/magento-connect/fix-404-error-in-language-switching.html

0 голосов
/ 08 января 2013

Похоже, ошибка в Magento 1.7. Вот взлом, который работал для меня. Он должен работать для двухязычного магазина с кодом магазина в URL

в var / www / html / shop1 / app / code / core / Mage / Core / Model / Url / Rewrite.php

удалить эту строку

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

и добавьте их:

 $storecode = Mage::app()->getStore()->getCode();
 if ($storecode='en')
 {
    $targetUrl = $request->getBaseUrl(). '/'.$storecode.'/' . $this->getRequestPath();
 }
 else
 {
    $targetUrl = $request->getBaseUrl(). '/' . $this->getRequestPath();
 }
0 голосов
/ 23 декабря 2012

Вот еще одно решение этой проблемы. Просто добавьте этот код после "$ this-> load ($ pathInfo, 'request_path');" в приложении / код / ​​ядро ​​/ маг / ядро ​​/ модель / URL / переписать.php:

        if (!$this->getId() && !isset($_GET['___from_store'])) {
            $db = Mage::getSingleton('core/resource')->getConnection('default_read');
            $result = $db->query('select store_id from core_url_rewrite WHERE request_path = "' . $pathInfo . '"');
            if ($result) {
                $storeIds = array();
                if($row = $result->fetch(PDO::FETCH_ASSOC)) {
                    $storeId = $row['store_id'];
                    $storeCode = Mage::app()->getStore($storeId)->getCode();

                    header("HTTP/1.1 301 Moved Permanently");
                    header("Location: http://" . $_SERVER['HTTP_HOST'] . "/" . $pathInfo . "?___store=" . $storeCode);
                    exit();
                }
            }
        }
...