在商城项目中根据天健进行商品筛选是在正常不过的,具体代码如下:
$category= Mage::getModel('catalog/category')->load($category_id);
$products = $category->getProductCollection();
$products = Mage::helper('fun_catalog/layer_attribute')->applyFilterAttribute('color_group',$color_id, $products, $category);
自己封好的方法,第一个参数是所要筛选的字段,第二个参数是对应字段的ID:
/**
* 增加商品筛选方法
*
* @param string $attributeCode
* @param int $optionId
* @param Mage_Catalog_Model_Resource_Product_Collection $productCollection
* @param Mage_Catalog_Model_Category $category
* @return Mage_Catalog_Model_Resource_Product_Collection | null
*/
public function applyFilterAttribute($attributeCode, $optionId, $productCollection = null, $category)
{
if (is_null ( $productCollection ) && $category instanceof Mage_Catalog_Model_Category) {
$productCollection = $category->getProductCollection ();
}
$attributeId = Mage::getResourceModel ( 'eav/entity_attribute' )->getIdByCode ( 'catalog_product', $attributeCode );
if ($productCollection && $attributeId && $optionId) {
$connection = Mage::getSingleton ( 'core/resource' )->getConnection ( 'core_read' );
$tableAlias = $attributeCode . '_idx';
$conditions = array (
"{$tableAlias}.entity_id = e.entity_id",
$connection->quoteInto ( "{$tableAlias}.attribute_id = ?", $attributeId ),
$connection->quoteInto ( "{$tableAlias}.store_id = ?", $productCollection->getStoreId () ),
$connection->quoteInto ( "{$tableAlias}.value = ?", $optionId )
);
$productCollection->getSelect ()->join ( array (
$tableAlias => Mage::getResourceModel ( 'catalog/layer_filter_attribute' )->getMainTable ()
), implode ( ' AND ', $conditions ), array () );
}
return $productCollection;
}
需要注意的是商品的Size是一个特殊的字段,因为商品的Size会根据商品的类别而存储不同的值,例如:上衣可能是tops_size,而裤子可能就是bottoms_size,所以要根据对应的code得到对应的值,不然会出现code不匹配取不到值的情况,而下面的方法会完美的根据商品匹配对应的size_code:
$attribute_set = $category->getAttributeSet();
$sizeAttribute= Mage::getResourceModel('catalog/product_attribute_collection')
->setAttributeSetFilter($attribute_set)
->addFieldToFilter('attribute_code',array('like' => '%size'))
->getFirstItem();