Eine andere Alternative:
Im Beispiel $categoryIds
handelt es sich um ein Array von Kategorie-IDs. (Ich benutze normalerweise, $collection->getFlag('category_ids')
aber für dieses Beispiel geändert, siehe Erklärung weiter unten)
$currentStoreId
wird mit allen Mitteln gefüllt, die die aktuelle Geschäfts-ID erhalten können. (in meinem Beobachterereignis benutze ich $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')
);
}
Ich verwende den obigen Code in einem Beobachter, um mit mehreren Kategorien zu filtern, NACHDEM der eingebaute Aufruf Mage_Catalog_Model_Resource_Product_Collection::_applyProductLimitations()
seine Sache tut, da er ein Ereignis namens sendet'catalog_product_collection_apply_limitations_after'
Die _applyProductLimitations
Methode wendet im Wesentlichen die Filter an, die durch den Aufruf von festgelegt wurden addCategoryFilter
.
Durch die Verwendung eines Flags in der $collection
ist es einfach, die mehreren Kategorie-IDs für den Beobachter zu speichern.
Wenn ich also nach mehreren Kategorien filtern muss, setze ich irgendwann ein Flag für die Sammlung
Ein Beispiel wäre das Umschreiben 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;
}
Wenn Magento das Ereignis auslöst, ersetzt mein Code den Kategoriefilter durch meinen Mehrfachfilter :)
Dies ist im Wesentlichen die Vorgehensweise meines Moduls " Dynamische Kategorieprodukte" für seine Filter mit mehreren Kategorien.
Ref Der Kerncode von 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;
}