2010-09-08 8 views
17

Ich möchte in der Lage sein, ein verstecktes Formularfeld mit Array-Notation zu meinem Formular hinzuzufügen. Ich kann dies wie folgt mit HTML tun:Zend Framework: Arbeiten mit Form-Elementen in Array-Notation

<input type="hidden" name="contacts[]" value="123" /> 
<input type="hidden" name="contacts[]" value="456" /> 

Wenn das Formular abgeschickt wird, die $_POST Array wird die verborgenen Elementwerte gruppiert als Array enthalten:

array(
    'contacts' => array(
     0 => '123' 
     1 => '456' 
    ) 
) 

Ich kann ein verstecktes Element hinzufügen meine Form und Array-Notation wie folgt angeben:

$form->addElement('hidden', 'contacts', array('isArray' => true)); 

Nun, wenn ich dieses Element mit einer Reihe bevölkern, erwarte ich, dass sie die Werte als Array gespeichert werden sollte, und machen die Elemente wie der HTML-Code oben:

$form->populate($_POST); 

Dies funktioniert jedoch nicht. Es könnte einen Fehler in der Version von Zend Framework geben, die ich benutze. Mache ich das richtig? Was soll ich anders machen? Wie kann ich das obige Ergebnis erreichen? Ich bin bereit, ein benutzerdefiniertes Formularelement zu erstellen, wenn ich muss. Sag mir einfach, was ich tun muss.

Antwort

15

Array-Notation zu verwenden, benötigen Sie, dass das Element angeben „gehört“ Eltern-Array:

$form->addElement('hidden', 'contact123', array('belongsTo' => 'contacts', 'value' => '123')); 
$form->addElement('hidden', 'contact456', array('belongsTo' => 'contacts', 'value' => '456')); 
+1

dies erzeugt , wenn Sie jedoch Kontakte [123] und Nummer [123] brauchen, wird dies nicht funktionieren – max4ever

+0

Ich habe ein Array variabler Länge, das zu meinen Zend-Paginierungssteuerelementen hinzugefügt werden musste. Ich habe folgendes getan: '$ this-> formHidden ($ key." [". $ K." "]", $ V, Array ('gehört zu' => $ key)); ' – thepriebe

17

Sie müssen Teilformulare verwenden, um das gesuchte Ergebnis zu erhalten. Die Dokumentation war eine ziemliche Fahrt aber man kann es here

finden Verwendung, was ich dort fand ich die folgende forml

<?php 

class Form_Test extends Zend_Form { 

    public function init() { 
     $this->setMethod('post'); 
     $this->setIsArray(true); 

     $this->setSubFormDecorators(array(
      'FormElements', 
      'Fieldset' 
     )); 

     $subForm = new Zend_Form(array('disableLoadDefaultDecorators' => true)); 

     $subForm->setDecorators(array(
      'FormElements', 
     )); 

     $subForm->addElement('hidden', 'contacts', array(
      'isArray' => true, 
      'value' => '237', 
      'decorators' => Array(
       'ViewHelper', 
      ), 
     )); 

     $subForm2 = new Zend_Form(array('disableLoadDefaultDecorators' => true)); 

     $subForm2->setDecorators(array(
      'FormElements', 
     )); 

     $subForm2->addElement('hidden', 'contacts', array(
      'isArray' => true, 
      'value' => '456', 'decorators' => Array(
       'ViewHelper', 
      ), 
     )); 

     $this->addSubForm($subForm, 'subform'); 
     $this->addSubForm($subForm2, 'subform2'); 


     $submit = new Zend_Form_Element_Submit('submit'); 
     $submit->setValue('Submit'); 

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

} 

Wich gibt diesen HTML aufgebaut:

<form enctype="application/x-www-form-urlencoded" method="post" action=""><dl class="zend_form"> 
<input type="hidden" name="contacts[]" value="237" id="contacts"> 

<input type="hidden" name="contacts[]" value="456" id="contacts"> 

<dt id="submit-label">&nbsp;</dt><dd id="submit-element"> 

<input type="submit" name="submit" id="submit" value="submit"></dd></dl></form> 

Und wenn die Post submited sieht so aus:

array(2) { 
    ["contacts"] => array(2) { 
    [0] => string(3) "237" 
    [1] => string(3) "456" 
    } 
    ["submit"] => string(6) "submit" 
} 

So ist, wie Sie schaffen können Die Art von Formen, die Sie suchen. Hoffe das hilft! Wenn Sie eine Frage haben, schreiben Sie einen Kommentar!

Es ist ziemlich hackish, wenn Sie mich fragen. Du erstellst grundsätzlich Unterformulare, deaktivierst dort aber Form-Dekoratoren, so dass nur das Element ausgegeben wird. Da die identischen contacts [] Elemente in anderer Form sind, überschreibt das Objekt zend sie nicht und es funktioniert. Aber ja ..

Edit: änderte es ein wenig, um Etiketten und Müll um die versteckten Eingänge zu entfernen.

+1

+1 Ihnen für die Antwort. ;-) Aber -1 zu ZF dafür. Unterformulare, nur um diese versteckten Felder in Array-Notation zu erstellen? Pfui. Besser wäre ein Konfigurationsschlüssel, den Sie auf das Element setzen könnten, das all diese Subform-Wahnsinn für Sie initiieren würde. Schätze, wir könnten ein benutzerdefiniertes Element implementieren, das dies tut. –

+1

@DavidW Ja, ich benutze immer Viewhelper oder rolle einfach meine eigenen Formulare aus. So ein Schmerz, mit Dekorateuren zu arbeiten und die zend_form zu nutzen. Aber ZF 2.0 hat viel bessere Formen, denke ich (hoffe!). Thansk für die Verbesserung. – Iznogood

8

Dies scheint in der Tat um einen Fehler in Zend Framework zu sein - der Wert Attribut für ein Element richtig set to array, aber es wird ignoriert, wenn das Element rendert - es verwendet einfach $this->view->escape($value), um das HTML des Elements auszugeben. Ich habe dieses Problem gelöst durch einen benutzerdefinierten Helfer für solche Elemente der Umsetzung:

class My_View_Helper_HiddenArray extends Zend_View_Helper_FormHidden 
{ 
    public function hiddenArray($name, $value = null, array $attribs = null) 
    { 
     if (is_array($value)) { 
      $elementXHTML = ''; 
      // do not give element an id due to the possibility of multiple values 
      if (isset($attribs) && is_array($attribs) && array_key_exists('id', $attribs)) { 
       unset($attribs['id']); 
      } 

      foreach ($value as $item) { 
       $elementXHTML .= $this->_hidden($name, $item, $attribs); 
      } 
      return $elementXHTML; 

     } else { 
      return $this->formHidden($name, $value, $attribs); 
     } 
    } 
} 

der, wenn die nächste Weise verwendet:

$contacts = $form->createElement('hidden', 'contacts') 
->setIsArray(true) 
->setDecorators(array(
    array('ViewHelper', array('helper' => 'HiddenArray')), 
)); 
$form->addElement($contacts); 

erzeugt die benötigte Ausgabe.

Der Grund, Zend_View_Helper_FormHidden hier zu erweitern, ist nur, das Standardverhalten aufrufen zu können, wenn kein Array-Wert eingestellt ist (return parent::formHidden($name, $value, $attribs)).

hoffe, das hilft jemand :)

+1

Ja, ich bevorzuge diese Antwort:). Die Kerndateien von Zend Framework zu erweitern war immer ein Spaß für mich. –