loadByRequestPath()使用当前URL路径覆盖参数

时间:2011-12-27 17:38:38

标签: magento

我正在尝试根据产品的网址路径加载重写规则。

我在Mage_Core_Model_Url_Rewrite中使用loadByRequestPath()方法来完成此任务。但是,无论我提供什么方法​​,我都会得到以下结果(检查代码中的注释):

public function loadByRequestPath($path)
{ 
    Zend_Debug::dump($path); // returns the path to my module
    $this->setId(null);
    $this->_getResource()->loadByRequestPath($this, $path);
    $this->_afterLoad();
    $this->setOrigData();
    $this->_hasDataChanges = false;
    return $this;
}

这是我的模块代码:

$productRewrite = Mage::getModel('core/url_rewrite') ->loadByRequestPath($product->getUrlPath());

奇怪的是,我得到了回复:

Array ( [0] => rewrites/getProductRewrites
        [1] => rewrites/getProductRewrites/ )
Array ( [0] => 01003-product-name )

因此无论出于何种原因,loadByRequestPath()都会被调用两次。 $ productRewrite仍然返回一个空对象。

我已经验证$ product-> getUrlPath()会返回正确的路径。 (如第二个数组所示)

我在Magento 1.6.1上。

1 个答案:

答案 0 :(得分:4)

你的问题仍然有点不清楚,所以这个答案可能无法解决你所看到的具体问题。

多年来,Magento的核心团队在沟通这些事情方面做得并不好,但loadByRequestPath是最好被认为是“私人api”的方法之一。不是在OOP意义上,而是在“这是一种用于实现核心系统功能的方法,并且可能不会像你认为的那样工作,所以使用风险自负”。

您尝试使用的PHP代码

$productRewrite = Mage::getModel('core/url_rewrite') ->loadByRequestPath($product->getUrlPath());

将无法使用默认安装的Magento,因为重写对象没有设置商店ID。尝试这样的事情应该有效。 (假设样本数据,安装的商店对象的ID为“1”,并且该商店中存在该产品)

$productRewrite = Mage::getModel('core/url_rewrite');
$productRewrite->setStoreId(1);
$productRewrite->loadByRequestPath($product->getUrlPath());

loadByRequestPath方法假设重写已经设置了商店ID,因为它是Magento较大的dispatching process的一部分。 (自我链接到描述Magento路由系统中重写角色的文章)

所有这一切,你所描述的问题有些令人困惑。你说那个

Zend_Debug::dump($path);

返回

  

包含模块路径的数组

虽然我确定知道短语“我的模块的路径”是什么意思,但它在较大的magento宇宙中是一个毫无意义的术语。更具体的文字价值将有助于人们理解你的意思。

另外,你也说

  

我已经验证$ product-> getUrlPath()会返回正确的路径。

但你不清楚“正确路径”的价值。

我的猜测是您在Zend_Debug::dump中看到的路径是作为标准发送的一部分而来的呼叫,您使用$product->getUrlPath()的后续呼叫。但是,你的问题缺乏明确性,这很难说清楚。

如果设置商店ID无法满足您的需求,请更新您的问题,并提供有关如何运行代码以及所显示内容的完整说明。有了这些信息,更多的人将能够帮助您。