语言商店特定URL上的Magento 404错误

时间:2013-02-04 06:54:14

标签: magento

我有一个拥有2个语言商店的magento(企业)网站。每个人都有自己的专用URL给定的项目或资源,无论是静态页面还是产品页面。

我通过CMS使用网址规则管理所有资源的SEF网址。

问题是以下情况:

  1. 网站默认为LANG#1。

  2. 当用户从LANG#1切换到LANG#2时,切换没有问题 - 内容切换到特定的lang(_store = lang“> http://www.sitename.com/?_store = lang )

  3. 但无论我在哪家商店,如果我从其他lang商店输入一个网址到我当前的语言商店,我会收到404错误。

  4. 我希望系统检查当前存储所请求的资源。如果没有找到它应该路由到下一个商店并检查那里的资源。如果找到,则商店应切换到找到该商品并重定向网址的lang商店。

    为了达到这个目的,我应该延伸什么课程(我对magento来说很新)。

    我去检查是否可以扩展这个类来做我想做的事:/app/code/core/Mage/Core/Model/Mysql4/Url/Rewrite.php

    但不确定我是否适合这些要求。

    任何帮助将不胜感激!

    由于

2 个答案:

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

}