2012-12-08 54 views
1

我有一个表单上有几个子表单。我有一个isValid方法的形式,我检查是否只有一个特定的子窗体是有效的。例如,我必须检查subform2是否正确验证。如果子窗体验证通过,则应该成功验证整个窗体,即使其他子窗体的值不正确。他们不应该被验证。我试过这样的:zend框架子窗体isValidPartial?

if($subform->isValidPartial($_POST)) 
    return true; 
}else{ 
    return false; 
} 

但没有成功。这段代码总是返回true。当整个表格在没有覆盖isValid的情况下被正常验证时,子表格被正确验证,但是所有的验证都是有效的。

回答

0

isSubFormValid将返回true,如果至少有一个子窗体有效。您可以指定子表单名称或通过null

class My_Form extends Zend_Form 
{ 
    public function isSubFormValid($name = null, array $data = null) 
    { 
     if (is_null($name)) { 
      $subForms = $this->getSubForms(); 
     } else { 
      $subForms = array($this->getSubForm($name)); 
     } 

     foreach ($subForms as $subForm) { 
      if ($subForm->isValid($data)) { 
       return true; 
      } 
     }  

     return false; 
    }  
} 

用例:

class Example extends My_Form 
{ 
    public function init() 
    { 
     $subForm1 = new Zend_Form_SubForm(); 
     $subForm1->addElement($this 
      ->createElement('text', 'name') 
      ->setRequired(true)); 

     $subForm2 = new Zend_Form_SubForm(); 
     $subForm2->addElement($this 
      ->createElement('text', 'name') 
      ->setRequired(true)); 

     $this->addSubForm($subForm1, 'form1'); 
     $this->addSubForm($subForm2, 'form2'); 

     $this->addElement($this->createElement('submit', 'send')); 
    }  
} 

/* ... */ 
public function indexAction() 
{ 
    $form = new Example(); 

    if ($this->_request->isPost()) { 
     if ($form->isSubFormValid(null, $this->_request->getPost())) { 
      die('is valid'); 
     } 
    } 

    $this->view->form = $form; 
} 

/* ... */ 
+0

十分感谢。它会像树形结构一样工作吗?例如主窗体(array(subform1(array(subform3,subform4)),subform2(array(subform5,subform6))))? – masteryoda