2015-08-12 4 views
10

Ich habe ein Unterformular ($ fileUploadSubform) in einem Unterformular ($ requestSubform). Ich habe setElementsBelongTo ("requestRow [$ rowNumber]") für das übergeordnete Teilformular ($ requestSubform) aufgerufen.Zend setElementsBelongTo() -Effekt auf Unterformular-Elemente

$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 

Wenn das Formular gerendert wird, $ fileUploadSubform filedesc Element‘name und id sind als

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

folgt Warum wird der Wert I in der setElementsBelongTo eingestellt haben() Funktion zweimal wiederholt wird?

Vielen Dank im Voraus!

[Update 2015.08.13]

als eine vorübergehende Lösung, ich habe gerade setElementsBelongTo() von dem Kind Unterformular ($ fileUploadSubform) anstelle des Mutterformulars ($ requestSubform) genannt

[Update 2015.08.17]

ich habe den folgenden Code habe ich versucht, aus http://zend-framework-community.634137.n4.nabble.com/Improved-array-support-for-Zend-Form-td667215.html bekam, wie es in diesem Post sagt, dass elementsTobelong Unterformular richtig funktioniert.

$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()); 

Aber hier ist, was ich für die Elemente $ subForms und $ subFubForm bekomme.

<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]"> 

[Update 2015.08.24]

ich endlich herausgefunden, das Problem.

Es war diese Linie

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

Es zeigt einige Elemente nicht waren, bevor das ist, warum ich diese Zeile hinzugefügt. Und nur jetzt verstehe ich, dass jene Elemente, die nicht angezeigt wurden, ohne ViewHelper Decorator Set sind. Also, wenn ich den ViewHelper als Dekorator eingestellt habe und die obigen Felder entfernt habe und setElementsBelongTo() des Unterformulars aufgerufen habe, ohne vom Wurzelverzeichnis der Hierarchie nur von diesem Unterformular zu haben, dann hat es funktioniert.

+0

Also, was ist die Frage? Hast du gelöst oder nicht? Was ist seine Wunschausgabe? – Stanimir

+0

Anstelle von "requestRow [1] [requestRow] [1] [fileUpload] [fileDesc]" als Name des Elements sollte es "requestRow [1] [fileUpload] [fileDesc]" sein. – artsylar

+1

Ich kann das nicht reproduzieren. Was ist die genaue Version von ZF, die Sie verwenden? Wenn es später als 1.12.9 ist, können Sie den vollständigen Code einschließlich des Hauptformulars (Eltern) bereitstellen? – darkangel

Antwort

4

Ich bin nicht mit der vertraut, aber aus der Optik davon ist die Formularhierarchie implizit. Damit meine ich, dass Sie nicht den vollen "Pfad" angeben müssen, wenn Sie setElementsBelongTo() verwenden. Stellen Sie sich das wie eine Ordnerstruktur vor, Sie würden nur den Unterordner im aktuellen Arbeitsverzeichnis benennen.So

, wenn Sie erklären:

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

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

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

Dies wird interpretiert als email in bar und bar in foo setzen, auch bekannt als:

name="foo[bar][email]" 

Die Dokumentation sagt:

setElementsBelongTo (Linie 1367)
Set Name der Array-Elemente gehören zu
Zugang: public
Zend_Form setElementsBelongTo (string $ array)
string $ Array

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

auch:

Zend_Form :: setElementsBelongTo ($ array)
Mit dieser Methode können Sie den Namen eines Arrays angeben, zu dem alle Elemente des Formulars gehören. Sie können den Namen mit dem getElementsBelongTo() Accessor bestimmen.

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

Die Formulierung könnte ein wenig unklar, aber es könnte meine Theorie unterstützen. Wenn also $form->setElementsBelongTo('foo') verwendet wird, wird alles, was zu $form hinzugefügt wird, implizit zu einem Element von foo und daher muss foo aus nachfolgenden setElementsBelongTo() Aufrufen weggelassen werden, die sich mit Unterelementen befassen.

+0

Danke @spenibus! Du hast Recht mit deiner Antwort.Eigentlich habe ich auch diese Art der Benennung der Elemente versucht, aber es hat nicht funktioniert, weil $ this-> view-> field = $ subform -> __ toString(); Ich habe es vorher hinzugefügt, weil einige Elemente nicht ohne diese Zeile angezeigt werden. Und erst jetzt merke ich, dass diese Elemente ihren ViewHelper-Dekorator nicht gesetzt haben. Als ich diese Zeile hinzugefügt habe, zeigen die Elemente aber Probleme mit ihren Namen. – artsylar