我应该如何在模型中声明我的树行为以保留CakePHP 2.5.x中的范围?

时间:2014-09-26 16:02:02

标签: cakephp cakephp-2.5

我会直截了当:我想根据各自的menu_id管理多个(链接)树。只要只有一棵树:没问题。当我在链接模型中使用不同的菜单ID启动另一棵树时,事情变得混乱。

我希望能够在保留范围(menu_id)的同时添加,编辑,删除,moveUp或moveDown。 这部分文档对我来说不清楚: http://api.cakephp.org/2.5/source-class-TreeBehavior.html#41-49

这是我的链接模型。

<?php
App::uses('AppModel', 'Model');

class Link extends AppModel {

    public $name = 'Link';

    public $displayField = 'title';

    public $actsAs = array('Tree' => array(
        'parent' => 'parent_id',
        'left' => 'lft',
        'right' => 'rght',
        'scope' => "WHAT-SHOULD-I-PLACE-HERE??",
    ));

    public $belongsTo = array(
        'Menu' => array(
            'className' => 'Menu',
            'foreignKey' => 'menu_id',
        )
    );
}

我的菜单模型。

<?php
App::uses('AppModel', 'Model');

class Menu extends AppModel {

    public $displayField = 'title';

    public $hasMany = array(
        'Link' => array(
            'className' => 'Link',
            'foreignKey' => 'menu_id',
            'dependent' => false,
        )
    );

}

2 个答案:

答案 0 :(得分:2)

感谢 BadHorsie ,我终于明白了在模型的行为设置中声明范围是没有意义的。

相反,您(目前我)需要动态附加行为,并在执行任何操作(添加,编辑,上移,下移等)之前使用所需范围,以使其正常工作。

现在,我需要确保链接始终具有menu_id。 当有人编辑链接时,必须根据menu_id下拉列表重新填充parent_id下拉列表(此处需要javascript以及模型中的更多验证规则以确保完整性)。

解决方案是在Link模型中创建一个新函数。它的目标是在对树进行任何修改时保留范围(向上移动,向下移动,从树中删除,删除等)。

public function preserveScope($menuId) {
    $this->Behaviors->attach('Tree', array(
        'scope' => array(
            'Link.menu_id' => $menuId
        ),
    ));
    return true;
}

答案 1 :(得分:1)

范围基本上是一个SQL条件(以Cake格式)。

因此,您可能需要将范围设置为所需的菜单ID。

'scope' => array(
    'Link.menu_id' => 5
);

但是,在尝试在类定义上设置数组时,您可能还不知道哪个ID,因此您可能必须动态执行此操作。

$this->Link->Behaviors->attach('Tree', array(
    'scope' => array(
        'Link.menu_id' => $id  // You need to decide how to get this ID
    ),
));

我不知道你什么时候需要这样做。由您决定何时附加行为。

编辑:如果moveUp / moveDown方法无法正常工作,您使用的范围字段可能不正确吗?