Cakephp3在视图单元格中使用递归函数 [英] Cakephp3 using recursive function in view cells

查看:116
本文介绍了Cakephp3在视图单元格中使用递归函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用此


但是,如果我在控制器中执行相同的操作,则效果很好。
任何帮助都会节省我的时间。

解决方案

如果要创建动态菜单,请尝试以下操作:



首先检查您的MenusTable,您的表中应包含具有父ID(在我的示例中为parent_id)的字段,并创建一个RelationshipTo,hasMany



菜单模型

 类MenusTable扩展了表
{

公共函数initialize(array $ config)
{
parent :: initialize($ config);

$ this->表(菜单);
$ this-> displayField(’name’);
$ this-> primaryKey(’id’);

$ this-> addBehavior('Timestamp');
$ this-> addBehavior(’Tree’);

$ this-> belongsTo('ParentMenus',[
'className'=>'Menus',
'foreignKey'=>'parent_id'
]);
$ this-> hasMany('ChildMenus',[
‘className’=>‘Menus’,
‘foreignKey’=>’parent_id’
]);
}

}

MenuCell >

  class MenuCell扩展单元格{
公共功能显示($ menu){
$ this-> ; loadModel('Menus');

$ menus = $ this-> Menus-> find(’threaded’)-> where(['id'=> $ menu])-> toArray();

$ menus = $ this-> buildTree($ menus);

$ this-> set(compact(’menus’));
$ this-> set('_ serialize',['menus']);
}

//递归函数:

保护函数buildTree($ menus){

foreach($ menus as $ element) {

if(!is_array($ element)){
$ element = $ element-> toArray();
}

//每个菜单数组元素
$ menu [’name’] = $ element [’name’];
$ menu [’url’] = $ element [’url’];

foreach($ element as $ key => gt; $ value){

if(is_array($ value)){
$ menu [$ key] = $ this-> buildTree($ value);
}

}
$ resultMenu [] = $ menu;
}

if(isset($ resultMenu)){
return $ resultMenu;
}
}
}

示例结果:

  [
(int)0 => [
‘name’=> ‘Level_1’,
‘url’=> ‘/’,
‘children’=> null
],
(int)1 => [
‘name’=> ‘Level_1’,
‘url’=> ‘/’,
‘children’=> [
(int)0 => [
‘name’=> ‘Level_1.1’,
‘url’=> ‘/’,
‘children’=> [
(int)0 => [
‘name’=> ‘Level_1.1.1’,
‘url’=> ‘/’,
‘children’=> null
],
(int)1 => [
‘name’=> ‘Level_1.1.1’,
‘url’=> ‘/’,
‘children’=> null
]
]
],
(int)1 => [
‘name’=> ‘Level_1.1’,
‘url’=> ‘/’,
‘children’=> null
]
]
],
(int)2 => [
‘name’=> ‘Level_1’,
‘url’=> ‘/’,
‘children’=> null
],
(int)3 => [
‘name’=> ‘Level_1’,
‘url’=> ‘/’,
‘children’=> null
]
]


I want to use this Recursive Function to convert a php array into an array of parent and childs.

I have a this Cell:

class MenuCell extends Cell {
  public function display($menu) {
    $this->loadModel('Menus');
    $menus = $this -> Menus -> find('all', [
      'contain' => ['MenuItems']
    ]) -> where(['id' => $menu]);

    $menus = $this -> buildTree($menus);


    $this -> set(compact('menus'));
    $this -> set('_serialize', ['menus']);

  }

  public function buildTree($ar, $pid = null) {
    $op = array();
    foreach($ar as $item) {
      if ($item['parentId'] == $pid) {
        $op[$item['id']] = array(
          'name' => $item['name'],
          'parentId' => $item['parentId']
        );
        // using recursion
        $children = $this ->buildTree($ar, $item['id']);
        if ($children) {
          $op[$item['id']]['children'] = $children;
        }
      }
    }
    return $op;
  }


}

But it gives me this error:

However if i do the samething in controller, It works very fine. Any help would save my day.

解决方案

If you want create dinamic menu try this:

First check your MenusTable, your table should have field with parent id (parent_id in my example) and create relationship belongsTo, hasMany

Menus Model

class MenusTable extends Table
{

    public function initialize(array $config)
    {
        parent::initialize($config);

        $this->table('menus');
        $this->displayField('name');
        $this->primaryKey('id');

        $this->addBehavior('Timestamp');
        $this->addBehavior('Tree');

        $this->belongsTo('ParentMenus', [
            'className' => 'Menus',
            'foreignKey' => 'parent_id'
        ]);
        $this->hasMany('ChildMenus', [
            'className' => 'Menus',
            'foreignKey' => 'parent_id'
        ]);
    }

}

MenuCell

class MenuCell extends Cell {
    public function display($menu) {
        $this->loadModel('Menus');

        $menus = $this->Menus->find('threaded')->where(['id'=>$menu])->toArray();

        $menus = $this->buildTree($menus);

        $this->set(compact('menus'));
        $this->set('_serialize', ['menus']);
    }

    //Recursive function:

    protected function buildTree($menus) {

        foreach($menus as $element) {

            if(!is_array($element)) {
                $element = $element->toArray();
            }

            //Elements each menu array  
            $menu['name'] = $element['name'];
            $menu['url'] = $element['url'];

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

                if(is_array($value)) {
                    $menu[$key] = $this->buildTree($value);
                }

            }
            $resultMenu[] = $menu;
        }

        if(isset($resultMenu)) {
            return $resultMenu;
        }
    }
}

Example Result:

[
    (int) 0 => [
        'name' => 'Level_1',
        'url' => '/',
        'children' => null
    ],
    (int) 1 => [
        'name' => 'Level_1',
        'url' => '/',
        'children' => [
            (int) 0 => [
                'name' => 'Level_1.1',
                'url' => '/',
                'children' => [
                    (int) 0 => [
                        'name' => 'Level_1.1.1',
                        'url' => '/',
                        'children' => null
                    ],
                    (int) 1 => [
                        'name' => 'Level_1.1.1',
                        'url' => '/',
                        'children' => null
                    ]
                ]
            ],
            (int) 1 => [
                'name' => 'Level_1.1',
                'url' => '/',
                'children' => null
            ]
        ]
    ],
    (int) 2 => [
        'name' => 'Level_1',
        'url' => '/',
        'children' => null
    ],
    (int) 3 => [
        'name' => 'Level_1',
        'url' => '/',
        'children' => null
    ]
]   

这篇关于Cakephp3在视图单元格中使用递归函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆