我正在尝试根据产品的网址路径加载重写规则。
我在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上。
答案 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无法满足您的需求,请更新您的问题,并提供有关如何运行代码以及所显示内容的完整说明。有了这些信息,更多的人将能够帮助您。