我有一个页面,其中有FormHelper生成的多个表单,旨在修改同一个实体。问题是:验证错误将显示在两个表单上。
使用cakephp 2,通过扩展模型解决了这个问题(参见:http://bakery.cakephp.org/articles/RabidFire/2010/06/26/multiple-forms-per-page-for-the-same-model)。
但是我不知道如何用cakephp 3来做到这一点。
编辑:我将更准确地描述我正在尝试做的事情。
我在同一页面上有两个表单。第一个允许用户更改他的电子邮件地址,另一个用户更改密码。
两个表单都是使用Form帮助程序和相同的用户实体创建的。
在这两种形式中,都有一个字段,用户应输入其当前密码(作为安全措施)。在让电子邮件或密码更改之前,验证者将检查输入的密码是否正确。
问题:假设用户尝试更改其电子邮件但输入了错误的密码,两个表单上都会显示“密码错误”消息。
答案 0 :(得分:2)
这是一种边缘情况,FormHelper尚未准备好处理。但这是一个解决方案,您将需要2个实体:
$user = $this->Users->get($id);
$user->unsetProperty('password');
$clonedUser = clone $user;
$this->set(compact('user', 'clonedUser'));
在您的视图中,您可以通过一种方式构建表单,以便检测应传递的实体:
echo $this->Form->create($this->request->data('_form1') ? $user : $clonedUser);
... fields here
echo $this->Form->hidden('_form1', ['value' => 1]);
echo $this->Form->create($this->request->data('_form2') ? $user : $clonedUser);
... fields here
echo $this->Form->hidden('_form2', ['value' => 1]);
上述代码的作用是检测以前提交的表单,并使用空的克隆实体或具有错误的实体呈现表单。
答案 1 :(得分:1)
偶然发现这是因为我有同样的要求。我会选择José,但将逻辑转移到Controller:
$callback = $this->Inquiries->newEntity();
$inquiry = $this->Inquiries->newEntity();
if ($this->request->is('post')) {
if ($this->request->data('_type') === 'callback') {
$callback = $this->Inquiries->patchEntity($callback, $this->request->data, ['validate' => 'callback']);
$entity = &$callback;
} elseif ($this->request->data('_type') === 'inquiry') {
$inquiry = $this->Inquiries->patchEntity($inquiry, $this->request->data);
$entity = &$inquiry;
}
if (!$entity->errors()) {
// do stuff here
}
}
$this->set(compact('callback', 'inquiry'));
传递表格的类型:
echo $this->Form->input('_type', ['type' => 'hidden', 'value' => 'inquiry']);