是否有一种简单的方法可以按多个类别过滤产品系列?获取列出的任何类别中的所有项目? addCategoryFilter
似乎不允许使用数组。
唯一的方法是分别获取每个感兴趣类别的集合然后合并它们吗?
据我所知,过去可以使用像
这样的东西addAttributeToFilter('category_ids',array('finset'=>array('1','2')))
或类似,但自1.4以来不再可能。
注意:我使用1.6,如果有任何用处,我使用的是这样的:
$product = Mage::getModel('catalog/product');
$_productCollection = $product->getCollection()
->addAttributeToSelect('*')
->addAttributeToFilter('status',1)
->addStoreFilter();
答案 0 :(得分:9)
这是一种不需要修改核心的方法。 它来自this post并添加了'group'子句来处理重复的产品记录。
$categories = array(7,45,233);
$collection = Mage::getModel('catalog/product')->getCollection()
->addAttributeToSelect('*')
->joinField('category_id',
'catalog/category_product',
'category_id',
'product_id=entity_id',
null,
'left')
->addAttributeToFilter('category_id', array('in' => $categories));
$collection->getSelect()->group('e.entity_id');
答案 1 :(得分:4)
Magento现在的工作方式是获取商店,在商店中,您可以从storecollection获取类别,例如$ oStoreCollection-> addCategoryFilter(array('1','2'));
我遇到了一个可能对您有帮助的解决方案,请点击此处:
http://www.magentocommerce.com/boards/&/viewthread/201114/#t329230
他们使用的代码如下所示: 覆盖Mage / Catalog / Model / Resource / Eav / Mysql4 / Product / Collection,并添加以下方法:
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;
}
然后这样被调用:
$collection = Mage::getModel('catalog/product')->getCollection()
->addAttributeToSelect('*')
->distinct(true) // THIS IS WHAT YOU NEED TO ADD
->addCategoriesFilter($category->getAllChildren(true)); // Make sure you don't forget to retrieve your category here.
HTH
答案 2 :(得分:3)
如果您要使用AND过滤多个类别(因此产品必须在A,B和C类别中显示,您需要有多个联接:
$products = Mage::getModel('catalog/product')->getCollection()
->joinField('category_id_1', 'catalog/category_product', 'category_id', 'product_id=entity_id', null, 'left')
->joinField('category_id_2', 'catalog/category_product', 'category_id', 'product_id=entity_id', null, 'left')
->addAttributeToFilter('category_id_1', array('eq' => 358))
->addAttributeToFilter('category_id_2', array('eq' => 252))
// etc...
;
答案 3 :(得分:2)
我设法使用以下代码解决了这个问题(经过多次试验和错误):
$collection = Mage::getModel('catalog/product')->getCollection();
$collection->addAttributeToFilter('status', 1);
$collection->addAttributeToSelect(array('name','sku','price','small_image'));
// Filter by multiple categories
$collection->joinField('category_id','catalog/category_product','category_id','product_id=entity_id',null,'left');
$data_cats = $this->getRequest()->getParam('categories');
// Or $data_cats = array(85,86,87,88);
$filter_cats = array();
foreach ($data_cats as $value_cats) {
$filter_cats[] = array(
'attribute' => 'category_id',
'finset' => $value_cats
);
}
$collection->addAttributeToFilter($filter_cats);
希望这有助于某人;)
答案 4 :(得分:0)
此处硬编码的内连接重现了这一点:
$收藏 - > setVisibility(法师:: getSingleton('目录/ product_visibility') - > getVisibleInCatalogIds());
没有' cat_index.category_id = 2'
$category = Mage::getModel('catalog/category')->load(100); $allChildsIds = $category->getAllChildren($category); $visibility = Mage::getModel('catalog/product_visibility'); $collection = Mage::getResourceModel('catalog/product_collection'); $collection = $this->_addProductAttributesAndPrices($collection) ->addStoreFilter() ->setFlag('do_not_use_category_id', true) ->setFlag('disable_root_category_filter', true) ->addAttributeToSort('created_at', 'desc'); $whereCategoryCondition = $collection->getConnection() ->quoteInto('cat_index.category_id IN(?) ', $allChildsIds); $collection->getSelect()->where($whereCategoryCondition); $conditions = array(); $conditions[] = "cat_index.product_id = e.entity_id"; $conditions[] = $collection->getConnection() ->quoteInto('cat_index.store_id = ? ', Mage::app()->getStore()->getStoreId()); $conditions[] = $collection->getConnection() ->quoteInto('cat_index.visibility IN(?) ', $visibility->getVisibleInCatalogIds()); $collection->getSelect()->join( array('cat_index' => $collection->getTable('catalog/category_product_index')), join(' AND ', $conditions), array() ); $collection ->setPageSize(3) ->setCurPage(1); $collection->load();
答案 5 :(得分:0)
使用多个类别ID过滤产品系列
$all_categories = array('3','13','113');
$productCollection = Mage::getModel('catalog/product')->getCollection();
$productCollection->joinField('category_id', 'catalog/category_product', 'category_id',
'product_id = entity_id', null, 'left')
->addAttributeToSelect('*')
->addAttributeToFilter('type_id', array('eq' => 'simple'))
->addAttributeToFilter('category_id', array($all_categories));
foreach($productCollection as $product)
{
echo $product->getId() .$product->getName() . "<br/>";
}
您可以删除产品类型的条件,即 type_id ,或根据要求进行修改。