动态更改验证规则

时间:2011-10-23 23:42:01

标签: php cakephp cakephp-1.3

我正在处理包含用户数据的表单,特别是电话号码字段。通常不需要电话号码,因此模型中唯一的验证规则是usphone规则。但是,如果用户提交此表单,则需要电话号码。我以为我可以简单地添加一个validate规则,设置模型并调用validates方法,但是我做错了或者它没有按照我预期的方式工作

在我的控制器中:

# Update a few validation rules that are specific to this context
$this->Proposal->Requestor->validate['phone_number']['notempty'] = array(
  'rule'       => 'notEmpty',
  'message'    => 'Please enter a phone number so can can contact you with any questions about the work.',
  'allowEmpty' => false,
  'required'   => true,
);

$validationErrors = array();
$this->Proposal->Requestor->set( $this->data['Requestor'] ); # $this->data['Requestor']['phone_number'] only (no other requestor data)
if( !$this->Proposal->Requestor->validates( array( 'fieldList' => array( 'phone_number' ) ) ) ) {
  $validationErrors['Requestor'] = $this->Proposal->Requestor->validationErrors;
}

即使我将电话号码字段留空,也不会报告任何错误。在这种情况下,我向用户请求的唯一信息是他们的电话号码,因此Requestor数据的其余部分为空,但我尝试合并其余的用户数据,我得到了同样的结果。如果我删除fieldList选项,我会在其他字段上收到错误,但空电话号码仍然没有。

知道我在这里缺少什么吗?我几个小时以来一直在讨论这个问题,而我却找不到正确的答案。

感谢。

2 个答案:

答案 0 :(得分:2)

最终解决方案是双重的:

  1. 我在phone_number字段上有现有规则,强制该值为美国电话号码。该规则还将allowEmpty设置为true,将required设置为false。我想捕捉一个空值,这样我就可以显示一条特别准确的信息。
  2. 我必须更新现有规则以翻转allowEmptyrequired值,并添加一条新规则,其last值设置为true
  3. 我的控制器操作中添加的最终更改如下所示:

    $this->Proposal->Requestor->validate = Set::merge(
      $this->Proposal->Requestor->validate,
      array(
        'phone_number' => array(
          'notempty' => array(
            'rule'       => 'notEmpty',
            'message'    => 'Please enter a phone number so can can contact you with any questions about the work.',
            'allowEmpty' => false,
            'required'   => true,
            'last'       => true,
          ),
          'usphone' => array(
            'allowEmpty' => false,
            'required'   => true,
          ),
        )
      )
    );
    

    我不记得我是否已经确认,鉴于新规则的usphone值,对现有last规则的更改是完全必要的,但此组合工作正常。

答案 1 :(得分:1)