1

我按照本教程设置了一个带有 ACL 的 Cake 2.3.1 应用程序,所以我有一个用户表和一个组表。

一切正常,但我对如何保存新用户有点困惑,因为我不希望用户能够选择他们自己的组。该组将根据用户在表单上输入的许多内容进行选择,因此它将由控制器中的条件语句确定。

目前我正在这样做:

$this->request->data['User']['group_id'] = '2';(或 1、3 或 4,具体取决于控制器中的条件语句)。

然后,我正在保存$this->data. 这可行,但我希望能够指定组而不是硬编码 id,这样当我们进入生产环境并清除数据库时,是否以不同的顺序添加组都没有关系。

4

1 回答 1

0

我看到了两种方法。

第一个我没有尝试过,但是它将组表的主键更改为组的名称并在组模型中设置primaryKey变量以及所有其他模型中与该表的所有后续引用和关联. 这可能会给您带来更多的头痛,我不推荐它,因为您可能会以某种方式破坏 ACL 组件。

另一种方法是我会做的,它需要您进行一些编程(据我所知,Cake 没有一种简单的方法来做到这一点)。在 User 模型中,放置一个 beforeSave 并在该函数中,使用组名创建一个虚拟变量,查找名称并插入正确的 id,然后删除该变量。

在 User.ctp 模型上

public function beforeSave() {
    if (isset($this->data[$this->alias]['group_name'])) {
        //do the lookup with the group_name
        $group = $this->Group->find('first', array('conditions'=>array('name'=>$this->data[$this->alias]['group_name'])));
        if (count($group) <= 0)
           //... throw an Exception or handle any way you want this case

        $real_group_id = $group['Group']['id'];
        $this->data[$this->alias]['group_id'] = $real_group_id;
        unset($this->data[$this->alias]['group_name']);
    }

    return true; //remember this is important! otherwise the save will stop
}

当您想要更改用户的组或添加另一个用户时,只需在控制器中执行此操作, $data_to_save['User']['group_name'] = 'webuser'; beforeSave 函数将处理其余部分。

我意识到您要求使用 Cake-easy 方法来执行此操作,但我想没有(虽然不确定,请随时纠正我),beforeSave 函数可以为您节省大量控制器上的重复代码。清除数据库或更改组 ID 时唯一需要小心的是将它们与数据库中已有的用户正确重新关联,但由于是“迁移到生产”更改,因此已经预定义的用户应该很少或没有任何。

于 2013-04-04T15:24:19.513 回答