【问题标题】:Magento - Load product by urlMagento - 通过网址加载产品
【发布时间】:2012-02-13 02:14:45
【问题描述】:

如果产品 id 不可用且只有产品的 url,如何在 Magento 中加载产品模型?例如,我想从它的友好 url 中检索产品模型,例如

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

我在another post找到了如下代码:

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

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

【问题讨论】:

    标签: magento


    【解决方案1】:

    这是另一种解决方案。

    首先使用 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()来定位产品的id:

        $iProductId = $oRewrite->getProductId();
    

    最后,如果您需要产品模型对象本身,那么调用起来很简单:

        $oProduct = Mage::getModel('catalog/product')->load($iProductId);
    

    以上内容与您发布的代码示例之间的主要区别在于对 setStoreId 的调用。同一产品可能有不同的 URL,具体取决于它所在的商店,因此路由组件需要具有适当的商店上下文才能找到要显示的产品。

    与 Zachary Schuessler 的解决方案相比,它的优势在于,如果 url 的尾随部分对于不同的产品(例如 folder1/my-product-name 和 folder2/my -product-name 是不同的产品)。使用 URL 重写器也适用于“folder1/my-product”指不同商店的不同产品的情况。这可能适用于您的环境,也可能不适用于您的环境。

    【讨论】:

    • 啊,是的,将商店 ID 加入其中非常重要。 Mage::getModel('core/url_rewrite') 不会默认对当前store进行操作,不显式设置store id吗?
    • 我确实测试过,自然的假设是它会。但是,当我尝试时,除非明确设置了商店 id,否则 url 重写没有找到产品。
    • 似乎是我一直在寻找的解决方案,但我没有得到 productID,而是得到了NULL。我在后端使用代码,所以 storeID 为零。也许有些事情发生了变化?我不想像这里问的那样创建一个新问题。
    【解决方案2】:

    我很好奇您为什么需要这样做,因为这可能不是最佳解决方案。使用集合上的 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;
    

    【讨论】:

    • 完美运行,谢谢!我正在为产品制作 Netflix 风格的附加信息弹出窗口。由于 Magento 不会(默认情况下)将有关产品的任何语义信息(如 id)添加到呈现的 html 中,因此在发出 ajax 请求时,我只需要查询产品的 url。
    • 使用此方法完成,因为我正在处理后端并且存储始终为zero
    猜你喜欢
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    相关资源
    最近更新 更多