验证与Zend框架多个可选表单域(Validating multiple optional form

2019-09-16 13:25发布

我试图验证Zend_Form的有哪几种可选字段,我希望他们中至少一个被填充。对我来说,我有手机,家庭和办公室的电话号码,我想提供它们中的至少一个。

我试图做到这一点,虽然校验上下文(如建议在这里通过创建延伸Zend_Validate_Abstract来定制的验证)。 问题是,如果所有可选字段都是空的,他们是从形式$语境缺失(传递给验证器类),并通过这种方式不进行验证的。 所以,如果您填写的三个选项(移动,家庭,工作),他们都将被验证的一项或若干项(这是好的,但对于这个不需要自定义验证),但如果你填写他们没有,有没有选项强制客户满山遍野的至少一个(这是我的目标)。

以下是我有:

1.我的表格

<?php

class Application_Form_Application extends Zend_Form {

  public function init() {
    $this->setName('application');

    // attach sub forms to main form
    $this->addSubForms(array(
      'application' => $this->application(),
      ...
    ));
  }

  private function application() {
    $application = new Zend_Form_SubForm();
    // custom phone validation
    $phone_validation = array('phone_mobile' => 'Mobile', 'phone_home' => 'Home', 'phone_work' => 'Work');
    // phone mobile
    $app['phone_mobile'] = new Zend_Form_Element_Text('phone_mobile');
    $app['phone_mobile']->setLabel('Mobile')
                        ->addFilter('StripTags')
                        ->addFilter('StringTrim')
                        ->addValidator('Regex', false, array('/^[0-9]{8}$/i'))
                        ->addValidator(new Application_Form_PhoneMobileHomeWork($phone_validation), false);
    // phone home
    $app['phone_home'] = new Zend_Form_Element_Text('phone_home');
    $app['phone_home']->setLabel('Home')
                      ->addFilter('StripTags')
                      ->addFilter('StringTrim')
                      ->addValidator('Regex', false, array('/^[0-9]{8}$/i'))
                      ->addValidator(new Application_Form_PhoneMobileHomeWork($phone_validation), false);
    // phone work
    $app['phone_work'] = new Zend_Form_Element_Text('phone_work');
    $app['phone_work']->setLabel('Work')
                      ->addFilter('StripTags')
                      ->addFilter('StringTrim')
                      ->addValidator('Regex', false, array('/^[0-9]{8}$/i'))
                      ->addValidator(new Application_Form_PhoneMobileHomeWork($phone_validation), false);
    $application->AddElements($app);
  }

}
?>

2.自定义的验证

<?php

class Application_Form_PhoneMobileHomeWork extends Zend_Validate_Abstract {

  const NOT_PRESENT = 'notPresent';

  protected $_messageTemplates = array(
    self::NOT_PRESENT => 'At least one contact phone shall be provided!'
  );

  protected $_listOfFields;

  public function __construct(array $listOfFields) {
    $this->_listOfFields = $listOfFields;
    var_dump($listOfFields);exit;
  }

  public function isValid($value, $context = null) {
    var_dump($context);exit;
    ...
  }
?>

验证总是通过,虽然第一转储($ listOfFields),但如果我删除它,isValid()的永远不会被调用,除非一些数据被输入到一些手机领域(我们要防止)的。

当我进一步检查我发现了一个解决方案,通过传递空字段到$上下文参数扩展Zend_Validate的类,但我想有一个更好的解决方案,如果有人知道任何。

总之结论是 - 如何验证某些形式,迫使用户填写至少一个出几个可选字段?

Answer 1:

如果我理解你的权利,你想不要求你的表单元素,但阻止他们是空的(除非他们中的一个不为空),使用自定义的验证? 于是,为了不跳过验证链,需要防止它们是空的调用方法setAllowEmpty(false)中的每个元素。

最后,在你的自定义验证器,你将有这样的事情:

foreach ($this->_listOfFields as $field) {
    if (isset($context[$field]) AND $context[$field])
    {
        return true;
    }
}

此外,请确保您的元素不需要( setRequired(false) )。



Answer 2:

问题是,如果有任何字段被填满时,multi_checkbox元素并不形式存在,那么就不会进行验证。

一个解决方案是后续:使用一个隐藏的选项始终检查和验证,这始终选中此更多的人之一。



文章来源: Validating multiple optional form fields with Zend Framework