我遇到了在CakePHP中启动Tree行为问题的问题。我已使用lft
,rght
和parent_id
列设置了表格。
我正在添加第一个条目,其他人可以参考parent_id
列。但是,引用并不像我想的那样工作。
第一个条目按预期添加到数据库中。如果我没有指定parent_id
该列将获得NULL
作为数据库值。 lft
和rght
列也以NULL
作为值。我不确定这是不是应该做的。
当我尝试在初始条目之后添加新条目时,保存将失败。
我尝试在第一个条目中将lft
和rght
列设置为1, 1
和1, 2
,但没有任何运气。
我在这里做错了吗?
答案 0 :(得分:1)
你绝对不想设置lft和rght。这些由框架处理。您是否按照文档指定将它们默认为null
?
我在使用Tree Behavior时总是设置parent_id
,然后CakePHP根据父ID自动处理树结构。如果你需要在分支中移动项目,那么你可以使用行为的其他功能来做到这一点。
尝试只设置parent_id
,然后保存。如果这不起作用,请告诉我。
答案 1 :(得分:0)
这很有趣,但这是Cake php的一个未记录的部分。该文档说:树的顶部元素需要将parent_id设置为“null”。 但是当您在编辑时保存elemet时,重新排序不起作用,因为重新排序寻找孩子时有一个有趣的条件:
if ($id === null && $Model->id) {
$id = $Model->id;
} elseif (!$id) {
$id = null;
}
围绕TreeBehavior 300行。
因此,如果您使用id => null调用重新排序并且您拥有$ Model-> id,则实际的树项目将仅重新排序。这是错的,我想重新整理我的整个树,因为我已经在顶级类别项目上更改了我的订单字段!我认为这是一种错误。
您必须将id =>''设置为空,然后整个树将被重新排序。那是你想要的。当您编辑顶部树项并想重新排序时,您必须使用id =>''
调用重新排序 if(!empty($this->data['WebshopCategory']['parent_id'])){
$this->reorder ( array('id' => $this->data['WebshopCategory']['parent_id'], 'field' => 'ordered', 'order' => 'ASC', 'verify' => true) );
}else{
$this->reorder ( array('id'=>'', 'field' => 'ordered', 'order' => 'ASC', 'verify' => true) );
}
它将重新排序整个树。 注意:对于大量树项,保存会变慢,因此您必须检查订单字段是否已更改。