2010-08-03 4 views
3

두 가지 범주의 제품을 찾으려고합니다. category1 또는 category2에있는 제품을 얻는 예제를 발견했습니다. http://www.alphadigital.cl/blog/lang/en-us/magento-filter-by-multiple-categories.html 나는 category1과 category2에있는 제품이 필요합니다.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; 

    } 
} 

이 수행 또는 쿼리 여러 카테고리를. 이 필터를 Mage_Catalog_Model_Layer의 prepareProductCollection 과 결합하면 어떻게 든 필터 효과가 제거됩니다.

어떻게 필터를 AND로 변경하고 prepareProductCollection과 결합 할 수 있습니까? 두 제품 컬렉션

감사

감사

답변

3

이 코드는 여러 범주로 필터링하지만 여러 수집 하중을 수행해야한다면 완전히 죽이는 성능을 방지 할 수 있습니다 이 경우는 추천 카테고리).

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

을 그리고 교차 : 다음 단계는 제품의 ID를 얻을이 하지은 부하를 수행한다는 것을 통지 (REF Mage_Core_Model_Mysql4_Collection_Abstract::getAllIds())

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

그런 다음 두 번째 범주의 ID를 얻을 수있다 두 범주에 모두있는 제품 ID를 찾으려면 배열을 사용하십시오.

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

이 특정 사례에 대해 우리는 충분한 inters 제품을 돌출 한 칼라 우리가 충분히 큰 일치를 찾을 때까지 카테고리 트리를 통과하는 (그러나 루트 카테고리에서 중지!) :

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

마지막으로, 교차 제품의 ID에 의해 우리의 초기 집합을 필터링하고 돌아갑니다.

$aFeaturedItems = $aFeaturedCollection->addIdFilter(array_slice($aMergedProdIds,0,$iNumberFeaturedItems))->getItems(); 
    return $aFeaturedItems; 
+0

위대한 솔루션과 설명, 감사합니다. – gregdev

-1

나는 addCategoryFilter을 (를 호출하기에 충분 것이라고 생각) - 한 번 각 카테고리. 나는 그것을 테스트하지 않았으므로 잘못되었을 수도있다.

+2

불행히도 addCategoryFilter()에 대한 두 번째 호출은 첫 번째 호출을 덮어 씁니다. – pablo

1

나는 magento 1.3에서 category_ids 열에 finset이있는 필터를 사용할 수 있었지만 엔티티 테이블에서 인덱스 테이블로 이동했지만 더 이상 작동하지 않습니다.

가 하나 개의 가능한 솔루션입니다,하지만 난

here을 발견 재정의 기능을 (GPT)를 사용하지만,이 솔루션은 이상적인 거리가 멀다.

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

첫 번째 단계는 하나 개의 카테고리에 대한 제품의 컬렉션을 얻을 수 있습니다에 (:

+0

귀하의 링크는 다중 카테고리 속성이 모든 카테고리가 csv 필드에 저장되었던 오래된 스키마를 사용한다고 생각합니다.장고에서는 코드 줄이지만 magento에서는 모든 것이 어렵습니다. – pablo

+0

해결책은 내가 미리 알아야 할 의견에있다. 일하기가 어렵고 곧바로 일하지 않는다. –

관련 문제