0

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

我希望能够在保留范围 (menu_id) 的同时添加、编辑、删除、上移或下移。我不清楚这部分文档: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,
        )
    );

}
4

2 回答 2

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;
}
于 2014-10-02T20:11:12.017 回答
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 方法不能正常工作,也许您使用的范围字段不正确?

于 2014-09-29T14:56:27.180 回答