如果产品ID不可用且只有产品的网址,那么如何在Magento中加载产品模型?例如,我想从它友好的URL中检索产品模型,例如
electronics/cameras/olympus-stylus-750-7-1mp-digital-camera.html
我在another post中找到了以下代码:
$oRewrite = Mage::getModel('core/url_rewrite')->loadByRequestPath(
$path
);
但它似乎无法正常工作。 Magento的文档在这方面非常缺乏;有谁知道如何做到这一点?
答案 0 :(得分:19)
这是另一种解决方案。
首先使用URL重写模型查找与您的产品匹配的路线:
$vPath = 'electronics/cameras/olympus-stylus-750-7-1mp-digital-camera.html';
$oRewrite = Mage::getModel('core/url_rewrite')
->setStoreId(Mage::app()->getStore()->getId())
->loadByRequestPath($vPath);
然后你可以在路线上调用getProductId()来找到produc的id:
$iProductId = $oRewrite->getProductId();
最后,如果你需要产品模型对象,那么调用它是一件简单的事情:
$oProduct = Mage::getModel('catalog/product')->load($iProductId);
上面的主要区别和你发布的代码示例是对setStoreId的调用。同一产品可能具有不同的URL,具体取决于它所在的商店,因此路由组件需要具有相应的商店上下文才能找到要显示的产品。
这比Zachary Schuessler的解决方案的优势在于,如果URL的尾部对于不同的产品是相同的,使用URL重写器将每次找到正确的产品(例如folder1 / my-product-name和folder2 / my -product-name是不同的产品)。使用URL重写器也适用于“folder1 / my-product”指不同商店中的不同产品的情况。这可能适用于您的环境,也可能不适用。
答案 1 :(得分:3)
我很好奇为什么你需要这样做,因为这可能不是最好的解决方案。这应该很容易使用集合上的addAttributeToFilter()方法:
$path = 'folder/folder/my-product-name';
// Get the product permalink
$productName = explode('/', $path);
$productName = end($productName);
// Filter the url_path with product permalink
$products = Mage::getModel('catalog/product')->getCollection();
$products->addAttributeToFilter('url_path', $productName)
->getFirstItem();
Zend_Debug::dump($products->getData());exit;