我会直截了当:我想根据各自的menu_id管理多个(链接)树。只要只有一棵树:没问题。当我在链接模型中使用不同的菜单ID启动另一棵树时,事情变得混乱。
我希望能够在保留范围(menu_id)的同时添加,编辑,删除,moveUp或moveDown。 这部分文档对我来说不清楚: http://api.cakephp.org/2.5/source-class-TreeBehavior.html#41-49
这是我的链接模型。
<?php
App::uses('AppModel', 'Model');
class Link extends AppModel {
public $name = 'Link';
public $displayField = 'title';
public $actsAs = array('Tree' => array(
'parent' => 'parent_id',
'left' => 'lft',
'right' => 'rght',
'scope' => "WHAT-SHOULD-I-PLACE-HERE??",
));
public $belongsTo = array(
'Menu' => array(
'className' => 'Menu',
'foreignKey' => 'menu_id',
)
);
}
我的菜单模型。
<?php
App::uses('AppModel', 'Model');
class Menu extends AppModel {
public $displayField = 'title';
public $hasMany = array(
'Link' => array(
'className' => 'Link',
'foreignKey' => 'menu_id',
'dependent' => false,
)
);
}
答案 0 :(得分:2)
感谢 BadHorsie ,我终于明白了在模型的行为设置中声明范围是没有意义的。
相反,您(目前我)需要动态附加行为,并在执行任何操作(添加,编辑,上移,下移等)之前使用所需范围,以使其正常工作。
现在,我需要确保链接始终具有menu_id。 当有人编辑链接时,必须根据menu_id下拉列表重新填充parent_id下拉列表(此处需要javascript以及模型中的更多验证规则以确保完整性)。
解决方案是在Link模型中创建一个新函数。它的目标是在对树进行任何修改时保留范围(向上移动,向下移动,从树中删除,删除等)。
public function preserveScope($menuId) {
$this->Behaviors->attach('Tree', array(
'scope' => array(
'Link.menu_id' => $menuId
),
));
return true;
}
答案 1 :(得分:1)
范围基本上是一个SQL条件(以Cake格式)。
因此,您可能需要将范围设置为所需的菜单ID。
'scope' => array(
'Link.menu_id' => 5
);
但是,在尝试在类定义上设置数组时,您可能还不知道哪个ID,因此您可能必须动态执行此操作。
$this->Link->Behaviors->attach('Tree', array(
'scope' => array(
'Link.menu_id' => $id // You need to decide how to get this ID
),
));
我不知道你什么时候需要这样做。由您决定何时附加行为。
编辑:如果moveUp / moveDown方法无法正常工作,您使用的范围字段可能不正确吗?