本文章來(lái)給大家介紹在Magento中顯示指定分類產(chǎn)品 子分類及分類產(chǎn)品數(shù)量的實(shí)現(xiàn)程序,方法也很簡(jiǎn)單的,各位朋友可參考.
二次開(kāi)發(fā)中經(jīng)常遇到一種情況,就是判斷一個(gè)分類是否屬于某一個(gè)大的分類,而大的分類包括很多子分類成樹(shù)狀結(jié)構(gòu),基本的方法都是先獲取大分類下的所有子分類的信息,然后再挨個(gè)比較看是否有ID和待定ID相等,一種用遞歸方法獲取大分類所有的ID,第二種用隊(duì)列等非遞歸的方法獲取所有子分類ID,第二種明顯性能要好一些.
本文在magento的模板文件里測(cè)試成功一個(gè)函數(shù):輸入一個(gè)分類的ID,將返回該分類下所有子分類(遞歸獲取)的ID,組成一個(gè)數(shù)組返回,所用的方法為用隊(duì)列實(shí)現(xiàn)的非遞歸方法,代碼如下:
- /**
- * 輸入:某一個(gè)分類的ID數(shù)字
- * 返回: 該分類下所有子分類的ID組成的數(shù)組
- * 可用于: 模板文件中可以直接使用,也可以用于action等文件類內(nèi)部
- * 實(shí)現(xiàn)思路:使用隊(duì)列的方法實(shí)現(xiàn)非遞歸,對(duì)樹(shù)從上往下遍歷
- **/
- function getAllChildrenOfCategory($cateid){
- $resArr = array();//結(jié)果數(shù)組
- $queueArr = array();//隊(duì)列數(shù)組
- array_push($queueArr,$cateid);
- while($currentcid = array_pop($queueArr)){
- array_push($resArr,$currentcid);
- //處理當(dāng)前節(jié)點(diǎn)的孩子節(jié)點(diǎn)
- $_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);
- } //開(kāi)源軟件:Vevb.com
- }
- reset($queueArr);
- }
- return $resArr;
- }
- //測(cè)試一下
- $allProducerIds = getAllChildrenOfCategory(19);
- $allDesignedIds = getAllChildrenOfCategory(18);
PHP沒(méi)有棧和隊(duì)列的數(shù)據(jù)結(jié)構(gòu),可以用數(shù)組來(lái)模擬實(shí)現(xiàn),數(shù)組的array_push和array_pop剛好就是這么兩個(gè)方法,其中因?yàn)閍rray_pop每次會(huì)改變數(shù)組的指針,所以可以在循環(huán)的末尾reset一下重置數(shù)組.
最后的測(cè)試,輸入的是兩個(gè)分類的ID,函數(shù)執(zhí)行結(jié)束以后,返回的數(shù)組里面就是所有子分類的ID,如果我們要調(diào)用指定分類下的產(chǎn)品和獲取子分類及產(chǎn)品數(shù)量 上面辦法實(shí)現(xiàn)不完美.
Magento首頁(yè)及分類頁(yè)面?zhèn)冗厵诮?jīng)常需要調(diào)用某一個(gè)分類下的產(chǎn)品,例如首頁(yè)的Featured Product等,這些分類一般保持不激活狀態(tài),我們可以添加店鋪中比較暢銷的產(chǎn)品到該分類中,并從前臺(tái)調(diào)用,下面一段代碼主要用處就是在Magento中獲取指定分類下的產(chǎn)品,代碼如下:
- $products = Mage::getModel('catalog/category')->load($category_id)
- ->getProductCollection()
- ->addAttributeToSelect('*')
- ->addAttributeToFilter('status', 1)
- ->addAttributeToFilter('visibility', 4);
將上面的$category_id修改為需要顯示產(chǎn)品的分類id,該id可以在分類頁(yè)面中看到,上述代碼中還捎帶了一些過(guò)濾,產(chǎn)品狀態(tài)為激活,并處于可見(jiàn)狀態(tài).
很多Magento的項(xiàng)目中,客戶需求將每個(gè)當(dāng)前分類下的每個(gè)子分類以及該分類下的產(chǎn)品數(shù)量全部顯示出來(lái),類似于Category (108)的形式.
想實(shí)現(xiàn)這種效果,就必須要知道如何獲取當(dāng)前分類的子分類,并了解Product Collection類中的count()方法,該方法用于獲取任意形式下對(duì)于Product Collection進(jìn)行篩選后的產(chǎn)品數(shù)量,代碼如下:
- // 獲取當(dāng)前分類模型
- $currCat = Mage::registry('current_category');
- //獲取當(dāng)前分類的所有子分類的模型集合
- $collection = Mage::getModel('catalog/category')->getCategories($currCat->getEntityId());
- //循環(huán)子分類的模型集合
- foreach($collection as $cat) {
- if($cat->getIsActive()) {
- $category = Mage::getModel('catalog/category')->load($cat->getEntityId());
- //獲取子分類的產(chǎn)品Collection,并通過(guò)count()方法,獲取該子分類的產(chǎn)品數(shù)量
- $prodCollection = Mage::getResourceModel('catalog/product_collection')->addCategoryFilter($category);
- Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($prodCollection);
- Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($prodCollection);
- $html .= '<a href="<?php echo $category->getUrl() ?>"><?php echo $category->getName() ?></a> (<?php echo $prodCollection->count() ?>)<br/>';
- }
- }
|
新聞熱點(diǎn)
疑難解答