二次开发中经常遇到一种情况,就是判断一个分类是否属于某一个大的分类,而大的分类包括很多子分类成树状结构,基本的方法都是先获取大分类下的所有子分类的信息,然后再挨个比较看是否有ID和待定ID相等。一种用递归方法获取大分类所有的ID;第二种用队列等非递归的方法获取所有子分类ID,第二种明显性能要好一些。
本文在magento的模板文件里测试成功一个函数:输入一个分类的ID,将返回该分类下所有子分类(递归获取)的ID,组成一个数组返回。所用的方法为用队列实现的非递归方法:
代码如下 |
复制代码 |
/**
* 输入:某一个分类的ID数字
* 返回: 该分类下所有子分类的ID组成的数组
* 可用于: 模板文件中可以直接使用,也可以用于action等文件类内部
* 实现思路:使用队列的方法实现非递归,对树从上往下遍历
**/
function getAllChildrenOfCategory($cateid){
$resArr = array();//结果数组
$queueArr = array();//队列数组
array_push($queueArr,$cateid);
while($currentcid = array_pop($queueArr)){
array_push($resArr,$currentcid);
//处理当前节点的孩子节点
$_category = Mage::getModel('catalog/category')->load($currentcid);
$subcats = $_category->getChildren();
$idarrs = explode(',',$subcats);
foreach($idarrs as $subCatid){
if(!$subCatid) continue;
$_subcategory = Mage::getModel('catalog/category')->load($subCatid);
if($_subcategory->getIsActive()) {
array_push($queueArr,$subCatid);
}
}
reset($queueArr);
}
return $resArr;
}
//测试一下
$allProducerIds = getAllChildrenOfCategory(19);
$allDesignedIds = getAllChildrenOfCategory(18);
|
PHP没有栈和队列的数据结构,可以用数组来模拟实现,数组的array_push和array_pop刚好就是这么两个方法,其中因为array_pop每次会改变数组的指针,所以可以在循环的末尾reset一下重置数组。
最后的测试,输入的是两个分类的ID,函数执行结束以后,返回的数组里面就是所有子分类的ID,如果我们要调用指定分类下的产品和获取子分类及产品数量 上面办法实现不完美
Magento首页及分类页面侧边栏经常需要调用某一个分类下的产品,例如首页的Featured Product等。这些分类一般保持不激活状态,我们可以添加店铺中比较畅销的产品到该分类中,并从前台调用。下面一段代码主要用处就是在Magento中获取指定分类下的产品。
代码如下 |
复制代码 |
$products = Mage::getModel('catalog/category')->load($category_id)
->getProductCollection()
->addAttributeToSelect('*')
->addAttributeToFilter('status', 1)
->addAttributeToFilter('visibility', 4);
|
将上面的$category_id修改为需要显示产品的分类id,该id可以在分类页面中看到。上述代码中还捎带了一些过滤,产品状态为激活,并处于可见状态。
很多Magento的项目中,客户需求将每个当前分类下的每个子分类以及该分类下的产品数量全部显示出来,类似于Category (108)的形式。如下所示
想实现这种效果,就必须要知道如何获取当前分类的子分类,并了解Product Collection类中的count()方法。该方法用于获取任意形式下对于Product Collection进行筛选后的产品数量。
代码如下 |
复制代码 |
// 获取当前分类模型
$currCat = Mage::registry('current_category');
//获取当前分类的所有子分类的模型集合
$collection = Mage::getModel('catalog/category')->getCategories($currCat->getEntityId());
//循环子分类的模型集合
foreach($collection as $cat) {
if($cat->getIsActive()) {
$category = Mage::getModel('catalog/category')->load($cat->getEntityId());
//获取子分类的产品Collection,并通过count()方法,获取该子分类的产品数量
$prodCollection = Mage::getResourceModel('catalog/product_collection')->addCategoryFilter($category);
Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($prodCollection);
Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($prodCollection);
$html .= 'getName() ?> (count() ?>) ';
}
}
|