Magento:分页过滤产品集合

时间:2012-02-03 13:54:11

标签: php magento

我想过滤和分页产品系列。一切都很好 - 除了分页。我只是收回整个集合,而不是第一页的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 />';
    }

感谢您的支持!

2 个答案:

答案 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 />';
    }