验证表单但不验证子表单

时间:2014-01-04 06:29:32

标签: php zend-framework zend-form zend-validate zend-form-sub-form

我有一个Zend_Form,只有在某些情况下才需要子表单。父表单和子表单都有必填字段。子表单并不总是被填充,但是当填充任何元素时,它们都应该被填充。

<?php
class Cred extends Zend_Form
{

  public function init()
  {
    $title = new Zend_Form_Element_Text('Title');
    $title->setLabel('Title')
        ->setRequired(TRUE);
    $this->addElement($title);

    $award = new Zend_Form_Element_Text('Awarded');
    $award->setLabel('Awarded On')
        ->setRequired(TRUE)
        ->addValidator('date');
    $this->addElement($award);

    $subform = new Zend_Form_SubForm();

    $proof = new Zend_Form_Element_File('Documentation');
    $proof->setLabel('Documentation')
        ->setRequired(TRUE)
        ->addValidator('Size', false, 409600) // limit to 400K
        ->addValidator('Extension', false, 'pdf');
    $subform->addElement($proof);

    $lang = new Zend_Form_Element_Select('Language');
    $lang->setLabel('Language')->setRequired(TRUE);
    $subform->addElement($lang);

    $this->addSubForm($subform,'importForm');

    $submit = new  Zend_Form_Element_Submit('submitForm');
    $submit->setLabel('Save');
    $this->addElement($submit);


    $this->setAction('/cred/save')
        ->setMethod('post')
        ->setEnctype(Zend_Form::ENCTYPE_MULTIPART);
  }

}

当我调用$form->isValid($_POST)时,它会验证父表单和子表单,并在子表单的必需元素为空时返回错误,即使不需要子表单本身也是如此。

除了重载isValid()函数之外,有没有办法只验证父表单?

1 个答案:

答案 0 :(得分:0)

如果查看源代码isValid() method of Zend_Form,您会发现没有明确的机制阻止在子表单上执行验证器(第2273行)。

无论如何,如果我理解你的要求“子表格并不总是被填充,但是当它的任何元素被填满时,它们都应该被填充。”正确然后我认为你的问题确实存在不一定与子表单本身有关,而是与条件验证有关。使用自定义验证器可以很容易地解决这个问题:How to validate either Zend_Form_Element_File or Zend_Form_Element_Text are not empty.

请记住,$context中的元素只包含子表单元素。