2012-06-30 87 views
2

'm試圖在表單中使用setBelongsTo,但Zend不驗證這些值,也沒有驗證該字段的setDefaults。已經搜索谷歌,什麼都沒找到。任何想法?Zend:setBelongsTo no working right

表:

$this->setName('form_tecnicos') 
     ->setAttrib('onSubmit',"return validarForm()"); 



    $elementos['nome'] = new Zend_Form_Element_Text('nome'); 
    $elementos['nome']->setLabel('Nome') 
     ->setRequired(true) 
     ->setAttrib('maxlength','150'); 


     $elementos['telefone0'] = new Zend_Form_Element_Text('0'); 
     $elementos['telefone0']->setLabel('Telefones') 
      ->setRequired(true) 
      ->setAttribs(array('mascara'=>'tel','maxlength'=>14)) 
      ->setBelongsTo('telefones'); 

     $elementos['telefone1'] = new Zend_Form_Element_Text('1'); 
     $elementos['telefone1']->setLabel('Telefones') 
      ->setRequired(true) 
      ->setAttribs(array('mascara'=>'tel','maxlength'=>14)) 
      ->setBelongsTo('telefones'); 

$elementos['submit'] = new Zend_Form_Element_Submit('Entrar'); 
     $elementos['submit']->setLabel('Entrar'); 

    $this->addElements($elementos); 

    $filters = array('StringTrim'); 
    $this->setElementFilters($filters); 

    $this->setElementDecorators(array(
      'viewHelper', 
      'Errors', 
      array(array('data'=>'HtmlTag'), array('tag' => 'dd')), 
      array('Label',array('tag'=>'dt')), 
      array(array('row'=>'HtmlTag'),array('tag'=>'div','class'=>'grid_2')) 
    )); 


    $remover_label = array('submit'); 

    foreach($remover_label as $elementos) 
     $this->$elementos->removeDecorator('label'); 

控制器

$form = new Application_Form_Tecnicos(); 
    $this->view->form = $form; 

    if($this->getRequest()->isPost()): 
     $dados = $this->getRequest()->getPost(); 

     if($form->isValid($dados)): 
      // 
     else:     
      $form->setDefaults($dados); 
     endif; 
    endif; 

的print_r($ dados)

Array ([nome] => [telefones] => Array ([0] => (11) 1111-111) [Entrar] => Entrar) 

我被困在它上面

+0

我在Zend Framework 1中對錶單的體驗使我相信它們從根本上被打破了,特別是在處理子表單時。 – GordonM

+0

中斷或可能更好措辭:有限。第一個逆向工程師,然後使用我可以建議。 – hakre

+0

我想我是唯一喜歡ZF1表格的人。他們有他們的怪癖,但他們是強大的,並使它很容易創建一致的形式,而不必重複加載標記。雖然我同意子表單存在一些問題,但我知道使用setBelongsTo的唯一理由是如果您需要從舊應用程序維護標記。 –

回答

2

你有兩個問題實際上與setBelongsTo無關。如果你只是想簡單的答案,你的表單代碼的相關部分改變這裏面工作:

$elementos['nome'] = new Zend_Form_Element_Text('nome'); 
$elementos['nome']->setLabel('Nome') 
    ->setRequired(true) 
    ->setAttrib('maxlength','150'); 

$elementos['telefone0'] = new Zend_Form_Element_Text('telefone0'); 
$elementos['telefone0']->setLabel('Telefones') 
    ->setRequired(true) 
    ->setAttribs(array('mascara'=>'tel','maxlength'=>14)) 
    ->setBelongsTo('telefones'); 

$elementos['telefone1'] = new Zend_Form_Element_Text('telefone1'); 
$elementos['telefone1']->setLabel('Telefones') 
    ->setRequired(true) 
    ->setAttribs(array('mascara'=>'tel','maxlength'=>14)) 
    ->setBelongsTo('telefones'); 

這裏的更詳細的解釋:

有兩種方法可以添加表單元素Zend的表目的。您可以實例化相關的表單元素,並添加到窗體:

$form->addElement(new Zend_Form_Element_Text('name')); 

,或者您可以撥打的addElement有關PARAMS並得到它來創建對象爲您提供:

$form->addElement('text', 'name'); 

如果您使用第一種方法,它從對象中獲取元素名稱。如果您使用第二個參數,則您將名稱作爲第二個參數傳遞。該名稱是Zend_Form內部用來存儲元素的名稱,也是它如何知道哪些提交的數據與哪個元素相關。

當您使用addElements()一次性添加元素時,它將使用數組鍵(如果是非數字)作爲名稱。所以,你的第一個問題是這樣的:

$elementos['telefone0'] = new Zend_Form_Element_Text('0'); 

商店名稱作爲telefone0,但實際的表單元素使用的名稱0。所以當表單提交時,它總是無法驗證,因爲Zend_Form期望數據在$_POST['telefone0']

你的第二個問題要簡單得多。表單元素名稱需要以PHP變量的形式工作,因此您不能使用數字名稱(例如電話字段中的0和1)。

在上面的工作代碼中,所有需要的是更改兩個電話元素的名稱以匹配$elemntos中的鍵,該鍵修復了這兩個問題。