2012-02-03 38 views
5

tôi muốn lọc và phân trang bộ sưu tập sản phẩm. mọi thứ đều ổn - ngoại trừ phân trang. im chỉ nhận lại toàn bộ bộ sưu tập, thay vì 3 mục cho trang đầu tiên.Magento: bộ sưu tập sản phẩm được lọc theo nhóm

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

cảm ơn sự hỗ trợ của bạn!

Trả lời

4

Cảm ơn @Ben! Bạn đã cho tôi gợi ý đúng. Bây giờ nó hoạt động! Về cơ bản tôi đang tạo một bộ sưu tập khác và lọc bộ sưu tập này theo id của các mục đã lọc. Sau đó, dễ dàng thêm phân trang vào bộ sưu tập mới đó. Đó là mã hoạt động:

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

Bạn rất thân thiết! Hãy thử di chuyển đường đó $product_collection->setPageSize(3)->setCurPage(1);trước lần lặp lại đầu tiên foreach() qua bộ sưu tập.

Bộ sưu tập Magento được tải chậm. Cho đến khi bạn trực tiếp load() chúng (hoặc ngầm tải chúng qua cuộc gọi đến count() hoặc foreach()), bạn có thể sửa đổi thuộc tính thu thập ảnh hưởng đến truy vấn cơ bản (EDIT: xem lưu ý bên dưới). Khi bộ sưu tập đã được tải một cách rõ ràng hoặc ngầm, mặc dù bạn sẽ chỉ nhận được các thành viên của thuộc tính _items đã được đặt.

FYI bạn có thể gọi clear() để rời khỏi thuộc tính truy vấn ban đầu (bộ lọc, phân loại, giới hạn, kết nối, v.v.) tại chỗ và sau đó thêm các thuộc tính khác.

HTH

EDIT: Thực ra, điều chỉnh các thuộc tính truy vấn luôn là có thể không phân biệt nhà nước _items tải, nhưng hiệu quả sẽ không được hiển thị cho đến khi bộ sưu tập được tái sinh.

+0

cảm ơn cho đến nay! Tôi đã cố gắng tạo lại bộ sưu tập: '$ product_filtered_collection = new Varien_Data_Collection(); foreach ($ product_collection là $ item) { $ product_filtered_collection-> addItem ($ item); } '... và thêm phân trang vào bộ sưu tập mới này nhưng không hoạt động hoặc –

+0

Ugh. Tôi vừa đọc lại bài đăng của bạn. Bạn sẽ có hai vấn đề lớn hơn để giải quyết. Để phân trang bộ sưu tập của bạn, lọc giá cần phải là một phần của truy vấn ban đầu để tải dữ liệu (mà nó không phải là, vì 'foreach()' tải dữ liệu đầu tiên. Ngoài ra, tùy thuộc vào nhu cầu của bạn, logic giá cuối cùng trong Magento có thể bị ảnh hưởng bởi các nhà quan sát sẽ không chạy cho các mục trong bộ sưu tập này. Xin lỗi! – benmarks

+0

yeah @Ben! bạn đã chỉ cho tôi đúng hướng. Bây giờ nó hoạt động. Tôi sẽ đăng ví dụ làm việc trong khoảng 4h (nguyên nhân tín dụng của tôi quá thấp) về cơ bản là tạo bộ sưu tập mới, lọc theo các id sản phẩm của các mục và phân trang nó sau đó. –

Các vấn đề liên quan