Cakephp3在视图单元格中使用递归函数 [英] Cakephp3 using recursive function in view cells
本文介绍了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屋!
查看全文