本文章來給大家介紹在Magento中顯示指定分類產品 子分類及分類產品數量的實現程序,方法也很簡單的,各位朋友可參考.
二次開發中經常遇到一種情況,就是判斷一個分類是否屬于某一個大的分類,而大的分類包括很多子分類成樹狀結構,基本的方法都是先獲取大分類下的所有子分類的信息,然后再挨個比較看是否有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);
- } //開源軟件:Vevb.com
- }
- 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 .= '<a href="<?php echo $category->getUrl() ?>"><?php echo $category->getName() ?></a> (<?php echo $prodCollection->count() ?>)<br/>';
- }
- }
新聞熱點
疑難解答