1

在 CakePHP 2.x 中使用 Model::saveAssociated() 显示 hasMany 关联的验证错误的最简单方法是什么?

这是 CakePHP 食谱中的一个示例。(http://book.cakephp.org/2.0/en/models/saving-your-data.html#saving-related-model-data-hasone-hasmany-belongsto

echo $this->Form->create('Company', array('action' => 'add'));
echo $this->Form->input('Company.name', array('label' => 'Company name'));
echo $this->Form->input('Company.description');
echo $this->Form->input('Company.location');

echo $this->Form->input('Account.0.name', array('label' => 'Account name'));
echo $this->Form->input('Account.0.username');
echo $this->Form->input('Account.0.email');

echo $this->Form->end('Add');

例如,当验证 Account.0.email 失败时,表单字段似乎不会自动失效。虽然错误在 $this->Company->Account->validationErrors 中列出。

有没有办法自动使相应的字段无效并显示相应的验证错误?

4

1 回答 1

0

它不是 100% 自动化的,但是 CakePHP 提供了一些你可以组合在一起的东西。

首先,我假设您使用的是最新的 2.4

我提供的解决方案有两部分:

a)您在控制器级别验证数据

b)您在 View 级别的 FormHelper 处确定错误消息。

对于 a) 部分

您可以参考此链接http://book.cakephp.org/2.0/en/models/data-validation/validating-data-from-the-controller.html#validating-data-from-the-controller

基于该链接,我建议两种方法。

1)您可以单独验证每个模型数据。

例子,

if ($this->Company->validates(array('fieldList' => array('name', 'location')))) {
    // valid
} else {
    // invalid
}

然后你做一个

if ($this->Account->validates(array('fieldList' => array('email')))) {
    // valid
} else {
    // invalid
}

因为您使用 hasMany,所以您可能需要分别验证每组不同的 Account 数据。

因此,您可能会使用循环,因此您可以使用并且我引用,

如果您在循环中进行验证并希望分别设置每组错误,请不要使用 invalidFields()。而是使用 validates() 并访问 validationErrors 模型属性。

2)第二种方法是使用这个

if ($this->Company->saveAll($this->request->data, array('validate' => 'only'))) {
  // validates
} else {
  // does not validate
}

您可以在我提供的链接底部找到它。

现在至于 b) 部分,在 FormHelper 上显示错误。

您可以阅读http://book.cakephp.org/2.0/en/core-libraries/helpers/form.html#FormHelper::error

于 2013-10-09T01:26:27.613 回答