Magento按多个类别筛选产品集合
是否有一种简单的方法可以按多个类别筛选产品集合?要获取所列类别中的所有项目Magento按多个类别筛选产品集合,magento,collections,Magento,Collections,是否有一种简单的方法可以按多个类别筛选产品集合?要获取所列类别中的所有项目addCategoryFilter似乎不允许数组 是单独获取每个感兴趣类别的集合然后合并它们的唯一方法吗 我知道这在以前是可能的 addAttributeToFilter('category_ids',array('finset'=>array('1','2'))) 或类似的,但这在1.4之后不再可能 注意:我使用的是1.6,如果有任何用处,我使用的是如下内容: $product = Mage::getModel(
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();
$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.
Magento现在的工作方式是获取存储,在存储上,您可以从storecollection获取类别,如$oStoreCollection->addCategoryFilter(数组('1','2') 我发现了一个可能对您有所帮助的解决方案,可在以下网址找到: 他们使用的代码如下所示: 覆盖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;
}
然后它会被这样调用:
$product = Mage::getModel('catalog/product');
$_productCollection = $product->getCollection()
->addAttributeToSelect('*')
->addAttributeToFilter('status',1)
->addStoreFilter();
$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这里有一个不需要修改核心的方法。 它取自,添加了“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');
如果要对多个类别进行筛选,请使用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...
;
- Magento 1.8.0.0
- 在管理中启用平面目录
- 确保已缓存要放置此文件的块
- 不要将此添加到付费主题中
- 此处硬编码的内部联接复制了以下内容: $collection->setVisibility(Mage::getSingleton('catalog/product_visibility')->getVisibleInCatalogIds() 不带“类别索引。类别id=2”
使用多个类别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/>";
}
$all_categories=数组('3','13','113');
$productCollection=Mage::getModel('catalog/product')->getCollection();
$productCollection->joinField('category\u id'、'category/category\u product'、'category\u id',
“产品标识=实体标识”,空,“左”)
->addAttributeToSelect(“*”)
->addAttributeToFilter('type_id',array('eq'=>'simple'))
->addAttributeToFilter('category_id',数组($all_categories));
foreach($productCollection作为$product)
{
echo$product->getId().$product->getName().“
”;
}
您可以删除产品类型(即type_id)的条件或根据需要修改它。我通过以下代码设法解决了这个问题(经过多次尝试和错误):
$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);
希望这对某人有所帮助;)不幸的是,没有任何简单的方法可以做到这一点。谢谢你。我已经添加了这两个,现在得到一个未知的方法错误。由于某些原因,它无法识别添加的内容,有什么想法吗?
致命错误:调用未定义的方法Mage\u Catalog\u Model\u Resource\u Product\u Collection::addCategoriesFilter()..
Mage/Catalog/Model/Resource/Eav/Mysql4/Product/Collection.php
似乎根本没有被加载。你是否真的扩展了Mage/Catalog/Model/Resource/Eav/Mysql4/Product/Collection?我最终找到了一个替代解决方案,而是通过过滤属性集id
。我会将此标记为正确,因为它似乎对论坛中的一些人也有效。加入有效,但过滤无效。WHERE
子句中没有添加任何内容。我也尝试过这个解决方案,但遇到了与@ButtleButkus相同的问题。。。我看到连接被添加到生成的查询中,但没有WHERE条件。我们使用的是MagentoEE1.12(又名CE1.7)。我已经详细介绍了代码,当Magento的平面目录关闭时,这个解决方案就可以工作了。启用平面目录时,会发生以下情况。addAttributeToFilter方法识别category_id字段不在选择列表中,并调用addAttributeToSelect将其添加。addAttributeToSelect方法随后失败,因为category_id不是产品属性,并且没有向集合添加任何筛选器。感谢您解释group子句,我正在寻找类似的解决方案,但不了解它是如何工作的。不,我知道@吉莫哈洛兰我的经历正好相反。仅当“展开目录”处于启用状态时,它才起作用。