Magento - > addCategoryFilter - 按根类别过滤产品集合

时间:2011-02-22 13:29:03

标签: magento

关于在产品系列中使用 - > addCategoryFilter 。为什么不能按根类别过滤?我有2个商店,都有不同的根类别。我想在我的主页上显示畅销产品列表。但我无法按照根类别过滤产品,只能根据该类别过滤子类别。

因此,在我的主页上,两家商店的所有产品都会显示出来。我可以通过任何子类别过滤ok。例如,我的第二个根类别的ID为35.如果我尝试按此过滤,我会从两个根获得每个产品。但是该根下的第一个子类别是ID 36,并且通过此过滤可以正常工作,仅显示那些产品。我的电话如下(简化):

$_category = Mage::getModel('catalog/category')->load(35);

$_testproductCollection = Mage::getResourceModel('catalog/product_collection')
->addCategoryFilter($_category)
->addAttributeToSelect('*');
$_testproductCollection->load();

foreach($_testproductCollection as $_testproduct){ 
echo $this->htmlEscape($_testproduct->getName())."<br/>"; 
};

任何人都知道为什么这不起作用?或者是否有其他方法可以按根类别进行过滤?

更新 我还没有运气。看起来非常错误 - 使用根类别添加类别过滤器有时只能工作,您需要将所有产品添加到根,然后保存,然后删除不应该在该根cat中的任何产品,然后重新保存。但如果你重新索引,你会再次展示所有产品。如果我从上面的集合调用中输出sql查询,我得到以下内容:

SELECT `e`.*, `cat_index`.`position` AS `cat_index_position`, `price_index`.`price`, `price_index`.`tax_class_id`, `price_index`.`final_price`, IF(`price_index`.`tier_price`, LEAST(`price_index`.`min_price`, `price_index`.`tier_price`), `price_index`.`min_price`) AS `minimal_price`, `price_index`.`min_price`, `price_index`.`max_price`, `price_index`.`tier_price` FROM `catalog_product_entity` AS `e` INNER JOIN `catalog_category_product_index` AS `cat_index` ON cat_index.product_id=e.entity_id AND cat_index.store_id='2' AND cat_index.category_id='35' INNER JOIN `catalog_product_index_price` AS `price_index` ON price_index.entity_id = e.entity_id AND price_index.website_id = '1' AND price_index.customer_group_id = 0

如您所见,该类别列在那里,为什么过滤器不起作用?

5 个答案:

答案 0 :(得分:16)

好吧,我认为这样做有效,没有经过太多测试,但似乎已经完成了诀窍。您需要首先获取商店根类别ID,然后加入一些字段,以便您可以访问产品“category_id”,然后使用以下内容进行过滤:

$_rootcatID = Mage::app()->getStore()->getRootCategoryId();

$_testproductCollection = Mage::getResourceModel('catalog/product_collection')
->joinField('category_id','catalog/category_product','category_id','product_id=entity_id',null,'left')
->addAttributeToFilter('category_id', array('in' => $_rootcatID))
->addAttributeToSelect('*');
$_testproductCollection->load();

foreach($_testproductCollection as $_testproduct){ 
    echo $this->htmlEscape($_testproduct->getName())."<br/>"; 
};

答案 1 :(得分:2)

我有一个类似的问题,最后在这里回答我的问题: https://magento.stackexchange.com/questions/24436/product-collection-for-default-category

$store_id = 1;
$root_category_id = Mage::app()->getStore(Mage::app()->getStore()->getId())->getRootCategoryId();

$collection = Mage::getResourceModel('catalog/product_collection')->setStoreId($store_id);
$model = Mage::getModel('catalog/product')->setStoreId($store_id);
$category_model = Mage::getModel('catalog/category');
$category = $category_model->load($root_category_id);
$category->setIsAnchor(true);
$collection->addCategoryFilter($category);

echo $collection->getSize(); // example to show you a count of products

答案 2 :(得分:0)

试试这个:

$_testproductCollection = Mage::getResourceModel('catalog/product_collection') ->setVisibility(array(self::VISIBILITY_IN_CATALOG, self::VISIBILITY_BOTH)) ->addCategoryFilter($_category) ->addAttributeToSelect('*');

答案 3 :(得分:0)

它没有尝试,但我有两个想法:

(1)您可以尝试在该类别中添加其他商店过滤器:

$collection = Mage::getModel('catalog/category')
     ->getCollection()
     ->addFieldToFilter('store_id', Mage::app()->getStore()->getId())
     ->addIdFilter(35); 

foreach ($collection as $item) {
     ...
}

这不是很干净,因为category_id是硬编码的。

(2)您也可以尝试addPathFilter()集合(我不知道根类别路径,可能只是“/” - 但您可以在数据库中查找或使用getPath( )在加载的根类别上)。也许您还必须使用商店过滤器。

答案 4 :(得分:0)

场景:

  • Magento Version 1.7.0.2
  • 只有一个商店
  • 以全局模式编辑的类别
  • 删除了旧的root-category。所以旧产品没有类别。
  • 表“catalog_category_product_index”仍然处于不良状态(即使重新编制索引后)并显示为新的根类别!

我构建了一个帮助方法:

    public function getCategoriesId($parent =  -1,$recursionLevel = -1, $asCollection = true)
{
    if($parent === -1){
        $categories = Mage::helper('catalog/category')->getStoreCategories(false, true);
    }else{
        $recursionLevel  = ($recursionLevel<0) ? max(0, (int) Mage::app()->getStore()->getConfig('catalog/navigation/max_depth')) : $recursionLevel;
        $categories = $category->getCategories($parent, $recursionLevel, false, $asCollection, true);
    }

    $ids = array();

    foreach($categories as $category){
        if($category->getId()){
            $ids[] = $category->getId();
        }
    }

    return $ids;
}

我使用结果来过滤类似jazzhand的类别:

    ->addAttributeToFilter('category_id', array('in' => $_rootcatID))

我不确定,如果不仅仅需要根类别。