Magento - 按网址加载产品

时间:2012-02-13 02:14:45

标签: magento

如果产品ID不可用且只有产品的网址,那么如何在Magento中加载产品模型?例如,我想从它友好的URL中检索产品模型,例如

electronics/cameras/olympus-stylus-750-7-1mp-digital-camera.html

我在another post中找到了以下代码:

$oRewrite = Mage::getModel('core/url_rewrite')->loadByRequestPath(
    $path
);

但它似乎无法正常工作。 Magento的文档在这方面非常缺乏;有谁知道如何做到这一点?

2 个答案:

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