CakePHP树行为问题 - 第一个条目

时间:2012-06-30 12:41:04

标签: php cakephp tree cakephp-2.2

我遇到了在CakePHP中启动Tree行为问题的问题。我已使用lftrghtparent_id列设置了表格。

我正在添加第一个条目,其他人可以参考parent_id列。但是,引用并不像我想的那样工作。

第一个条目按预期添加到数据库中。如果我没有指定parent_id该列将获得NULL作为数据库值。 lftrght列也以NULL作为值。我不确定这是不是应该做的。

当我尝试在初始条目之后添加新条目时,保存将失败。

我尝试在第一个条目中将lftrght列设置为1, 11, 2,但没有任何运气。

我在这里做错了吗?

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

它将重新排序整个树。 注意:对于大量树项,保存会变慢,因此您必须检查订单字段是否已更改。