广

IOS开发

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

    yii框架分类树扩展示例

    2018-04-04 08:35:39 次阅读 稿源:互联网
    广告

    提供两种方式的分类树格式,表格和下拉框形式的树形结构
    可以自定义表格和下拉框的样式,自定义以哪一列的参数为格式化数据,自定义层级关系参数,自定义表格列名称,也可以设置时间的格式化。


    调用方式

    表格方式:
    代码如下:

    <?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; ?>

    一起学吧部分文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与一起学吧进行文章共享合作。

    广告
    广告
    广告