Фильтровать коллекцию товаров по двум категориям в Magento - PullRequest
3 голосов
/ 03 августа 2010

Я пытаюсь найти товары двух категорий.Я нашел пример, чтобы получить продукты, которые находятся в категории1 ИЛИ категории2.http://www.alphadigital.cl/blog/lang/en-us/magento-filter-by-multiple-categories.html Мне нужны продукты из категории 1 И категории 2.

Пример в блоге:

class ModuleName_Catalog_Model_Resource_Eav_Mysql4_Product_Collection
  extends Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection{

  public function addCategoriesFilter($categories){

  $alias = 'cat_index';
  $categoryCondition = $this->getConnection()->quoteInto(
    $alias.'.product_id=e.entity_id AND '.$alias.'.store_id=? AND ',
    $this->getStoreId()
  );

  $categoryCondition.= $alias.'.category_id IN ('.$categories.')';

  $this->getSelect()->joinInner(
    array($alias => $this->getTable('catalog/category_product_index')),
    $categoryCondition,
    array('position'=>'position')
  );

  $this->_categoryIndexJoined = true;
  $this->_joinFields['position'] = array('table'=>$alias, 'field'=>'position' );

  return $this;

  }
}

Когда я использую только этот фильтр, он выполняет запрос ИЛИна несколько категорий.Когда я объединяю этот фильтр с prepareProductCollection Mage_Catalog_Model_Layer, он каким-то образом удаляет эффект фильтра.

Как изменить фильтр на AND и объединить его с prepareProductCollection?

Спасибо

Спасибо

Ответы [ 3 ]

3 голосов
/ 04 октября 2011

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

$iNumberFeaturedItems = 4;
$oCurrentCategory = Mage::registry('current_category');
$oFeaturedCategory = Mage::getModel('catalog/category')->getCollection()
        ->addAttributeToFilter('name','Featured')
        ->getFirstItem();
$aFeaturedCollection = Mage::getResourceModel('catalog/product_collection')
        ->addAttributeToSelect(array('name', 'price', 'small_image', 'url_key'), 'inner')
        ->addStoreFilter()
        ->addCategoryFilter($oFeaturedCategory)
        ->addCategoryIds();

Первый шаг - получить набор продуктов для одной категории (в этом случае, Избранные категории).Следующим шагом является получение идентификаторов продуктов, обратите внимание, что это НЕ выполняет загрузку (ref Mage_Core_Model_Mysql4_Collection_Abstract::getAllIds())

    $aFeaturedProdIds = $aFeaturedCollection->getAllIds();
    shuffle($aFeaturedProdIds);  //randomize the order of the featured products

Затем получите идентификаторы для второй категории:

    $aCurrentCatProdIds = $oCurrentCategory->getProductCollection()->getAllIds();

И пересекают массивы, чтобы найти идентификаторы продуктов, которые существуют в обеих категориях:

    $aMergedProdIds = array_intersect($aFeaturedProdIds,$aCurrentCatProdIds);

Для этого конкретного случая использования мы выполняем цикл, пока не получим достаточное количество пересекающихся продуктов, перебирая категориюдерева, пока мы не найдем достаточно большое совпадение (но остановимся на корневой категории!):

    while(count($aMergedProdIds) < $iNumberFeaturedItems && $oCurrentCategory->getId() != Mage::app()->getStore()->getRootCategoryId()): 
        $oCurrentCategory = $oCurrentCategory->getParentCategory();
        $aParentCatProdIds = $oCurrentCategory->getProductCollection()->getAllIds();
        $aMergedProdIds = array_intersect($aFeaturedProdIds,$aParentCatProdIds);
    endwhile;

Наконец, отфильтруйте нашу первоначальную коллекцию по идентификаторам пересекающихся продуктов и вернитесь.

    $aFeaturedItems = $aFeaturedCollection->addIdFilter(array_slice($aMergedProdIds,0,$iNumberFeaturedItems))->getItems();
    return $aFeaturedItems;
1 голос
/ 15 октября 2010

Я также работаю над этим безрезультатно, это было доступно в magento 1.3 с использованием фильтра атрибутов с finset в столбце category_ids, однако это было перемещено в таблицу индексов из таблицы сущностей и теперь больше не работает.

Существует одно возможное решение, но требуется переопределить функцию, которую я нашел здесь

Но это решение далеко от идеала.

0 голосов
/ 04 августа 2010

Я думаю, что будет достаточно вызвать addCategoryFilter () дважды для вашей коллекции продуктов - один раз для каждой категории.Я не проверял, хотя, так что может быть не так.

...