我想过滤和分页产品系列。一切都很好 - 除了分页。我只是收回整个集合,而不是第一页的3个项目。
//fetch all visible products
$product_collection = Mage::getModel('catalog/product')->getCollection();
//set wanted fields (nescessary for filter)
$product_collection->addAttributeToSelect('name');
$product_collection->addAttributeToSelect('description');
$product_collection->addAttributeToSelect('price');
$product_collection->addAttributeToFilter('visibility', array('neq' => 1));
//filter by name or description
$product_collection->addFieldToFilter(array(
array('attribute'=>'name','like'=>$sTerm),
array('attribute'=>'description','like'=>$sTerm)
));
//filter for max price
foreach ($product_collection as $key => $item) {
if($item->getPrice() >= $priceTo){
$product_collection->removeItemByKey($key);
}
}
//pagination (THIS DOESNT WORK!)
$product_collection->setPageSize(3)->setCurPage(1);
//TEST OUTPUT
foreach ($product_collection as $product) {
echo $product->getName().'<br />';
}
感谢您的支持!
答案 0 :(得分:13)
你真是太近了!尝试在第一次$product_collection->setPageSize(3)->setCurPage(1);
次迭代之前移动foreach()
行。
Magento系列是懒惰的。在您直接load()
之前(或通过调用count()
或foreach()
隐式加载它们),您可以修改影响基础查询的集合属性(编辑 :见下面的注释)。显式或隐式加载集合后,虽然您只会获得已设置的_items
属性的成员。
仅供参考,您可以致电clear()
以保留原始查询影响属性(过滤器,排序器,限制,联接等),然后添加更多属性。
HTH
编辑:实际上,无论_items加载状态如何,总是可以调整查询属性,但在重新生成集合之前,效果将不可见。
答案 1 :(得分:4)
谢谢@Ben!你给了我正确的提示。现在它确实有效!基本上我正在创建另一个集合,并通过已过滤项目的ID过滤此集合。之后很容易为新系列添加分页。这是工作代码:
//fetch all visible products
$product_collection = Mage::getModel('catalog/product')->getCollection();
//set wanted fields (nescessary for filter)
$product_collection->addAttributeToSelect('name');
$product_collection->addAttributeToSelect('description');
$product_collection->addAttributeToSelect('price');
$product_collection->addAttributeToFilter('visibility', array('neq' => 1));
//filter by name or description
$product_collection->addFieldToFilter(array(
array('attribute'=>'name','like'=>$sTerm),
array('attribute'=>'description','like'=>$sTerm)
));
//filter for max price
foreach ($product_collection as $key => $item) {
if($item->getPrice() >= $priceTo){
$product_collection->removeItemByKey($key);
}
}
//build id array out of filtered items (NEW!)
foreach($product_collection as $item){
$arrProductIds[]=$item->getId();
}
//recreate collection out of product ids (NEW)
$product_filtered_collection = Mage::getModel('catalog/product')->getCollection();
$product_filtered_collection->addAttributeToFilter('entity_id', array('in'=>$arrProductIds));
//add pagination (on new collection) (NEW)
$product_filtered_collection->setPageSize(3)->setCurPage(1);
//TEST OUTPUT
foreach ($product_filtered_collection as $product) {
echo $product->getName().'<br />';
}