Cakephp3在视图单元格中使用递归函数

时间:2016-05-25 13:10:23

标签: cakephp cakephp-3.0

我想使用这个Recursive Function将php数组转换为父数组和子数组。

我有一个这样的细胞:

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


}

但它给了我这个错误: enter image description here

然而,如果我在控制器中做同样的事情,它的工作非常好。 任何帮助都可以节省我的一天。

1 个答案:

答案 0 :(得分:1)

如果你想创建dinamic菜单,试试这个:

首先检查你的MenusTable,你的表应该有父id的字段(在我的例子中是parent_id)并创建关系belongsTo,hasMany

菜单型号

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

示例结果:

[
    (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
    ]
]