Một cách khác:
Trong ví dụ này, $categoryIds
là một mảng các Id danh mục. (Tôi thường sử dụng $collection->getFlag('category_ids')
nhưng đã thay đổi cho ví dụ này, xem phần giải thích thấp hơn)
$currentStoreId
được điền bởi bất kỳ phương tiện nào có thể có được id cửa hàng hiện tại. (trong sự kiện quan sát của tôi, tôi sử dụng $collection->getFlag('store_id')
)
$conditions = array(
'cat_index.product_id=e.entity_id',
$collection->getConnection()->quoteInto('cat_index.category_id IN (' . $categoryIds . ')', "")
);
if (!Mage::app()->getStore()->isAdmin()) {
$conditions[] = $collection->getConnection()->quoteInto('cat_index.store_id=?', $currentStoreId );
}
$joinCond = join(' AND ', $conditions);
$fromPart = $collection->getSelect()->getPart(Zend_Db_Select::FROM);
if (isset($fromPart['cat_index'])) {
$fromPart['cat_index']['joinCondition'] = $joinCond;
$collection->getSelect()->setPart(Zend_Db_Select::FROM, $fromPart);
} else {
$collection->getSelect()->join(
array('cat_index' => $collection->getTable('catalog/category_product_index')), $joinCond, array('cat_index_category_id' => 'category_id')
);
}
Tôi sử dụng đoạn mã trên trong một trình quan sát để lọc với nhiều danh mục SAU cuộc gọi được tích hợp Mage_Catalog_Model_Resource_Product_Collection::_applyProductLimitations()
thực hiện điều đó, vì nó gửi một sự kiện được gọi là'catalog_product_collection_apply_limitations_after'
Các _applyProductLimitations
phương pháp chủ yếu được áp dụng các bộ lọc được thiết lập bởi các cuộc gọi đến addCategoryFilter
.
Bằng cách sử dụng một cờ trong $collection
, việc lưu trữ nhiều id danh mục cho người quan sát là một vấn đề dễ dàng.
Do đó, bất cứ khi nào tôi có nhu cầu lọc theo nhiều danh mục, tôi sẽ đặt cờ trên bộ sưu tập tại một số điểm
một ví dụ sẽ là viết lại Mage_Catalog_Model_Category::getProductCollection()
public function getProductCollection() {
$collection = parent::getProductCollection();
$collection->setFlag('category_ids',array(19,243,42,54)); //the array of values can be from somehwre, this hard coded array serves purely as an example
return $collection;
}
Bây giờ, khi magento kích hoạt sự kiện, mã của tôi sẽ thay thế bộ lọc danh mục bằng nhiều bộ lọc của tôi :)
Đây thực chất là cách mô-đun Sản phẩm Danh mục động của tôi thực hiện công việc của mình cho nhiều bộ lọc danh mục.
Tham chiếu Mã cốt lõi của addCategoryFilter
:
/**
* Specify category filter for product collection
*
* @param Mage_Catalog_Model_Category $category
* @return Mage_Catalog_Model_Resource_Product_Collection
*/
public function addCategoryFilter(Mage_Catalog_Model_Category $category)
{
$this->_productLimitationFilters['category_id'] = $category->getId();
if ($category->getIsAnchor()) {
unset($this->_productLimitationFilters['category_is_anchor']);
} else {
$this->_productLimitationFilters['category_is_anchor'] = 1;
}
if ($this->getStoreId() == Mage_Catalog_Model_Abstract::DEFAULT_STORE_ID) {
$this->_applyZeroStoreProductLimitations();
} else {
$this->_applyProductLimitations();
}
return $this;
}