4

我从 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 的生成输出,但给定我的集合)?

4

1 回答 1

3

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

无论如何,回到你的问题。

在 Magento 中,块不像在任何应用程序中那样被实例化$myvar = new className......几乎从不。本教程可以帮助您更好地理解 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函数中调用)

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

于 2012-10-19T22:30:47.093 回答