2

在 /app/design/frontend/default/[theme]/template/catalog/product/list.phtml 中,您有以下代码片段循环并显示$_productCollection内容。

<?php $_collectionSize = $_productCollection->count() ?>
<?php $_columnCount = $this->getColumnCount(); ?>
<?php $i=0; foreach ($_productCollection as $_product): ?>
...
<?php endif; ?>

我想知道的是如何按产品类型对 $_productCollection 进行排序。最终我想要的是首先展示可配置的产品,然后是简单的产品。

帮助将不胜感激。

干杯!

4

1 回答 1

2

使类别视图中的产品集合难以定制的原因之一是工具栏、分层导航、实际列表显示甚至与Mage_Review模块之间的耦合,该模块在事件观察器中显式加载集合!

起初,您似乎可以使用典型的收集实用程序(例如addAttributeToSort())来添加您的条件,但您会发现这在模板级别不起作用,因为已经加载了收集数据。我推测被命名的集合 getter 方法是getLoadedProductCollection()来自核心团队的提示。

Magento 集合的延迟加载实现是这样的,一旦它们被load()编辑(直接或间接),它们不会重新加载(即与数据库进行事务处理),除非明确强制这样做。

因此,您需要在集合加载之前设置您的排序参数。跟踪该getLoadedProductCollection()方法可以快速找到该Mage_Catalog_Block_Product_List::_getProductCollection()方法,这是该块确定它是否在产品页面上的地方(通过检查注册表,哎呀)。通过调用栈跟踪collection的状态,可以确定直到block的_beforeToHtml()method才被加载。如果您要从输出中追溯,您可以看到该集合是由 Mage_Review 观察者显式加载的,该观察者使用该catalog_block_product_list_collection事件(请参阅参考资料Mage_Review_Model_Observer::catalogBlockProductCollectionBeforeToHtml())。这给出了起点和终点。

我希望以后有一个解决方案。

于 2012-04-28T15:06:11.190 回答