我们尝试做的似乎很简单,我们希望在菜单中显示每个类别的热门产品。我们希望获得其中的5种产品,因为这是UI的设计目标。我们希望他们按受欢迎程度排序,我相信这是对Magento产品的观看次数。
在很多情况下,我们要求的菜单类别本身没有产品。因此,它必须支持为其子女提供产品。我们的类别布局的一个分支示例是:
此代码目前的作用是返回相同的热门产品列表,无论我们将其传递给过滤器的类别。删除 - > 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);
我们尝试了一些变体。我不确定addCategoryFilter(...)方法是否考虑了子类别。如果没有,那应该很容易查询和解决。当然,正如它现在所说的那样,它总是会返回相同的产品而不会对类别进行过滤......首先是他们所说的第一件事。
运行Magento 1.4.0.1
快速查看产品数据会在$ products-> 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 :(得分: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;
答案 1 :(得分:0)
如果您只有一个类别,则可以使用addCategoryFilter。类别ID以逗号分隔的方式存储在产品中。因此,要按多个类别过滤产品集合,您必须使用:
addAttributeToFilter('category_ids',array('finset'=>$categoryIds));
$ categoryIds可以是单个类别ID或逗号分隔的类别ID。
以下代码按两个类别ID(10和15)过滤产品集合。
$_productCollection = Mage::getResourceModel('reports/product_collection')
->addAttributeToSelect('*')
->addAttributeToFilter('category_ids',array('finset'=>'10,15'));
当我们使用finset时,mysql函数find_in_set在sql查询中被Magento.mysql函数find_in_set使用:
FIND_IN_SET()查找包含逗号分隔值的另一个字符串中第一次出现的字符串。
SELECT FIND_IN_SET('b','a,b,c,d'); // result = 2