我有一个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()
函数之外,有没有办法只验证父表单?
答案 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
中的元素只包含子表单元素。