Magento: коллекция продуктов с фильтрацией по пагинату - PullRequest
5 голосов
/ 03 февраля 2012

Я хочу отфильтровать и разбить на страницы коллекцию товаров. все хорошо - кроме нумерации страниц. я просто возвращаю всю коллекцию вместо 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 ]

13 голосов
/ 03 февраля 2012

Ты так близко! Попробуйте переместить эту $product_collection->setPageSize(3)->setCurPage(1); строку до первой foreach() итерации по коллекции.

Коллекции Magento загружаются лениво. Пока вы непосредственно не load() их (или неявно загрузите их через вызов count() или foreach()), вы не можете изменять свойства коллекции, которые влияют на базовый запрос ( EDIT : см. Примечание ниже). После того, как коллекция будет загружена явно или неявно, вы получите только те элементы свойства _items, которые были установлены.

К вашему сведению, вы можете позвонить clear(), чтобы оставить на месте исходные свойства, влияющие на запрос (фильтры, сортировщики, ограничения, объединения и т. Д.), А затем добавить дополнительные свойства.

НТН

РЕДАКТИРОВАТЬ : На самом деле, настройка свойств запроса всегда возможна независимо от состояния загрузки _items, но эффект не будет виден, пока коллекция не будет восстановлена.

4 голосов
/ 04 февраля 2012

Спасибо @ Бен!Вы дали мне правильный намек.Теперь это работает!По сути, я создаю другую коллекцию и фильтрую ее по идентификаторам уже отфильтрованных элементов.После этого легко добавить нумерацию страниц в эту новую коллекцию.Это рабочий код:

    //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 />';
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...