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子句,我正在寻找类似的解决方案,但不了解它是如何工作的。不,我知道@吉莫哈洛兰我的经历正好相反。仅当“展开目录”处于启用状态时,它才起作用。