Magento - Как отфильтровать коллекцию товаров, используя фильтры 2 категорий? - PullRequest
7 голосов
/ 13 ноября 2009

Кто-нибудь знает, есть ли способ дважды запустить сбор товаров через фильтр категорий? У меня есть категория «Избранные», которая скрыта, и в которую я добавляю товары, чтобы их можно было использовать в качестве рекомендуемых товаров. В настоящее время я получаю свою коллекцию продуктов следующим образом:

$_productCollection = Mage::getResourceModel('reports/product_collection')
    ->addAttributeToSelect('*')
    ->addAttributeToFilter('visibility', $visibility)
    ->addCategoryFilter('36');
    $_productCollection->load();

Это прекрасно работает на домашней странице, но на страницах категорий мне нужно сначала отфильтровать результаты по текущей категории, а затем по избранной категории:

$_productCollection = Mage::getResourceModel('reports/product_collection')
    ->addAttributeToSelect('*')
    ->addAttributeToFilter('visibility', $visibility)
    ->addCategoryFilter('15')
    ->addCategoryFilter('36');
    $_productCollection->load(); 

К сожалению, кажется, что вы не можете выполнить фильтры двух категорий без редактирования основных файлов, что я не хочу делать.

Есть идеи как обойти это?

Я подумал, что мог бы, возможно, взять 2 набора продуктов отдельно, один отфильтрованный по текущей категории и один по избранной категории, а затем с помощью PHP stristr найти продукты, находящиеся в обоих, и использовать их, например

  if (stristr($featProductCollection, $currProductCollection))

У кого-нибудь есть идеи? Я думаю, что мне нужно вернуть, возможно, только SKU продуктов, возможно, в списке через запятую. Но я не уверен в лучшем способе сделать это, и это кажется немного глупым.

Ответы [ 2 ]

6 голосов
/ 13 ноября 2009

ОК, на самом деле сам разбирался с небольшой помощью от кого-то еще:

    $_productCollection = Mage::getResourceModel('reports/product_collection')
    ->addAttributeToSelect('*')
    ->addAttributeToFilter('visibility', $visibility)
    ->addCategoryFilter($_category)
    ->addAttributeToFilter('category_ids',array('finset'=>'36'))
    $_productCollection->load();

Где $ _category - текущая категория.

0 голосов
/ 19 ноября 2010

Не знаю почему, но это не работает в 1.4, мое решение было не очень красивым, но хорошо работало на большой базе данных:

$select  = $collection->getSelect();
$select->where('(SELECT COUNT(1) FROM `catalog_category_product_index` AS `cat_index`
WHERE cat_index.product_id=e.entity_id AND cat_index.category_id
IN('.implode(',',$categories).') AND cat_index.store_id='.$collection->getStoreId().') >= '.count($categories));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...