Magento 多语言 - 语言的双重变化导致 404(或如何在商店而不是视图中更改语言)
Posted
技术标签:
【中文标题】Magento 多语言 - 语言的双重变化导致 404(或如何在商店而不是视图中更改语言)【英文标题】:Magento multilanguage - double change in language resuts in 404 (or how to change language within stores not views) 【发布时间】:2012-02-24 04:19:40 【问题描述】:我在安装 magento 时遇到问题。我用的是 Magento 版本。 1.5.0.1,社区版开发本站http://cissmarket.com/。
当我将语言从欧盟版本更改为法语然后再更改为德语时出现问题。改成法语没问题,但是当我在同一页面中改成德语时,我收到 404 错误。这也是 Google 网站管理员工具中的第 404 代错误,当我尝试获取此链接并将其粘贴到浏览器中时,它也会给我一个 404 错误。我在 Google 网站管理员工具中有大约 50 种产品和约 550 404 个错误。我知道问题出在我的描述中。
此外,我有一个搜索引擎优化问题,因为我有这个法语页面:
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 error when switching between stores when in a category on magento,但它与我的问题无关。
关于设置:
我使用缓存服务,还索引了所有内容。 我尝试访问的产品或类别可用并针对所有语言设置为活动状态。 系统 > 常规 > Web > URL 选项 > 将商店代码添加到 URL 已设置 是的。 系统 > 常规 > Web > 搜索引擎优化 > 使用 Web 服务器 重写设置为是。 .htaccess 文件除了 系统自己制作的。所以总结一下:问题是我从一个页面切换到另一个页面时,两次连续更改语言和错误的 url 地址给出的 404。
任何建议将不胜感激。
更新:尝试了这个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 解决方案):
它适用于产品页面,但不适用于类别。
【问题讨论】:
【参考方案1】:据我所知,原生 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);
这将为您提供一个数组,其中数组键是商店 ID,数组值是 Magento 基本 URL 之后 的请求路径,例如假设您的法国商店的 ID 为 1,而德国商店的 ID 为 2,您将获得:
Array
(
[1] => cartouches-refilables.html
[2] => nachfullpatronen.html
)
然后,在输出每个商店的 URL 的 foreach
循环中,使用
<?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),甚至在模板中,但请不要放在那里。 拥有访问数据库的代码的正确位置是资源模型。我建议您创建一个资源模型并将其放入其中的方法中。
【讨论】:
我会检查并返回答案!谢谢! 非常感谢您的回答。它可以正常工作,但不能在类别页面上,而只能在产品页面上。我用print_r($storeUrls);
尝试了简单版本的输出,在类别页面上数组是空的,但是在产品页面上它返回正确的元素数组,如你所说。【参考方案2】:
在找到更好的方法之前,我发现了一个丑陋的补丁。
在管理部分,我在 CMS > PAGES >(我的 404 页面)(在所见即所得的开头)的所见即所得中添加了以下 javascript:
<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" 为您的商店浏览网址值)
因为所见即所得 (tiny_mce) 不允许 javascript 受到威胁,所以您必须修改 js/mage/adminhtml/wysiwyg/tinymce/setup.js。在第 97 行(“var settings =”下)添加以下代码:
extended_valid_elements : 'script[language|type|src]',
【讨论】:
以这种方式链接到您自己的网站可能最终会将您的帖子作为垃圾邮件删除。我正在删除链接,因为没有它你的答案似乎很好。请不要重新添加。【参考方案3】:对于 Magento 1.7.0.2 和 1.8.0.0,这是错误修复:
从/app/code/core/Mage/Core/Model/Url/Rewrite.php的第251行开始
:
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
source:
【讨论】:
【参考方案4】:它看起来像 Magento 1.7 中的一个错误。这是一个对我有用的hack。 它应该适用于在 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();
【讨论】:
【参考方案5】:这里有另一个解决这个问题的方法。只需在 "$this->load($pathInfo, 'request_path');" 之后添加此代码在 app/code/core/Mage/Core/Model/Url/Rewrite.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();
【讨论】:
这个解决方案看起来很有趣。谁能确认它会起作用并且不会产生其他问题?【参考方案6】:伙计们。对于这个错误,有 magento 模块。它有重写2个模型 http://www.magentocommerce.com/magento-connect/fix-404-error-in-language-switching.html
【讨论】:
以上是关于Magento 多语言 - 语言的双重变化导致 404(或如何在商店而不是视图中更改语言)的主要内容,如果未能解决你的问题,请参考以下文章