Cakephp 3:同一模型的每页多个表单

时间:2015-03-10 21:59:26

标签: cakephp cakephp-3.0

我有一个页面,其中有FormHelper生成的多个表单,旨在修改同一个实体。问题是:验证错误将显示在两个表单上。

使用cakephp 2,通过扩展模型解决了这个问题(参见:http://bakery.cakephp.org/articles/RabidFire/2010/06/26/multiple-forms-per-page-for-the-same-model)。

但是我不知道如何用cakephp 3来做到这一点。

编辑:我将更准确地描述我正在尝试做的事情。

我在同一页面上有两个表单。第一个允许用户更改他的电子邮件地址,另一个用户更改密码。

两个表单都是使用Form帮助程序和相同的用户实体创建的。

在这两种形式中,都有一个字段,用户应输入其当前密码(作为安全措施)。在让电子邮件或密码更改之前,验证者将检查输入的密码是否正确。

问题:假设用户尝试更改其电子邮件但输入了错误的密码,两个表单上都会显示“密码错误”消息。

2 个答案:

答案 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']);