2010-08-03 2 views
3

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

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

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 of Mage_Catalog_Model_Layer , он каким-то образом удаляет эффект фильтра.

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

Благодаря

Благодарности

ответ

3

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

$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(); 

Первый шаг, чтобы получить коллекцию продуктов для одной категории (в этот случай, Избранная категория). Следующий шаг, чтобы получить идентификаторы продуктов, обратите внимание, что это делает НЕ выполнить загрузку (см 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; 
+0

Отличное решение и объяснение, спасибо. – gregdev

-1

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

+2

К сожалению, второй вызов addCategoryFilter() перезаписывает первый. – pablo

1

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

Существует один из возможных решений, но requries функции переопределения, которую я нашел here

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

+0

Я думаю, что ваша ссылка использует старую схему, в которой все категории были сохранены в поле csv, например, атрибуты multi-select.В django это строка кода, но в magento все сложно. – pablo

+0

Решение в комментариях, которые я должен отметить перед этим, трудно получить работу и не работает сразу. –

Смежные вопросы