Magento无限极分类(一个牛逼的算法)

最近在做magento对接ios跟安卓的对接数据,在分类上上 ios跟安卓的返回数据不一样。安卓需要一次性返回数据。

 

<?php
class App_ClientApi_Model_Category extends App_ClientApi_Model_Abstract {

    public function getAllCategory() {
        $cacheKey = 'classlist_all_' . $this->getStore ()->getId ();
        $cacheData = $this->getCacher ()->load ( $cacheKey );
        if ($cacheData)
            return $cacheData;
    
    
        try {
            $categoryCollection=Mage::getModel('catalog/category')->getCollection();
            $categoryCollection->addAttributeToSelect('name')
            ->addAttributeToSelect('thumbnail')
            ->addAttributeToSelect('image')
            ->addAttributeToSelect('display_mode')
            ->addAttributeToFilter('is_active', 1)
            ->addAttributeToSort('app_sort');
            $childCategoryIds=array();
            foreach ($categoryCollection as $child){
                if($child->getParentId()==1)continue;
                $temp = array (
                        'classid' => $child->getEntityId (),
                        'name' => $child->getName (),
                        'image' => $child->getImage(),
                        'thumbnail' => $child->getThumbnail(),
                        'merchant' => $child->getMerchant(),
                        // 'has_sub'=>$child->getData('children_count') ? true : false,
                        'hasSub' => $child->getData ( 'children_count' ) ? true : false,
                        'parentId'=>$child->getParentId(),
                );
                if (! $child->getData ( 'display_mode' )) {
                    $child->setData ( 'display_mode', $child->getDisplayMode());
                }
                if ($child->getData ( 'display_mode' ) == 'PRODUCTS') { // || $child->getData('display_mode')=='PRODUCTS_AND_PAGE'
                    $temp ['isClass'] = false;
                } else {
                    $temp ['isClass'] = true;
                }
                    
                if ($temp ['image']) {
                    $temp ['image'] = Mage::getBaseUrl ( Mage_Core_Model_Store::URL_TYPE_MEDIA ) . 'catalog/category/' . $temp ['image'];
                } else {
                    $temp ['image'] = "";
                }
                if ($temp ['thumbnail']) {
                    $temp ['thumbnail'] = Mage::getBaseUrl ( Mage_Core_Model_Store::URL_TYPE_MEDIA ) . 'catalog/category/' . $temp ['thumbnail'];
                } else {
                    $temp ['thumbnail'] = "";
                }
                if ($temp ['merchant']) {
                    $temp ['merchant'] = Mage::getBaseUrl ( Mage_Core_Model_Store::URL_TYPE_MEDIA ) . 'catalog/category/' . $temp ['merchant'];
                } else {
                    $temp ['merchant'] = "";
                }
                $data [] = $temp;
            }
        } catch ( Exception $e ) {
            echo $e->getMessage ();
        }
    
        $returnData = array (
                'data' => $data
        );
        if (count ( $data ) <= 0) {
            $returnData ['status'] = App_ClientApi_Helper_Data::STATUS_FAILED;
            $returnData ['data'] = 'There is no data under this category.';
        }
        $this->getCacher ()->save ( $cacheKey, $returnData );
        return $returnData;
    }
    
    public     function  getAllSortCategory(){
        $cacheKey = 'classlist_all_sort' . $this->getStore ()->getId ();
        $cacheData = $this->getCacher ()->load ( $cacheKey );
        if ($cacheData)
            return $cacheData;
        
        $rootId=Mage::app ()->getDefaultStoreView ()->getRootCategoryId ();
        $result=$this->getAllCategory();
        $index=array();
        foreach ($result['data'] as $val){
            $index[$val['classid']]=$val;
        }
        $data=$this->generateTree($index,$rootId);
        $returnData = array (
                'data' => $data
        );
        if (count ( $data ) <= 0) {
            $returnData ['status'] = App_ClientApi_Helper_Data::STATUS_FAILED;
            $returnData ['data'] = 'There is no data under this category.';
        }
        $this->getCacher ()->save ( $cacheKey, $returnData );
        return $returnData;
    }
    //这种效率高,比php+mysql层层调用效率提高很大(牛逼的算法,网上查的,嘿嘿)
    protected  function generateTree($items,$rootId){
        $tree = array();
        foreach($items as $item){
            if(isset($items[$item['parentId']])&&$item['parentId']!=$rootId){
                $items[$item['parentId']]['son'][] = &$items[$item['classid']];
            }else{
                $tree[] = &$items[$item['classid']];
            }
        }
        return $tree;
    }
    
    
}

你可能感兴趣的:(agent)