2011-03-29 6 views
3

우리가하려고하는 것은 충분히 단순 해 보이고, 우리는 메뉴 내의 각 카테고리에서 인기있는 제품을 보여주고 싶습니다. 우리는 UI가 처리하도록 설계된 제품이기 때문에 5 가지 제품을 얻고 자합니다. 우리는 Magento에서 제품에 대한 견해가 많다고 생각하는 인기로 분류하고 싶습니다.인기 제품에 대한 필터 Magento의 카테고리로

많은 경우, 우리가 요청한 메뉴 카테고리에는 자체 제품이 없습니다. 그래서 아이들을 위해서도 제품을 끌어 당기는 것을지지해야합니다. 우리의 카테고리 레이아웃의 한 가지 예는 다음과 같습니다

  • 남성, # 2 (항목 없음)
    • 셔츠, # 5 (이 항목)
    • 액세서리, # 6 (항목이)
    • 바지, # 7

어떤이 코드 CUR을

  • 기타, # 8 (이 항목) (항목이 있습니다) rently는 우리가 필터링하기 위해 통과 한 카테고리와 상관없이 동일한 인기 제품 목록을 반환합니다. -> addCategoryFilter (...)를 제거하면 실제로 동일한 결과가 반환됩니다. 우리가 범주별로 필터링하는 방법을 해결할 수 있다면 나머지는 제자리에 떨어질 것이라고 생각합니다.

    $storeId = 1; 
    $category; // Category Object for id = 2 passed to this code 
    $productCount = 5; 
    
    $products = Mage::getResourceModel('reports/product_collection') 
    ->addOrderedQty() 
    ->addAttributeToSelect('*') 
    ->addAttributeToSelect(array('name','small_image')) 
    ->setStoreId($storeId) 
    ->addStoreFilter($storeId) 
    ->addCategoryFilter($category) 
    ->addViewsCount() 
    ->setPageSize($productCount); 
    

    Google은 이에 대한 몇 가지 변형을 시도했습니다. addCategoryFilter (...) 메서드가 하위 범주를 고려하는지 여부는 확실하지 않습니다. 그렇지 않다면 쉽게 쿼리하여 해결할 수 있어야합니다. 물론, 지금 당장 서 있기 때문에 카테고리에 필터링없이 동일한 제품을 항상 반환합니다. 마 젠토 1.4.0.1

    제품에 대한 데이터의 빠른보기를 실행

    에서 이러한 키를 보여줍니다 $ 제품 -> getFirstItem() -> GetData의()이 될 수 있습니다 :

    Array 
    (
    [0] => entity_id 
    [1] => entity_type_id 
    [2] => attribute_set_id 
    [3] => type_id 
    [4] => sku 
    [5] => has_options 
    [6] => required_options 
    [7] => created_at 
    [8] => updated_at 
    [9] => name 
    [10] => url_key 
    [11] => gift_message_available 
    [12] => meta_title 
    [13] => meta_description 
    [14] => image 
    [15] => small_image 
    [16] => thumbnail 
    [17] => custom_design 
    [18] => page_layout 
    [19] => options_container 
    [20] => url_path 
    [21] => image_label 
    [22] => thumbnail_label 
    [23] => small_image_label 
    [24] => description 
    [25] => short_description 
    [26] => meta_keyword 
    [27] => custom_layout_update 
    [28] => weight 
    [29] => price 
    [30] => special_price 
    [31] => cost 
    [32] => news_from_date 
    [33] => news_to_date 
    [34] => special_from_date 
    [35] => special_to_date 
    [36] => custom_design_from 
    [37] => custom_design_to 
    [38] => exclusive 
    [39] => size 
    [40] => color 
    [41] => status 
    [42] => visibility 
    [43] => is_imported 
    [44] => tax_class_id 
    [45] => enable_googlecheckout 
    [46] => is_recurring 
    [47] => is_salable 
    [48] => stock_item 
    ) 
    

    슬프게도 없음 category_ids

  • 답변

    0

    카테고리가 하나 뿐인 경우 addCategoryFilter를 사용할 수 있습니다. 카테고리 ID는 쉼표로 구분 된 방식으로 제품에 저장됩니다. 그래서, 한 개 이상의 카테고리에서 제품 회수를 필터링하려면 사용해야합니다 :

    addAttributeToFilter('category_ids',array('finset'=>$categoryIds)); 
    

    $ categoryIds이 하나의 카테고리 ID 또는 쉼표로 구분 된 카테고리 식별자가 될 수 있습니다.

    다음 코드는 두 가지 범주 ID (10 및 15)로 제품 컬렉션을 필터링합니다. 우리 finset 사용할 때, MySQL의 함수 FIND_IN_SET가 Magento.mysql 기능 FIND_IN_SET하여 SQL 쿼리에 사용되는

    $_productCollection = Mage::getResourceModel('reports/product_collection') 
        ->addAttributeToSelect('*') 
        ->addAttributeToFilter('category_ids',array('finset'=>'10,15')); 
    

    :

    FIND_IN_SET()는 다른 캐릭터 함유 콤마 내의 문자열의 첫 번째 발생을 찾는다 분리 된 값.

    SELECT FIND_IN_SET('b','a,b,c,d'); // result = 2 
    
    +0

    나는이 변형을 시도해 보았습니다. "잘못된 속성 이름 : category_ids"메시지와 함께 예외가 발생합니다. – jsapara

    +0

    사실 Magento 1.4부터는 category_ids 필드가 삭제되었습니다. – jsapara

    +0

    soory, 1.4.2 업그레이드 이후 category_id에 대한 버그 추적 문제가 있습니다 http://www.magentocommerce.com/bug-tracking/issue?issue=10662 –

    1

    좋아, 글쎄, 기본적으로 작동 및/또는 여러 카테고리 필터링의 부족을 통해 답변을 찾았습니다. 더럽지 만 작동합니다.여기에서 블로그 게시물을 기반으로합니다 : http://asia-connect.com.vn/2009/07/magento-filter-by-multiple-categories/

    나는이 솔루션에 만족한다고 말할 수 없습니다. Magento가 유용한 방식으로 카테고리를 필터링하는 기능을 제거하는 이유를 알 수 없습니다. 아무 것도 필터링하지 않는 것처럼 보였으므로 문제가 복잡해졌습니다. 더 합리적인 해결책으로 차임 할 수 있습니다. 나는 기꺼이이 해결책으로 대체 할 것입니다.

    $products = Mage::getResourceModel('reports/product_collection') 
         ->addOrderedQty() 
         ->addAttributeToSelect('*') 
         ->addAttributeToSelect(array('name','small_image')) 
         ->setStoreId($storeId) 
         ->addStoreFilter($storeId) 
    //  ->addCategoryFilter($category) 
         ->addViewsCount() 
         ->setPageSize($productCount); 
    
    $alias = 'cat_index'; 
    $categoryCondition = $products->getConnection()->quoteInto(
         $alias.'.product_id=e.entity_id AND '.$alias.'.store_id=? AND ', 
         $storeId 
    ); 
    $cats = array($category->getId()); 
    foreach($category->getChildren() as $catChild) { 
         $cats[] = $catChild->getId(); 
    } 
    
    
    $categoryCondition.= $alias.'.category_id IN ('.implode(',',$cats).')'; 
    
    $products->getSelect()->joinInner(
         array($alias => $products->getTable('catalog/category_product_index')), 
         $categoryCondition, 
         array('position'=>'position') 
    ); 
    
    $products->_categoryIndexJoined = true; 
    
    관련 문제