关于在产品系列中使用 - > 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
如您所见,该类别列在那里,为什么过滤器不起作用?
答案 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)
场景:
我构建了一个帮助方法:
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))
我不确定,如果不仅仅需要根类别。