【问题标题】:CakePHP Tree Behavior issue - first entryCakePHP 树行为问题 - 第一个条目
【发布时间】:2012-06-30 12:41:03
【问题描述】:

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

我正在添加第一个条目,其他人可以通过 parent_id 列引用该条目。但是,引用并没有按我的意愿工作。

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

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

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

我在这里做错了吗?

【问题讨论】:

  • 已解决!事实证明,当调用 $model->save() 方法时,发送和带有数据(添加时)的 ID 会破坏行为。所以,我跳过了用它发送一个 ID,现在它可以工作了。 (我发送 ID 的原因是因为我正在从旧表中导入数据)。

标签: php cakephp tree cakephp-2.2


【解决方案1】:

你肯定不想设置 lft 和 rght。这些由框架处理。您是否按照文档指定将它们默认为null

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

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

【讨论】:

  • 感谢您的回答,但我刚刚解决了。事实证明,当调用 $model->save() 方法时,发送和带有数据(添加时)的 ID 会破坏行为。所以,我跳过了用它发送一个 ID,现在它可以工作了。 (我发送 ID 的原因是因为我正在从旧表中导入数据)。
  • 感谢您对 NULL 和 parent_id 的提醒。
  • 发生这种情况是因为该行为仅在创建记录时设置树值,然后使用 api 函数。如果你传递了一个 ID,那么 Cake 可能认为你正在更新,除非你明确告诉它,否则它不想改变树。很高兴你让它工作了!
【解决方案2】:

这很有趣,但这是 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) );
        }

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

【讨论】:

    猜你喜欢
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多