Php 动态更改验证规则

Php 动态更改验证规则,php,cakephp,cakephp-1.3,Php,Cakephp,Cakephp 1.3,我正在开发一个包含用户数据的表单,特别是一个电话号码字段。通常不需要电话号码,因此模型中唯一的验证规则是usphone规则。但是,如果用户提交此表单,则需要提供电话号码。我想我可以在运行中简单地添加一个validate规则,设置模型并调用validates方法,但要么我做得不对,要么它没有按我预期的方式工作 在我的控制器中: # Update a few validation rules that are specific to this context $this->Proposal-&

我正在开发一个包含用户数据的表单,特别是一个电话号码字段。通常不需要电话号码,因此模型中唯一的验证规则是
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;
}
即使我将电话号码字段留空,也不会报告任何错误。在这种情况下,我向用户请求的唯一信息是他们的电话号码,因此
请求者
数据的其余部分为空,但我尝试合并其余的用户数据,得到了相同的结果。如果我删除
字段列表
选项,我会在另一个字段中得到一个错误,但空电话号码上仍然没有任何错误

你知道我错过了什么吗?我已经胡闹了几个小时了,只是还没有找到正确的答案


谢谢。

您可以尝试使用多变量行为-

解决方案有两个方面:

  • 我在
    phone\u number
    字段中有一条现有规则,该规则强制将值设置为美国电话号码。该规则还将
    allowEmpty
    设置为
    true
    required
    设置为
    false
    。我想捕捉一个空值,以便显示一条特别精确的消息
  • 我必须更新现有规则,以翻转
    allowEmpty
    required
    值,并添加一个新规则,将其
    最后一个
    值设置为
    true
  • 在我的控制器操作中添加的最后一项更改如下所示:

    $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,
          ),
        )
      )
    );
    
    考虑到新规则的
    last
    值,我不记得我是否验证了对现有
    usphone
    规则的更改是严格必要的,但这种组合工作正常