我有一个拥有2个语言商店的magento(企业)网站。每个人都有自己的专用URL给定的项目或资源,无论是静态页面还是产品页面。
我通过CMS使用网址规则管理所有资源的SEF网址。
问题是以下情况:
网站默认为LANG#1。
当用户从LANG#1切换到LANG#2时,切换没有问题 - 内容切换到特定的lang(_store = lang“> http://www.sitename.com/?_store = lang )
但无论我在哪家商店,如果我从其他lang商店输入一个网址到我当前的语言商店,我会收到404错误。
我希望系统检查当前存储所请求的资源。如果没有找到它应该路由到下一个商店并检查那里的资源。如果找到,则商店应切换到找到该商品并重定向网址的lang商店。
为了达到这个目的,我应该延伸什么课程(我对magento来说很新)。
我去检查是否可以扩展这个类来做我想做的事:/app/code/core/Mage/Core/Model/Mysql4/Url/Rewrite.php
但不确定我是否适合这些要求。
任何帮助将不胜感激!
由于
答案 0 :(得分:1)
我能够解决这个问题。我所做的就是扩展/app/code/core/Mage/Core/Model/Mysql4/Url/Rewrite.php文件。
所以我重写了loadByRequestPath函数以在当前商店中提供请求,如果找不到,则获取所有其他可用商店的列表,循环并查找该项是否存在。如果找到,则重定向到存储产品和URL的URL密钥的商店。
如果没有商店有,那么返回404错误。
对于静态页面,当您切换商店/语言时,URL重写管理器将能够为您解决问题。
我希望这有助于某人!
答案 1 :(得分:0)
我不认为我的解决方案是最优雅的,但无论如何我会发布它,因为它对我有用。 基本上我在所有商店中搜索我正在寻找的路径而不是指定的商店。任何建议都会受到欢迎。
我的config.xml
<?xml version="1.0"?>
<config>
<global>
<modules>
<Soipo_UrlRewrite>
<version>0.1</version>
</Soipo_UrlRewrite>
</modules>
<models>
<soipo_urlrewrite>
<class>Soipo_UrlRewrite_Model</class>
</soipo_urlrewrite>
<core_mysql4>
<rewrite>
<url_rewrite>Soipo_UrlRewrite_Model_Mage_Core_Model_Mysql4_Url_Rewrite</url_rewrite>
</rewrite>
</core_mysql4>
</models>
</global>
</config>
Rewrite.php
类Soipo_UrlRewrite_Model_Mage_Core_Model_Mysql4_Url_Rewrite扩展Mage_Core_Model_Mysql4_Url_Rewrite {
/**
* This function get an array of store ids, containing the Admin store.
* @return array
*/
public function getStoreIds(){
$allStores = Mage::app()->getStores();
$storeIds = array();
$storeIds[] = Mage_Core_Model_App::ADMIN_STORE_ID;
foreach ($allStores as $_eachStoreId => $val)
{
$_storeId = Mage::app()->getStore($_eachStoreId)->getId();
$storeIds[] = $_storeId;
}
return $storeIds;
}
/**
* Load rewrite information for request
* If $path is array - we must load all possible records and choose one matching earlier record in array
*
* @param Mage_Core_Model_Url_Rewrite $object
* @param array|string $path
* @return Mage_Core_Model_Resource_Url_Rewrite
*/
public function loadByRequestPath(Mage_Core_Model_Url_Rewrite $object, $path)
{
if (!is_array($path)) {
$path = array($path);
}
$pathBind = array();
foreach ($path as $key => $url) {
$pathBind['path' . $key] = $url;
}
$storeIds = $this->getStoreIds();
// Form select
$adapter = $this->_getReadAdapter();
$select = $adapter->select()
->from($this->getMainTable())
->where('request_path IN (:' . implode(', :', array_flip($pathBind)) . ')')
->where('store_id IN(?)', $storeIds);
$items = $adapter->fetchAll($select, $pathBind);
// Go through all found records and choose one with lowest penalty - earlier path in array, concrete store
$mapPenalty = array_flip(array_values($path)); // we got mapping array(path => index), lower index - better
$currentPenalty = null;
$foundItem = null;
foreach ($items as $item) {
if (!array_key_exists($item['request_path'], $mapPenalty)) {
continue;
}
$penalty = $mapPenalty[$item['request_path']] << 1 + ($item['store_id'] ? 0 : 1);
if (!$foundItem || $currentPenalty > $penalty) {
$foundItem = $item;
$currentPenalty = $penalty;
if (!$currentPenalty) {
break; // Found best matching item with zero penalty, no reason to continue
}
}
}
// Set data and finish loading
if ($foundItem) {
$object->setData($foundItem);
}
// Finish
$this->unserializeFields($object);
$this->_afterLoad($object);
return $this;
}
}