【问题标题】:CakePHP: How can I invalidate form fields when hasMany association is used?CakePHP:当使用 hasMany 关联时,如何使表单字段无效?
【发布时间】:2014-01-13 21:32:52
【问题描述】:

我需要验证代码中的数据,因为某些验证规则取决于多个字段。

我的模型是PersonAddressHobby。关联如下所示:

Person 
    hasOne Address
    hasMany Hobby

Address
    belongsTo Person

Hobby
    belongsTo Person

现在,当 Person 模型的任何字段不正确或任何 Address 字段不正确时,我可以简单地在我的控制器中编写以下代码来通知用户他/她需要更正给定字段:

// this works fine!
$this->Person->invalidate('person_model_field_name', __('Help text'));
$this->Person->Address->invalidate('address_model_field_name', __('Help text'));

现在,如何以类似的方式使任何 Hobby 模型字段无效?

昨晚我真的很努力,但我所有的尝试都失败了。我不敢相信在 CakePHP v. 2.4.3 中没有办法做到这一点(毕竟这不是第一个版本,对吧?)。

// doesn't work
$this->Person->Hobby->invalidate('hobby_model_field_name', __('Help text'));
// doesn't work neither
$this->Person->Hobby->invalidate('Hobby.0.hobby_model_field_name', __('Help text'));
// tried to work directly on validationErrors array but also failed

我也见过this question,但我还是迷路了。 :-(

更新

这里有一个例子说明为什么我需要这个:

例如:当Person.is_student字段为true时,用户需要填写Person.studies_year字段;否则他/她需要填写Person.diploma_date字段。因此,在Personstudies_yeardiploma_date 的模型验证规则中,我需要使用allowEmpty 规则。与 Hobby 模型类似。

【问题讨论】:

  • 听起来您应该考虑使用自定义验证规则。 book.cakephp.org/2.0/en/models/…
  • 可能。但是,我的验证规则不仅取决于模型数据,还取决于流程工作流。这就是为什么我更愿意手动使某些字段无效。

标签: validation cakephp


【解决方案1】:

在这种情况下,我会使用

$this->Person->saveAll($this->request->data, array('deep' => true));

如果验证失败,您可以阅读以下所有验证消息:

$this->Person->validationErrors;

然后您在模型中定义所有验证规则和消息

【讨论】:

  • 好吧,我就是这么做的。但是在我的模型被保存(SaveAll 方法)之后,我需要检查其他条件——我刚刚用关于这个问题的一些背景信息更新了我的问题。无论如何,我需要$this->Person->validationErrors 或以任何其他方式向用户表明某些字段值不正确。另外,我允许保存模型数据,因为要填写的字段很多,我不希望用户丢失任何编辑,即使某些字段不正确。
  • 我的项目中有类似的情况,我使用: $this->Person->saveAll($this->request->data, array('deep' => true, 'validation' => 真));当我尝试保存 hasMany 或任何其他关联时,我在 $this->Person->validationErrors; 中收到错误消息
  • 没关系,它也适用于我。 :-) 但除此之外,我想指出例如字段 Hobby.0.kind 是无效的,因为 Person.age 低于某个限制。
  • 哦。现在我懂了。我仍然会尝试编写自定义验证规则:D 我认为它比这简单得多。
  • 听起来很有趣。不幸的是,我的一些验证规则依赖于未存储在我的任何模型中的数据,而是依赖于定义的工作流程。我想我可以以某种方式“粘合”我的自定义验证规则,但我宁愿不这样做,因为它闻起来很糟糕。 ;-) 我只需要一种方法来使我想要的字段无效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多