我已经按照本教程设置了一个带有ACL的Cake 2.3.1应用程序,所以我有一个用户表和一个组表。
一切正常,但我有点困惑,我应该如何去保存新用户,因为我不希望用户能够选择自己的组。该组将根据用户在表单上输入的许多内容来选择,因此它将由控制器中的条件语句决定。
此刻我正在做这个:
$this->request->data['User']['group_id'] = '2';
(或1,3或4,取决于控制器中的条件语句)。
然后,我在$this->data
上做保存。这是有效的,但我希望能够指定组名称而不是硬编码id,以便当我们移动到生产并清除数据库时,如果组以不同的顺序添加则无关紧要。
我看到了两种方法。
第一个我没有尝试过,但它将把组表的主键更改为组的名称,并在group模型中设置primaryKey变量,并在所有其他模型中设置与此表的所有后续引用和关联。这可能会给您带来更多的头痛,我不建议这样做,因为您可能会以这样或那样的方式破坏ACL组件。
另一种方法是我要做的,它需要你做一点编程(我知道Cake没有一个简单的方法来做这个)。在User模型中,放置一个beforeSave,并在该函数中创建一个具有组名的虚拟变量,查找该名称并插入正确的id,然后删除该变量。
用户。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函数将负责其余部分。
我意识到你要求一个简单的方法来做到这一点,但我想没有(虽然不确定,随时纠正我),beforeave函数可以为你节省大量的控制器上的重复代码。在清除数据库或更改组id时,唯一需要注意的是将它们与数据库中已有的用户正确地重新关联,但由于是"转向生产"更改,因此预定义的用户应该很少或没有。