Magento 1.7 Фильтровать товары по нескольким категориям

Я ищу способ отфильтровать продукты, возвращаемые на странице категории, по текущей категории И необязательной подкатегории. Каждое решение, которое я видел до сих пор, было «показать продукты, которые находятся в категории-a ИЛИ категории-b».

Какой файл мне нужно отредактировать, чтобы отфильтровать коллекцию продуктов по дополнительному необязательному идентификатору категории, переданному в качестве параметра запроса (например, ?catfilter=32)?


person Richard Parnaby-King    schedule 19.09.2012    source источник


Ответы (2)


посмотрите здесь: http://vibrantdrive.com/how-to-filter-magento-products-using-2-or-more-category-filters/

Чтобы получить продукты в категории 4 И категории 5

$_productCollection = Mage::getModel('catalog/product')
 ->getCollection()
 ->joinField('category_id', 'catalog/category_product', 'category_id', 'product_id = entity_id', null, 'left')
 ->addAttributeToSelect('*')
 ->addAttributeToFilter('category_id', array(
     array('finset' => '4'),
     array('finset' => '5'))
 )
 ->addAttributeToSort('created_at', 'desc');

Чтобы получить продукт в категории 4 ИЛИ категории 5

$_productCollection = Mage::getModel('catalog/product')
 ->getCollection()
 ->joinField('category_id', 'catalog/category_product', 'category_id', 'product_id = entity_id', null, 'left')
 ->addAttributeToSelect('*')
 ->addAttributeToFilter('category_id', array(
     array('finset' => array('4', '5')),
 )
 ->addAttributeToSort('created_at', 'desc');
person Andrew    schedule 19.09.2012
comment
Ни один из них не работает для меня. Первый файл, на который ссылается файл, ничего не содержит, просто объявление класса, поэтому мне нечего переопределять. Вторая ссылка выполняет фильтрацию или, возвращая продукты как из категории A, так и из категории B. Я хочу ограничить продукты только теми, которые отображаются как в категории A, так и в категории B. - person Richard Parnaby-King; 20.09.2012
comment
Попробуйте второй вариант еще раз, но немного измените его, чтобы получить AND: array(finset => array(350, 45, 66)) с массивом, содержащим идентификаторы категорий. - person Andrew; 21.09.2012
comment
Я получаю сообщение об ошибке Item (Mage_Catalog_Model_Product) with the same id "30674" already exist' in /magento/lib/Varien/Data/Collection.php:373 Похоже, что код работает, за исключением того, что если один и тот же элемент существует в обеих категориях, Коллекция не может быть создана. Как мы можем это исправить? - person Buttle Butkus; 29.01.2013
comment
@Andrew Эндрю Как заставить тот же код работать для поиска по каталогам? - person Sandesh; 25.06.2014
comment
добавьте это: ->getSelect()->group('entity_id'); - person Aleksey Razbakov; 21.08.2015

Об ошибке Item (Mage_Catalog_Model_Product) с таким же идентификатором «30674» уже существует в /magento/lib/Varien/Data/Collection.php:373, я нашел решение:

$conditions = array();
foreach ($categoryIds as $categoryId) {
    if (is_numeric($categoryId)) {
        $conditions[] = "{{table}}.category_id = $categoryId";
    }
}
$collection->distinct(true)
    ->joinField('category_id', 'catalog/category_product', /* 'category_id' */null, 
         'product_id = entity_id', implode(" OR ", $conditions), 'inner');
  1. установить отличный
  2. не включайте поле category_id в предложение выбора
person Thang Pham    schedule 21.02.2014