Magento now works to get the Store, and in the store you can get categories from the store, for example $ oStoreCollection-> addCategoryFilter (array ('1', '2'));
I came across a solution that could help you found here:
http://www.magentocommerce.com/boards/&/viewthread/201114/#t329230
The code used is as follows: Reinstall Mage / Catalog / Model / Resource / Eav / Mysql4 / Product / Collection and add the following methods:
public function addCategoriesFilter($categories) { $this->_productLimitationFilters['category_ids'] = $categories; if ($this->getStoreId() == Mage_Core_Model_App::ADMIN_STORE_ID) { $this->_applyZeroStoreProductLimitations(); } else { $this->_applyProductLimitations(); } return $this; } protected function _applyProductLimitations() { $this->_prepareProductLimitationFilters(); $this->_productLimitationJoinWebsite(); $this->_productLimitationJoinPrice(); $filters = $this->_productLimitationFilters; // Addition: support for filtering multiple categories. if (!isset($filters['category_id']) && !isset($filters['category_ids']) && !isset($filters['visibility'])) { return $this; } $conditions = array( 'cat_index.product_id=e.entity_id', $this->getConnection()->quoteInto('cat_index.store_id=?', $filters['store_id']) ); if (isset($filters['visibility']) && !isset($filters['store_table'])) { $conditions[] = $this->getConnection() ->quoteInto('cat_index.visibility IN(?)', $filters['visibility']); } // Addition: support for filtering multiple categories. if (!isset($filters['category_ids'])) { $conditions[] = $this->getConnection() ->quoteInto('cat_index.category_id=?', $filters['category_id']); if (isset($filters['category_is_anchor'])) { $conditions[] = $this->getConnection() ->quoteInto('cat_index.is_parent=?', $filters['category_is_anchor']); } } else { $conditions[] = $this->getConnection()->quoteInto('cat_index.category_id IN(' . implode(',', $filters['category_ids']) . ')', ""); } $joinCond = join(' AND ', $conditions); $fromPart = $this->getSelect()->getPart(Zend_Db_Select::FROM); if (isset($fromPart['cat_index'])) { $fromPart['cat_index']['joinCondition'] = $joinCond; $this->getSelect()->setPart(Zend_Db_Select::FROM, $fromPart); } else { $this->getSelect()->join( array('cat_index' => $this->getTable('catalog/category_product_index')), $joinCond, array('cat_index_position' => 'position') ); } $this->_productLimitationJoinStore(); Mage::dispatchEvent('catalog_product_collection_apply_limitations_after', array( 'collection' => $this )); return $this; } protected function _applyZeroStoreProductLimitations() { $filters = $this->_productLimitationFilters; // Addition: supprot for filtering multiple categories. $categoryCondition = null; if (!isset($filters['category_ids'])) { $categoryCondition = $this->getConnection()->quoteInto('cat_pro.category_id=?', $filters['category_id']); } else { $categoryCondition = $this->getConnection()->quoteInto('cat_pro.category_id IN(' . implode(',', $filters['category_ids']) . ')', ""); } $conditions = array( 'cat_pro.product_id=e.entity_id', $categoryCondition ); $joinCond = join(' AND ', $conditions); $fromPart = $this->getSelect()->getPart(Zend_Db_Select::FROM); if (isset($fromPart['cat_pro'])) { $fromPart['cat_pro']['joinCondition'] = $joinCond; $this->getSelect()->setPart(Zend_Db_Select::FROM, $fromPart); } else { $this->getSelect()->join( array('cat_pro' => $this->getTable('catalog/category_product')), $joinCond, array('cat_index_position' => 'position') ); } return $this; }
Then it is called like this:
$collection = Mage::getModel('catalog/product')->getCollection() ->addAttributeToSelect('*') ->distinct(true)
NTN
source share