cakephp树行为删除除子节点之外的父节点

时间:2012-02-06 16:48:24

标签: php cakephp tree cakephp-1.3 php-5.3

是否可以使用CakePHP Tree Behavior?从树中删除父节点。比方说,我有一个这样的节点:

<Node A>
    - child 1 node A
    - child 2 node A
    - child 3 node A
    - <Node B> (which is also a child 4 of Node A)
        - child 1 node B
        - child 2 node B

是否有可能获得Node A的所有chidren(使用chidren()或cakePHP中Tree行为的任何其他函数),但是从结果中排除一个有子节点的节点(在我们的例子中是节点B)?

请问好吗?

提前致谢

4 个答案:

答案 0 :(得分:0)

你可以,但是你需要让你的手有点脏,因为我不认为这种行为允许这样的事情。

关键是所有没有子节点的节点都应该有一个leftright值。你需要发起这样的查询:

SELECT * FROM items WHERE left > (parent's left) AND right < (parent's right) AND right = left + 1 AND parent_id = (parent's ID)

这样我们就会要求所有返回的值都是父节点的子节点,并且它们的左右值是顺序的,如果节点有子节点,它们就不会出现。

答案 1 :(得分:0)

查看规范没有具体方法,因此您必须使用children()和childCount()为其构建自己的函数。这是代码模板(我不使用Cake PHP):

$children = <call TreeBehavior children() method with $id = id of Node A and $direct = true>;
$children_without_children = array();
foreach ($children as $child) {
    if (<call TreeBehavior childCount() method with $id = $child->id and $direct = true> === 0) {
        $children_without_children[] = $child;
    }
}

然后$ children_without_children应该包含你想要的东西。

答案 2 :(得分:0)

您可以使用此代码:

$this->Node->removeFromTree($id, true);

答案 3 :(得分:0)

这是我的cakephp 2.x项目的代码:

public function delete($id = null) {
        $this->ProductCategory->id = $id;
        if (!$this->ProductCategory->exists()) {
            throw new NotFoundException(__('Invalid product category'));
        }
        $this->request->allowMethod('post', 'delete');
        if ($this->ProductCategory->removeFromTree($id, TRUE)) {
            $this->Session->setFlash(__('The product category has been deleted.'));
        } else {
            $this->Session->setFlash(__('The product category could not be deleted. Please, try again.'));
        }
        return $this->redirect(array('action' => 'index'));
    }

使用此方法(例如removeFromTree())将删除或移动节点,但保留其子树,该子树将重新设置一级。它提供了比delete更多的控制,对于使用树行为的模型,它将删除指定的节点及其所有子节点。