2015-08-12 30 views
10

Ho una sottomaschera ($ fileUploadSubform) all'interno di una sottomaschera ($ requestSubform). Ho chiamato setElementsBelongTo ("requestRow [$ rowNumber]") sulla sottomascheta madre ($ requestSubform).Effetto Zend setElementsBelongTo() sugli elementi della sottomaschera

$requestSubform= new Zend_Form_Subform(); 
    $requestSubform->setElementsBelongTo("requestRow[$rowNumber]"); 

    // add elements to $requestSubform 

    // now create the file upload subform 
    $fileUploadSubform= new Zend_Form_SubForm(); 
    $fileUploadSubform->addElement('file', 'fileName') 
      ->setLabel('File'); 

    $fileUploadSubform->addElement('text', 'fileDesc') 
      ->setLabel('File Description'); 

    $requestSubform->addSubForm($fileUploadSubform, 'fileUpload'); 

    $this->view->field = $requestSubform->__toString(); 

    // pass it as json via ajax back to javascript 

Quando il form viene reso, $ fileUploadSubform fileDesc elemento name' e id sono i seguenti

name="requestRow[1][requestRow][1][fileUpload][fileDesc]" 
id="requestRow-1-fileUpload-fileDesc" 

Perché il valore che ho impostato nel setElementsBelongTo() la funzione viene ripetuto due volte?

Grazie in anticipo!

[Aggiornamento 2015/08/13]

Come soluzione temporanea, ho appena chiamato setElementsBelongTo() dal subform bambino ($ fileUploadSubform) invece della sottomaschera genitore ($ requestSubform)

[Aggiornamento 2015/08/17]

ho provato il seguente codice che ho ricevuto da http://zend-framework-community.634137.n4.nabble.com/Improved-array-support-for-Zend-Form-td667215.html come si dice in quel post che subform elementsTobelong per il corretto funzionamento.

$form = new Zend_Form(); 
    $form->setElementsBelongTo('foobar'); 

    $form->addElement('text', 'firstName') 
    ->getElement('firstName') 
    ->setLabel('First Name') 
    ->setRequired(true); 

    $form->addElement('text', 'lastName') 
    ->getElement('lastName') 
    ->setLabel('Last Name') 
    ->setRequired(true); 

    $subForm = new Zend_Form_SubForm(); 
    $subForm->setElementsBelongTo('foobar[baz]'); 
    $subForm->addElement('text', 'email') 
    ->getElement('email') 
    ->setLabel('Email Address'); 

    $subSubForm = new Zend_Form_SubForm(); 
    $subSubForm->setElementsBelongTo('foobar[baz][bat]'); 
    $subSubForm->addElement('checkbox', 'home') 
    ->getElement('home') 
    ->setLabel('Home address?'); 
    $subForm->addSubForm($subSubForm, 'subSub'); 

    $form->addSubForm($subForm, 'sub') 
    ->addElement('submit', 'save', array('value' => 'submit')); 
    print_r($form->__toString()); 

Ma ecco quello che sto ottenendo per gli elementi $ subForm e $ subFubForm.

<input id="foobar-foobar-baz-email" type="text" value="" name="foobar[foobar][foobar][baz][email]"> 

<input id="foobar-foobar-baz-foobar-baz-bat-home" type="checkbox" value="1" name="foobar[foobar][foobar][baz][foobar][foobar][baz][foobar][baz][bat][home]"> 

[Aggiornamento 2015/08/24]

ho finalmente capito il problema.

E 'stata questa la linea

$this->view->field = $additionalInfoSubform->__toString(); 

C'erano alcuni elementi che non mostrano prima è per questo che ho aggiunto quella linea. E solo ora capisco che quegli elementi che non sono stati mostrati sono quelli senza il decoratore ViewHelper. Quindi, quando ho impostato ViewHelper come decoratore e rimosso i campi precedenti e ho chiamato setElementsBelongTo() della sottomaschera senza dover dalla radice della gerarchia solo da quella sottomaschera, allora ha funzionato.

+0

Quindi, qual è la domanda? Hai risolto o no? Che cosa desidera l'output? – Stanimir

+0

Invece di "requestRow [1] [requestRow] [1] [fileUpload] [fileDesc]" come nome dell'elemento, dovrebbe essere "requestRow [1] [fileUpload] [fileDesc]". – artsylar

+1

Non riesco a riprodurre questo. Qual è la versione esatta di ZF che stai utilizzando? Se è successiva alla 1.12.9, puoi fornire il codice completo, incluso il modulo principale (principale)? – darkangel

risposta

4

Non conosco loma, a giudicare dall'aspetto, la gerarchia del modulo è implicita. Con ciò intendo che non è necessario dichiarare il "percorso" completo quando si utilizza setElementsBelongTo(). Pensa ad esso come una struttura di cartelle, chiameresti solo la sottocartella all'interno della directory di lavoro corrente.

Quindi, quando si dichiara:

$form = new Zend_Form(); 
$form->setElementsBelongTo('foo'); 

$subForm = new Zend_Form_SubForm(); 
$subForm->setElementsBelongTo('bar'); 
$subForm->addElement('text', 'email') 

$form->addSubForm($subForm, 'sub'); 

Questo viene interpretato come mettere email in bar e bar in foo, aka:

name="foo[bar][email]" 

La documentazione dice:

setElementsBelongTo (linea 1367)
Set nome di elementi di matrice appartengono a
accesso: pubblico
Zend_Form setElementsBelongTo (string $ array)
stringa $ array

Da http://framework.zend.com/apidoc/1.9/Zend_Form/Zend_Form.html#setElementsBelongTo

anche:

Zend_Form :: setElementsBelongTo ($ array)
Utilizzando questo metodo, è possibile specificare il nome di un array a cui appartengono tutti gli elementi del modulo. È possibile determinare il nome utilizzando l'accessorio getElementsBelongTo().

Da http://framework.zend.com/manual/1.12/en/zend.form.advanced.html

La formulazione potrebbe essere un po 'poco chiaro, ma potrebbe sostenere la mia teoria. Pertanto, quando si utilizza $form->setElementsBelongTo('foo'), qualsiasi elemento aggiunto a $form diventerà implicitamente un elemento di foo e pertanto foo deve essere escluso dalle successive chiamate setElementsBelongTo() che gestiscono i sottoelementi.

+0

Grazie @spenibus! Hai ragione con la tua risposta.In realtà, ho anche provato questo modo di nominare gli elementi ma non ha funzionato a causa di questo $ this-> view-> field = $ subform -> __ toString(); L'ho aggiunto prima perché ci sono alcuni elementi che non appaiono senza quella linea. E solo ora mi rendo conto che quegli elementi non avevano il loro decoratore ViewHelper. Quindi, quando ho aggiunto quella linea, gli elementi stanno mostrando ma stanno avendo problemi con i loro nomi. – artsylar

Problemi correlati