【问题标题】:Magento - get results view HTML for a collection of productsMagento - 获取产品集合的结果视图 HTML
【发布时间】:2012-10-19 18:57:31
【问题描述】:

我从 Web 服务获得了一个 magento id 列表。我将这些加载到数组$product_ids 中,所以我有这样的东西:

Array
(
    [0] => 1965
    [1] => 3371
    [2] => 1052
)

然后我可以把它变成一个集合:

$collection = Mage::getModel('catalog/product')->getCollection()
            ->addIdFilter($product_ids);

使用我的 Magento 检查器,我看到类别页面使用 Mage_Catalog_Block_Product_List 类来显示产品列表。我想在课堂上做类似的事情。我试过加载:

$ProductList = new Mage_Catalog_Block_Product_List();
$ProductList->setCollection($collection);

然后我尝试加载结果的 HTML 如下:

$CollectionHTML = $ProductList->_toHtml();

但是$CollectionHTML 是空的。

我如何获得您在列表视图中看到的 HTML(即前端/base/default/template/catalog/product/list.phtml 的生成输出,但给定我的集合)?

【问题讨论】:

  • 为什么要绕过 LAYOUT 层(xml 布局文件)?在 magento 中,您不应该直接实例化 PHP Block 类。您必须通过 $this->getLayout()->createBlock('catalog/product_list') 加载它或让 Layout 文件执行此操作(这是他们的目的)。我建议你阅读/学习 magento 教程/书籍
  • @Bixi 我同意关注点分离,原则上也同意你的观点,感谢您提出这一点,因为其他用户不应该认为这不是理想的解决方案。但我不想在这里进行哲学辩论。我必须维护一个脚本并按照您的方式(正确的方式)做事将涉及大量重构。因此我的问题。

标签: magento


【解决方案1】:

在 Magento 中让代码以正确的方式工作比尝试使用丑陋的遗留代码要容易得多。当您有具体问题时,我很乐意帮助您以正确的方式编写代码。此外,从长远来看,技术债务的成本会更高。

不管怎样,回到你的问题。

在 Magento 中,块没有像在任何应用程序中那样被实例化 $myvar = new className ... 几乎从不。 This tutorial 可以帮助您更好地理解 Magento 的布局和块。

但是如果你想创建一个块,一个方法是:

$block = Mage::getSingleton('core/layout')->createBlock('catalog/product_list')

现在与您的产品集合相关,您应该检查Mage_Catalog_Block_Product_List::_getProductCollection 的实际工作方式,因为它使用分层导航,而不是简单的产品集合。

进一步,假设您至少在使用 Magento 控制器并且您在一个函数中,以下代码将显示指定类别的产品的第一页:

//$category_id needs to be set
$layout = Mage::getSingleton('core/layout');
$toolbar = $layout->createBlock('catalog/product_list_toolbar');
$block = $layout->createBlock('catalog/product_list');
$block->setChild('toolbar', $toolbar);
$block->setCategoryId($category_id);
$block->setTemplate('catalog/product/list.phtml');  
$collection = $block->getLoadedProductCollection();
$toolbar->setCollection($collection);
//render block object 
echo $block->renderView();  

显示特定的ID:

  • 您将根类别 ID 用于 $category_id 变量(还要确保设置了显示根类别(或包含您的产品 ID 的其他类别 ID)
  • 您可以挂钩catalog_block_product_list_collection 事件以将您的ID 过滤器添加到集合中(这在_beforeToHtml 函数中调用)

但是,所有这些结构并不牢固,还有一些需要注意的地方(其他子块、过滤器等)

【讨论】:

  • 感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2011-12-14
  • 1970-01-01
  • 1970-01-01
  • 2014-10-21
  • 1970-01-01
  • 1970-01-01
  • 2013-06-20
  • 2014-09-19
相关资源
最近更新 更多