1

我在 CakePHP 中启动树行为问题时遇到问题。lft我已经用,rghtparent_id列设置了表格。

我正在添加第一个条目,其他人可以在该parent_id列中引用该条目。但是,引用不能按我的意愿工作。

第一个条目按预期添加到数据库中。如果我不指定parent_id该列将NULL作为数据库值。和列也越来越lft有价值。我不确定这是否是它应该做的。rghtNULL

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

我试图在第一个条目上设置lftandrght1, 11, 2但没有任何运气。

我在这里做错了吗?

4

2 回答 2

1

您绝对不想设置 lft 和 rght。这些由框架处理。您是否让它们默认null为文档指定的?

我总是parent_id在使用树行为时设置,然后 CakePHP 会根据父 ID 自动处理树结构。如果您需要在分支内移动项目,则可以使用该行为的其他功能来执行此操作。

尝试设置parent_id然后保存。如果这不起作用,请告诉我。

于 2012-07-04T20:59:59.243 回答
0

这很有趣,但这是 Cake php 中未记录的部分。文档说:树的顶部元素需要将 parent_id 设置为“null”。但是当您在编辑时保存元素时,重新排序不起作用,因为重新排序寻找孩子时有一个有趣的条件:

    if ($id === null && $Model->id) {
        $id = $Model->id;
    } elseif (!$id) {
        $id = null;
    }

在 TreeBehavior 线 300 周围。

所以如果你用 id=>null 调用 reorder 并且你有一个 $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) );
        }

它将重新排序整个树。注意:有很多树项目保存会变慢,所以你必须检查你的订单字段是否被更改。

于 2014-12-29T18:11:34.193 回答