別の選択肢:
この例で$categoryIds
は、はカテゴリIDの配列です。(私は通常使用して$collection->getFlag('category_ids')
いますが、この例では変更しました。下の説明を参照してください)
$currentStoreId
現在のストアIDを取得できる任意の方法で入力されます。(私が使用する私のオブザーバーイベントで$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')
);
}
上記のコードをオブザーバーで使用して、組み込みの呼び出しMage_Catalog_Model_Resource_Product_Collection::_applyProductLimitations()
が実行した後、複数のカテゴリでフィルタリングします。'catalog_product_collection_apply_limitations_after'
この_applyProductLimitations
メソッドは基本的に、の呼び出しによって設定されたフィルターを適用しaddCategoryFilter
ます。
でフラグを使用する$collection
と、オブザーバーの複数のカテゴリIDを格納するのが簡単になります。
したがって、複数のカテゴリでフィルタリングする必要があるときはいつでも、ある時点でコレクションにフラグを設定します
例は書き換えることです 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;
}
ここで、magentoがイベントを発生させると、私のコードはカテゴリーフィルターを複数のフィルターに置き換えます:)
これは基本的に、私の動的カテゴリ製品モジュールが複数のカテゴリフィルタに対して機能する方法です。
Refのコアコード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;
}