在CakePHP中创建一组相似的表单字段之一

时间:2009-07-20 09:19:52

标签: cakephp forms validation

我的表单中有一堆名称/电子邮件字段,如下所示:

data[Friend][0][name]
data[Friend][1][name]
data[Friend][2][name]

data[Friend][0][email]
data[Friend][1][email]
data[Friend][2][email]

我每个都有一个自定义验证规则,用于检查是否填写了相应的字段。即。如果数据[朋友] [2] [姓名],那么数据[朋友] [2] [电子邮件]必须填写。

仅供参考,下面是两条规则中的一条:

我的表单验证规则:(我也有电子邮件验证,但这里无关紧要)

'name' => array(
    'checkEmail' => array(
      'rule' => 'hasEmail',
      'message' => 'You must fill in the name field',
      'last' => true
    )
)

我的自定义规则代码:

function hasEmail($data){
  $name = array_values($data);
  $name = $name[0]; 
  if(strlen($name) == 0){
    return empty($this->data['Friend']['email']);
  }
  return true;
}

我需要做到这一点,以便其中一对应该至少填写。只要索引对应,它就可以是任何一个。

我无法想办法,好像我将表单规则设置为必需或者allowEmpty为false,它在所有空字段上都失败了。如何检查是否存在1对,如果存在,继续?

另外,我需要删除所有剩余的空[Friend]字段,因此我的saveAll()不会保存一大堆空行,但我想我可以使用控制器中的extract处理该部分。主要问题是这种验证。感谢。

1 个答案:

答案 0 :(得分:1)

我会看一下Model::beforeValidate回调(API)。

使用此回调输出调试信息可帮助您确定每次调用时触发的次数以及模型可用的数据。

使用此信息,您可以在找到第一个匹配对时创建一个标志,并篡改Model :: validates数组或Model :: data数组以绕过后续验证尝试。

至于您的上一点,您可以使用Set::filter轻松删除数据集中的空白字段。