2012-02-28 5 views
2

14 개의 제품이있는 "New"라는 카테고리가 있습니다.Magento에서 addCategoryFilter가 전혀 작동하지 않습니다

나는이 카테고리를로드하는 데 Mage::getModel('catalog/category')->load(6);을 사용하고 있습니다 (6은 관리자의 ID 임).

echo $category->getProductCount();으로 전화하면 14 (해당 카테고리의 제품 수)가 올바르게 표시됩니다.

지금, 나는 다음 간단한 foreach() 루프를 사용하여, 이러한 제품의 모든 14을 표시

$products = Mage::getModel('catalog/product') 
    ->setStoreId(Mage::app()->getStore()->getId()) 
    ->getCollection() 
    ->addAttributeToFilter('visibility', $visibility) 
    ->addCategoryFilter($category) 
    ->addAttributeToSelect("*") 
    ->setOrder('name','asc'); 

으로 카테고리에서 제품을 잡아하지만있을 때 나는 $products 개체를 통해 루프, 그것은 실제로 반환 내 모든 제품.

버전 1.6.2.0을 사용하고 있으며 캐시를 삭제했습니다.

누군가 작동하지 않는 이유가 있습니까?

편집

호출 echo (string) $products->getSelect(); 반환

SELECT `e`.*, IF(at_visibility.value_id > 0, at_visibility.value, at_visibility_default.value) AS `visibility`, `cat_index`.`position` AS `cat_index_position`, IF(at_name.value_id > 0, at_name.value, at_name_default.value) AS `name` FROM `catalog_product_entity` AS `e` INNER JOIN `catalog_product_entity_int` AS `at_visibility_default` ON (`at_visibility_default`.`entity_id` = `e`.`entity_id`) AND (`at_visibility_default`.`attribute_id` = '95') AND `at_visibility_default`.`store_id` = 0 LEFT JOIN `catalog_product_entity_int` AS `at_visibility` ON (`at_visibility`.`entity_id` = `e`.`entity_id`) AND (`at_visibility`.`attribute_id` = '95') AND (`at_visibility`.`store_id` = 1) INNER JOIN `catalog_category_product_index` AS `cat_index` ON cat_index.product_id=e.entity_id AND cat_index.store_id=1 AND cat_index.category_id='13' AND cat_index.is_parent=1 LEFT JOIN `catalog_product_entity_varchar` AS `at_name_default` ON (`at_name_default`.`entity_id` = `e`.`entity_id`) AND (`at_name_default`.`attribute_id` = '65') AND `at_name_default`.`store_id` = 0 LEFT JOIN `catalog_product_entity_varchar` AS `at_name` ON (`at_name`.`entity_id` = `e`.`entity_id`) AND (`at_name`.`attribute_id` = '65') AND (`at_name`.`store_id` = 1) WHERE (((IF(at_visibility.value_id > 0, at_visibility.value, at_visibility_default.value) = '4') OR (IF(at_visibility.value_id > 0, at_visibility.value, at_visibility_default.value) = '2'))) ORDER BY `name` as 
+0

루프를 보여줄 수 있습니까? 아마도 뭔가 잘못된 것일 수 있습니다 ... – Alexandre

+0

이렇게하십시오 :'echo (string) $ products-> getSelect();'그러면 SQL이 사용되는 것을 볼 수 있습니다. WHERE 절에있는 내용과 필터링 된 내용을 모두 알 수 있습니다. – clockworkgeek

+0

질문에 질문을 추가했습니다. – dotty

답변

5

단순화 할 때 그것은 나를 위해 작동 : 그런데

$cat = Mage::getModel('catalog/product')->setId(198); 

$products = Mage::getModel('catalog/product') 
    ->getCollection() 
    ->addCategoryFilter($cat) 
    ->addAttributeToSelect("*") 
    ->setOrder('name','asc') 
    ->load(); 

foreach($products as $p) { 
    print_r($p->getSku().PHP_EOL); 
} 

(어쨌든, 나에게), SQL 더 읽기 당신의 경우 getCollection의 직후에 addAttributeToSelect 호출을 배치합니다.

+1

이 문제에 여전히 문제가있는 모든 사용자를위한 메모 : 제품을 추가 한 후 카테고리 데이터를 다시 색인화하십시오. (테스트 됨 : Magento 1.7) –

+0

실제로. 저장소 ID가 지정되면 작동하지 않습니다. 이유가 확실하지 않습니다. – Willster

관련 문제