<?php
class k_model_menu_menu

{

    private $data = array();

    private $rdata = array();

    private $jdata = array();

    private $level = 0;

    private $paret = array();

    function getOption($type= 'part',$pid = 0)

    {

        if($type = 'all') $this->data= R::getAll( 'select * from menu' );

        

        $this->teamData();

        

        if($this->rdata) return $this->rdata;

        return false;    

    }

    

    function addMenu($data){

        foreach($data as $key =>$value){

            if($value == '请填写内容!') $data[$key]='';

        }

        if($data){

            $menu = R::dispense('menu');

            $menu->pid = $data['pid'];

            $menu->name = $data['name'];

            $menu->url = $data['url'];

            $menu->icon = $data['icon'];

            $id = R::store($menu);

            return $id;

        }

    }

    //返回json 字符串

    public function getJsonMenu(){

        $data = $this->getChild(1);

        $this->jdata = $data;

        $this->recursive($this->jdata);

        return  json_encode($this->jdata);

    }

        

    //递归函数  实现不断的生成子节点,用了引用,感觉这引用是如来神笔,要不然实现太复杂了

    public function recursive(&$data = array()){

        foreach($data as $key =>$value){

            $data[$key]['children']= $this->getChild($value['id']);

            $tmp = &$data[$key]['children'];

            if($tmp){

                $this->recursive($tmp);

            }

        }

    }

    

    //组织数据,用于生成树形的select 返回的是一个数组

    //数组的形式是

        public function teamData($pid=1){

            foreach ($this->data as $key => $value) {    

                if($value['pid']==$pid){

                        $this->level++;

                        array_push($this->rdata, array('name'=>$value['name'],'level'=>$this->level,'id'=>$value['id']));

                                

                    $tmpdata = $this->teamData($value['id']);

                    if(!$tmpdata){

                        $this->level--;

                        continue;

                    }

                }

            }    

        }

        

    

    //根据pid拿取下面的子数据

    public function getChild($pid){

         $data=  R::getAll( "select * from menu where pid = {$pid}" );

         $tmpdata = array();

         if($data){

             foreach ($data as $key => $value) {

                 $tmpdata[$key]['id'] =  $value['id'];

                 $tmpdata[$key]['icon'] =  $value['icon'];

                 $tmpdata[$key]['text'] =  $value['name'];

                 $tmpdata[$key]['url'] =  $value['url'];

                 $tmpdata[$key]['children'] =  array();

             }

         }

         return $tmpdata;

    }

    

    

}

[置顶] 递归 加引用 实现tree 和 无限级菜单的更多相关文章

  1. [置顶] 异步加载图片,使用LruCache和SD卡或手机缓存,效果非常的流畅

    转载请注明出处http://blog.csdn.net/xiaanming/article/details/9825113 异步加载图片的例子,网上也比较多,大部分用了HashMap<Strin ...

  2. 【置顶】Trotyl's OI tree

    \(\rm thx\):@\(\rm UntilMadow\) ! \(\color{Green}{\rm Pupil}\) :只会一点点 \(\color{blue}{\text{Expert}}\ ...

  3. [置顶] ※数据结构※→☆非线性结构(tree)☆============树结点 链式存储结构(tree node list)(十四)

    结点: 包括一个数据元素及若干个指向其它子树的分支:例如,A,B,C,D等. 在数据结构的图形表示中,对于数据集合中的每一个数据元素用中间标有元素值的方框表示,一般称之为数据结点,简称结点. 在C语言 ...

  4. [置顶] Flex中Tree组件无刷新删除节点

    在Tree组件中经常要删除某个节点,而删除之后重新刷新加载该Tree组件会影响整个操作效果和效率,因此,无刷新删除就比较好,既删除了节点也没有刷新tree,而使Tree的状态处于删除之前的状态. 无刷 ...

  5. Discuz常见小问题-如何批量加精,置顶帖子

    批量选中帖子,然后置顶和精华都可以勾选 完成之后的效果

  6. [置顶] Android开发笔记(成长轨迹)

    分类: 开发学习笔记2013-06-21 09:44 26043人阅读 评论(5) 收藏 Android开发笔记 1.控制台输出:called unimplemented OpenGL ES API ...

  7. js上移、下移、置顶、置底功能实现

    实现页面上列表内容上移.下移.置顶.置底 功能,主要实现思路是节点操作,比如说:上移,直接把点击项移动到前一个节点,以此类推,当然实际代码实现还要加些判断,如当前点击操作项是否已经是置底或置底了,如果 ...

  8. [置顶]VC2013的一个bug

    [置顶]VC2013的一个bug 前段时间在尝试使用一个C++的GUI库nana.这个库最大的特点在于使用现代C++风格去编写GUI程序,而不需要使用大量的比较丑陋的代码(如MFC中的各种宏),或者其 ...

  9. [置顶] 创建GitHub技术博客全攻略

    [置顶] 创建GitHub技术博客全攻略 分类: GitHub2014-07-12 13:10 19710人阅读 评论(21) 收藏 举报 githubio技术博客网站生成 说明: 首先,你需要注册一 ...

随机推荐

  1. Linux 系统编程

    简介和主要概念 Linux 系统编程最突出的特点是要求系统程序员对它们工作的的系统的硬件和操作系统有深入和全面的了解,当然它们还有库和系统调用上的区别. 系统编程分为:驱动编程.用户空间编程和网络编程 ...

  2. Selenium2Library系列 keywords 之 _SelectElementKeywords 之 _get_values_for_options(self, options)

    def _get_values_for_options(self, options): values = [] for option in options: values.append(option. ...

  3. Tip提示框另类写法

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. socket.io的抽象实现:engine.io

    engine.io是一个socket.io的抽象实现,作为socket.io的服务器和浏览器之间交换的数据的传输层.它不会取代Socket.IO,它只是抽象出固有的复杂性,支持多种浏览器,设备和网络的 ...

  5. The h.264 Sequence Parameter Set

    转债:  http://www.cardinalpeak.com/blog/the-h-264-sequence-parameter-set/ View from the Peak The h.264 ...

  6. 第二百四十九天 how can I 坚持

    竟然让我跟着他们去旅游..泡温泉,滑雪..西北坡,不去白不去. 罗娜,你别把我拉黑啊.哎,不知道咋办. 晚上玩了四局LOL,全输了,伤心. 还有今天抢票没抢到. 该怎么破,12点半正好在吃饭啊. 睡觉 ...

  7. Java Thread.interrupt 害人! 中断JAVA线程(zz)

    http://www.blogjava.net/jinfeng_wang/archive/2012/04/22/196477.html#376322 ————————————————————————— ...

  8. poj 1469 COURSES(匈牙利算法模板)

    http://poj.org/problem?id=1469 COURSES Time Limit: 1000MS   Memory Limit: 10000K Total Submissions:  ...

  9. [iOS基础控件 - 6.10.3] DatePicker & UIToolBar

    A.需求 1. 学习DatePicker的基本配置 2.使用TextField召唤指定类型的输入键盘View,这里使用DatePicker 3.给输入键盘上方加上一个UIToolBar,实现如关闭键盘 ...

  10. Flask框架获取用户IP地址的方法

    本文实例讲述了python使用Flask框架获取用户IP地址的方法.分享给大家供大家参考.具体如下: 下面的代码包含了html页面和python代码,非常详细,如果你正使用Flask,也可以学习一下最 ...