亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

yii框架分類樹擴展示例

2020-07-26 03:37:10
字體:
來源:轉載
供稿:網友

提供兩種方式的分類樹格式,表格和下拉框形式的樹形結構
可以自定義表格和下拉框的樣式,自定義以哪一列的參數為格式化數據,自定義層級關系參數,自定義表格列名稱,也可以設置時間的格式化。



調用方式

表格方式:

復制代碼 代碼如下:

<?php $this->widget('ext.tree.widgets.TreeWidget',array(
        'dataProvider'  => $dataProvider,           // 傳遞數據
        'pid'           => 'pid',                   // 設置層級關系id
        'tableClass'    => 'items table table-striped table-bordered table-condensed',  // 表格樣式
        'formatParam'   => 'name',                  // 設置格式化字段   
        'formatTime'    => array(                   // 設置格式化的時間參數
            'created'
        ),              
        'tableHead'     => array(                   // 設置表格列頭信息
                '分類ID',
                '頻道',
                '中文名',
                '英文名',
                '首字母',
                '排序',
                '分類級別',
                '父ID',
                '創建時間',
        ),   
    )); ?>

下拉框方式

復制代碼 代碼如下:

<?php $this->widget('ext.tree.widgets.TreeWidget',array(
            'dataProvider'  => $cate,           // 傳遞數據
            'pid'           => 'pid',                   // 設置父ID           
            'formatParam'   => 'name',                  // 設置格式化字段
            'treeType'      => false,                   // 輸出樹格式
            'selectClass'  => 'class="span11"',         // 設置下拉框樣式
             'defaultSelectValue' => array(             // 設置下拉框的默認值和選項
                    0 , '≡ 作為一級欄目 ≡'
             ),
        )); ?>

TreeWidget.php

復制代碼 代碼如下:

<?php

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of Tree
 *
 * @author 汪嘉誠
 * @email 819434425@qq.com
 * 
 * 表格方式調用
    <?php $this->widget('ext.tree.widgets.TreeWidget',array(
        'dataProvider'  => $dataProvider,           // 傳遞數據
        'pid'           => 'pid',                   // 設置層級關系id
        'tableClass'    => 'items table table-striped table-bordered table-condensed',  // 表格樣式
        'formatParam'   => 'name',                  // 設置格式化字段   
        'formatTime'    => array(                   // 設置格式化的時間參數
            'created'
        ),              
        'tableHead'     => array(                   // 設置表格列頭信息
                '分類ID',
                '頻道',
                '中文名',
                '英文名',
                '首字母',
                '排序',
                '分類級別',
                '父ID',
                '創建時間',
        ),   
    )); ?>
 *
 * 下拉框方式調用
 * <?php $this->widget('ext.tree.widgets.TreeWidget',array(
            'dataProvider'  => $cate,           // 傳遞數據
            'pid'           => 'pid',                   // 設置父ID           
            'formatParam'   => 'name',                  // 設置格式化字段
            'treeType'      => false,                   // 輸出樹格式
            'selectClass'  => 'class="span11"',         // 設置下拉框樣式
             'defaultSelectValue' => array(             // 設置下拉框的默認值和選項
                    0 , '≡ 作為一級欄目 ≡'
             ),
        )); ?>
 */
class TreeWidget extends Widget {
    /**
     * CArrayDataProvider 數據對象或數組數據
     * 組件數據接收參數
     * @var Object || array
     */
    public $dataProvider;

    /**
     * 賦值接收數據
     * @var type
     */
    public $arrAll = array();

    /**
     * 按_ID作鍵名的多維關系
     * @var type
     */
    public $arrIdRelation = array();

    /**
     * 按_ID作鍵名的多維關系的簡化,用來輸出樹狀圖
     * @var type
     */
    public $arrIdRelationSimple = array();

    /**
     * 將原始數據轉化成的_ID作鍵名的數組
     * @var type
     */
    public $arrIdAll = array();

    /**
     * 所有的父子關系
     * @var type
     */
    public $arrIdSon = array();

    /**
     * 葉子節點的_ID
     * @var type
     */
    public $arrIdLeaf = array();

    /**
     * 根節點的_ID
     * @var type
     */
    public $arrIdRoot = array();

    /**
     * 每個節點下的子孫后代_ID
     * @var type
     */
    public $arrIdChildren = array();

    /**
     * 每個節點回逆到根
     * @var type
     */
    public $arrIdBackPath = array();

    /**
     * 輸出樹的結構
     * @var type
     */
    public $strItem = '<br />{$strSep}{$name}';

    /**
     * 設置表格樣式
     * @var type
     */
    public $tableClass  = 'items table table-striped table-bordered table-condensed';

    /**
     * 數據字段參數數組
     * @var type
     */
    public $dataKey   = array();

    /**
     * 指定需要格式化的字段
     * @var type
     */
    public $formatParam = 'name';

    /**
     * 表格列名稱
     * @var type
     */
    public $tableHead   = array();

    /**
     * 父ID
     * @var type
     */
    public $pid = 'pid';

    /**
     * 指定樹的類型
     * true 表格類型樹
     * false 下拉框類型樹
     * @var type
     */
    public $treeType = true;       

    /**
     * 綁定下拉框value值
     * @var type
     */
    public $optionValue = 'id';

    /**
     * 格式化時間
     * @var type
     */
    public $formatTime = array();

    /**
     * 下拉框樣式
     * @var type
     */
    public $selectClass = 'class="span3"';

    /**
     * 設置下拉框的默認值和選項
     * @var type
     */
    public $defaultSelectValue = array(
        0,'≡ 作為一級欄目 ≡',
    );

    /**
     * 設置下拉框是否多選
     * true 多選
     * false 單選
     * @var type
     */
    public $isMultiple = false;

    /**
     * 綁定到下拉框的默認值
     * @var type
     */
    public $bindSelectValue = 0;
   

    /**
     * 運行
     */
    public function run() {               
            if (is_array($this->dataProvider) && count($this->dataProvider) > 0)
                    $data = $this->_run($this->dataProvider);
            else if (is_object($this->dataProvider) && count($this->dataProvider->rawData) > 0)
                    $data = $this->_run($this->dataProvider->rawData);                   

                               
            $this->render('tree' , array('data'=>$data));
    }

    /**
     *
     * @return type
     */
    private function _run($datas){           
            foreach ($datas as $data)
                    $this->arrAll[] = $data;
                    $this->dataKey = array_keys($data);

            $this->processData();
            if ($this->treeType === true)
                    $data = $this->getTable();
            else
                    $data = $this->getSelect($this->pid, $this->bindSelectValue, $this->isMultiple, $this->selectClass, $this->defaultSelectValue);

            return $data;
    }

    /**
     * 獲得html
     * @return type
     */
    public function getHtml() {
            return $this->genHtml();
    }

    /**
     * 設置分層字段
     * 表格類型
     * @return string
     */
    public function getItemName(){           
            $html = '<tr>';
            foreach($this->dataKey as $v) {                   
                    if ($this->formatParam == $v)
                            $str = '{$strSep}';
                    else
                            $str = '';

                    $html .= '<td>'.$str.'{$'.$v.'}</td>';
            }
            $html .= '</tr>';
            return $html;
    }

    /**
     * 獲取表格列名稱
     * @return string
     */
    public function getTableHead(){
            $html = '<tr>';
            foreach($this->tableHead as $v)
                    $html .= '<th>'.$v.'</th>';

            $html .= '</tr>';
            return $html;
    }

    /**
     * 獲得表格形式的樹
     * @return string
     */
    public function getTable() {                   
            $this->strItem = $this->getItemName();
            $strRe = '<table class="'.$this->tableClass.'">';
            $strRe .= '<thead>'.$this->getTableHead().'</thead><tbody>';
            $strRe .= $this->genHtml();
            $strRe .= '</tbody></table>';
            return $strRe;
    }   

    /**
     * 獲取下拉框形式的樹
     * @param type $strName
     * @param array $arrValue
     * @param type $blmMulti
     * @param type $strExt
     * @param type $arrFirst
     * @return string
     */
    public function getSelect($strName = 'tree', $arrValue = array(), $blmMulti = false, $strExt = '', $arrFirst = null) {
            !is_array($arrValue) && $arrValue = array($arrValue);
            foreach ($this->arrIdAll as $strTemp => $arrTemp) {
                    $this->arrIdAll[$strTemp]['selected'] = '';

                    if (in_array($arrTemp['id'], $arrValue)) {
                            $this->arrIdAll[$strTemp]['selected'] = ' selected="selected"';
                    }
            }
            $this->strItem = '<option value=/"{$'.$this->optionValue.'}/"{$selected} title=/"{$'.$this->formatParam.'}/">{$strSep}{$'.$this->formatParam.'}</option>';
            $strRe = '<select id="id_' . $strName . '" name="' . $strName . ($blmMulti ? '[]' : '') . '"';
            $strRe .= ($blmMulti ? ' multiple="multiple"' : '') . (empty($strExt) ? '' : ' ' . $strExt) . '>';

            if (is_array($arrFirst) && count($arrFirst) == 2) {
                    $strRe .= '<option value="' . $arrFirst[0] . '">' . $arrFirst[1] . '</option>';
            }

            $strRe .= $this->getHtml() . '</select>';           
            return $strRe;
    }

    /**
     * 數據處理
     * @param type $arrData
     * @return type
     */
    private function helpForGetRelation($arrData) {
            $arrRe = array();
            foreach ($arrData as $strTemp => $arrTemp) {
                    $arrRe[$strTemp] = $arrTemp;
                    if (isset($this->arrIdRelation[$strTemp])) {
                            $arrRe[$strTemp] = $this->arrIdRelation[$strTemp];
                    }
                    if (count($arrRe[$strTemp]) > 0) {
                            $arrRe[$strTemp] = $this->helpForGetRelation($arrRe[$strTemp]);
                    } else {
                            array_push($this->arrIdLeaf, $strTemp);
                    }
            }
            return $arrRe;
    }

    /**
     * 數據處理
     * @param type $arrData
     * @return type
     */
    private function helpForGetChildren($arrData) {
            $arrRe = array_keys($arrData);
            foreach ($arrData as $arrTemp) {
                    $arrRe = array_merge($arrRe, $this->helpForGetChildren($arrTemp));
            }
            return $arrRe;
    }

    /**
     * 數據處理
     * @param type $str
     * @return type
     */
    private function helpForGetBackPath($str) {
            $arrRe = array();
            $intTemp = $this->arrIdAll[$str][$this->pid];
            if ($intTemp > 0) {
                    $intTemp = '_' . $intTemp;
                    array_push($arrRe, $intTemp);
                    $arrRe = array_merge($arrRe, $this->helpForGetBackPath($intTemp));
            }
            return $arrRe;
    }

    /**
     * 數據處理
     */
    private function processData() {
            $count = count($this->arrAll);
            foreach ($this->arrAll as $arrTemp) {           
                    $strTemp = '_' . $arrTemp['id'];
                    $this->arrIdAll[$strTemp] = $arrTemp;
                    if ($arrTemp[$this->pid] > 0 && $count > 1) {
                            $strTemp_ = '_' . $arrTemp[$this->pid];
                            !isset($this->arrIdRelation[$strTemp_]) && $this->arrIdRelation[$strTemp_] = array();
                            $this->arrIdRelation[$strTemp_][$strTemp] = array();
                            !isset($this->arrIdSon[$strTemp_]) && $this->arrIdSon[$strTemp_] = array();
                            array_push($this->arrIdSon[$strTemp_], $strTemp);
                    } else {
                            !isset($this->arrIdRelation[$strTemp]) && $this->arrIdRelation[$strTemp] = array();
                            array_push($this->arrIdRoot, $strTemp);
                    }
            }

            $this->arrIdRelation = $this->helpForGetRelation($this->arrIdRelation);
            $this->arrIdLeaf = array_unique($this->arrIdLeaf);
            foreach ($this->arrIdRelation as $strTemp => $arrTemp) {
                    $this->arrIdChildren[$strTemp] = $this->helpForGetChildren($arrTemp);
                    in_array($strTemp, $this->arrIdRoot) && $this->arrIdRelationSimple[$strTemp] = $arrTemp;
            }
            $arrTemp = array_keys($this->arrIdAll);
            foreach ($arrTemp as $strTemp) {
                    $this->arrIdBackPath[$strTemp] = $this->helpForGetBackPath($strTemp);
            }
    }

    /**
     * 數據處理
     * @param type $intLen
     * @return string
     */
    private function genSeparator($intLen) {
            $strRe = '';
            $i = 0;
            while ($i < $intLen) {
                    $strRe .= ' ' . (($i + 1 == $intLen) ? '├' : '│');
                    $i++;
            }

            !empty($strRe) && $strRe .= '─';
            return $strRe;
    }

    /**
     * 數據處理
     * @param type $arrRelation
     * @param type $intSep
     * @return type
     */
    private function genHtml($arrRelation = null, $intSep = 0) {
            $strRe = '';
            null === $arrRelation && $arrRelation = $this->arrIdRelationSimple;
            foreach ($arrRelation as $strKey => $arrTemp) {
                    if (count($this->arrIdAll[$strKey]) > 0) {
                            if (!empty($this->formatTime) && count($this->formatTime) > 0) {
                                    foreach($this->formatTime as $formatTime) {
                                            if ($this->arrIdAll[$strKey][$formatTime] > 0) {
                                                    $this->arrIdAll[$strKey][$formatTime] = date('Y-m-d H:i:s' , $this->arrIdAll[$strKey][$formatTime]);
                                            }
                                    }                                   
                            }

                            $strSep = $this->genSeparator($intSep);                       
                            extract($this->arrIdAll[$strKey]);
                            eval('$strRe .= "' . $this->strItem . '";');                                               
                            count($arrTemp) > 0 && $strRe .= $this->genHtml($arrTemp, ($intSep + 1));
                    }
            }           
            return $strRe;
    }
}
?>

tree.php

復制代碼 代碼如下:

<?php  if (!empty($data)): ?>
<?php echo $data;  ?>
<?php else:  ?>
<tr><td colspan="4" class="empty"><span class="empty">沒有找到數據.</span></td></tr>
<?php endif; ?>

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚州国产精品久久久| 岛国av午夜精品| 91成人国产在线观看| 最近中文字幕日韩精品| 国产国语videosex另类| 欧美激情视频在线观看| 国产精品美女久久久久av超清| 国产免费一区视频观看免费| 久久伊人精品一区二区三区| 国产精品一区二区三区在线播放| 国产高清在线不卡| 中文字幕一精品亚洲无线一区| 在线观看欧美www| 日韩经典第一页| 日韩国产精品亚洲а∨天堂免| 亚洲精品wwww| 日韩av色综合| 欧美日韩在线免费观看| 欧美成人亚洲成人| 92版电视剧仙鹤神针在线观看| 欧美色视频日本高清在线观看| 欧美老女人性视频| 成人网欧美在线视频| 国产精品视频网站| 国产在线98福利播放视频| 91精品久久久久久久久久另类| 欧美美女操人视频| 国产大片精品免费永久看nba| 亚洲欧美制服丝袜| 在线成人免费网站| 国产午夜精品久久久| 91在线观看免费高清| 97久久精品人人澡人人爽缅北| 久久精彩免费视频| 日本不卡免费高清视频| 日韩av在线不卡| 久久视频在线观看免费| 久久影视电视剧免费网站| 亚洲欧美一区二区三区久久| 国产69精品久久久| 97久久精品人人澡人人爽缅北| 精品毛片网大全| 性欧美长视频免费观看不卡| 欧美成人激情图片网| www国产精品视频| 热久久视久久精品18亚洲精品| 国产69精品久久久久久| 97成人精品区在线播放| 久久99久久99精品中文字幕| 久久精品国产视频| 国产一区二区三区在线免费观看| 欧美日韩国产在线播放| 国产精品免费一区豆花| 国产+人+亚洲| 国产亚洲福利一区| 92看片淫黄大片欧美看国产片| 久久国内精品一国内精品| 欧美性生交大片免网| 国产成人综合一区二区三区| 91欧美视频网站| 欧美一区三区三区高中清蜜桃| 久久久人成影片一区二区三区观看| 日韩成人在线视频网站| 国产欧美日韩精品在线观看| 欧美视频国产精品| 精品呦交小u女在线| 精品国产拍在线观看| 日韩av免费在线| 欧美第一黄网免费网站| 亚洲精品自产拍| 欧美激情极品视频| 丝袜美腿精品国产二区| 日韩精品在线观看一区| 欧美大码xxxx| 日韩麻豆第一页| 亚洲欧美日韩视频一区| 欧美精品久久久久| 欧美大片在线免费观看| 懂色av一区二区三区| 国产大片精品免费永久看nba| 精品国产91久久久久久| 在线激情影院一区| 欧美极度另类性三渗透| 国产精品久久久久久久久久| 亚洲欧美一区二区三区四区| 国模吧一区二区三区| 亚洲伊人久久大香线蕉av| 黑人精品xxx一区一二区| 日韩精品免费在线播放| 欧美www视频在线观看| 亚洲欧美国产精品| 一本一本久久a久久精品综合小说| 久久99久国产精品黄毛片入口| 日韩中文字幕在线观看| 亚洲国产精久久久久久| 国产精品视频网址| 91老司机在线| 久久视频在线观看免费| 亚洲色图国产精品| 精品久久久一区| 亚洲成av人乱码色午夜| 日韩亚洲欧美成人| 成人在线中文字幕| 欧美国产日本高清在线| 久久91精品国产91久久久| 欧美日在线观看| 国产视频精品va久久久久久| 992tv成人免费影院| 97国产真实伦对白精彩视频8| 欧美成人免费全部| 97视频网站入口| 欧美激情综合色综合啪啪五月| 91精品国产免费久久久久久| 日韩欧美精品网址| 日韩欧美中文字幕在线播放| 欧美电影免费观看网站| 成人xvideos免费视频| 久久人人爽亚洲精品天堂| 亚洲男人天堂手机在线| 国产美女扒开尿口久久久| 夜夜躁日日躁狠狠久久88av| 中文字幕欧美日韩| 国产精品自产拍高潮在线观看| 亚洲电影av在线| 国产精品女人久久久久久| 亚洲自拍高清视频网站| 欧美做受高潮电影o| 青草青草久热精品视频在线观看| 国产日韩在线视频| 中文字幕久久亚洲| 成人字幕网zmw| 亚洲国产高潮在线观看| 久久精品人人爽| 51视频国产精品一区二区| 中国china体内裑精亚洲片| 日日狠狠久久偷偷四色综合免费| 2019中文字幕在线| 日韩精品在线看| 国产成人精品一区二区三区| 97国产成人精品视频| 久久精品视频在线观看| 国产精品日韩欧美综合| 人体精品一二三区| 91免费看片在线| 欧美国产欧美亚洲国产日韩mv天天看完整| 超碰91人人草人人干| 色99之美女主播在线视频| 日韩电影免费观看在线观看| 欧美激情一区二区三级高清视频| 亚洲aⅴ男人的天堂在线观看| 日韩欧美亚洲一二三区| 国内精品美女av在线播放| 国产精品露脸av在线| 亚洲xxxx视频| 性视频1819p久久| 色综合天天综合网国产成人网| 欧美一区三区三区高中清蜜桃| 国产精品久久久久久久久久尿| 欧美成在线观看| 亚洲福利在线看| 精品久久久国产精品999| 久久激情视频久久| 米奇精品一区二区三区在线观看| 久久久久久18|