为了澄清我的问题,我想使用 CakePHP 文档中的 Profile <-> User 示例。定义的关系有:
- 个人资料属于用户
- 用户 hasOne 个人资料
在数据库中,profiles 表有一个归档的 user_id 用于存储关系。
在大多数示例中,用户在 Profile 区域中设置或编辑此关系。含义:在配置文件的编辑视图中,有一个输入字段允许为配置文件设置另一个用户。它通过将以下内容放入 Profiles/edit 视图中自动工作:
echo $this->Form->input('user_id');
我们权利管理的改变要求我们改变这种关系的设定方式。我们必须将其从 Profiles 区域中取出,而将其显示在 Users 区域中。
当在 UsersController 中读取用户记录的数据时 ($this->request->data = $this->User->read(null, $id);),CakePHP 自动将 Profile 数据绑定到 User 数据(如果存在)。但是,由于 users 表中没有字段 profile_id (因为关系存储在“另一边”),显然 echo $this->Form->input('profile_id')); 在用户/编辑视图中不起作用。
我已经了解到,必须首先在 Controller 的编辑操作中构建配置文件列表:
$this->set('profiles', $this->User->Profile->find('list'));
然后让 CakePHP 创建一个选择列表:
echo $this->Form->input('Profile');
不过,好像少了点什么。在我们的例子中,当我查看 CakePHP 创建的 HTML 输出时,选择列表中的几个选项元素具有 selected 属性集,尽管用户只有一个特定的配置文件,并且该配置文件存储在 $this->data 中。
不知何故,我认为我必须设置一些进一步的选项才能让它工作(如果有办法让它自动工作——也许没有)。
我的意思是我可以设置 Form->input() 调用的“选定”属性。由于 CakePHP 创建的表单元素的名称是“data[Profile]”,我不确定 CakePHP 是否会自动正确保存更改,或者我是否必须手动进行。步骤是:
- 查找将 user_id 设置为当前用户记录的 id 的(以前的和仍然存在的)当前配置文件记录,并将该 user_id 设置为 0(或 NULL)。
- 查找在 data[Profile] 中设置了 id 的配置文件,并将其 user_id 设置为当前用户的 id。
但是我必须自己做吗,或者我只是错过了一些让 CakePHP 能够做到的事情?