2011-02-07 3 views
8

in HTML normale, potremmo avere un campo di matrice come person[]array input come name = "persona []" in forma Zend

<input name="person[]" type="text" /> 
<input name="person[]" type="text" /> 
<input name="person[]" type="text" /> 

Per quanto ne so, non ha Zend_Form questo. Ho letto another answer che ha suggerito che potrebbe essere fatto utilizzando un decoratore che aggiungerebbe il [] nel posto giusto. Questo è il codice per quella specifica domanda

$html = ''; // some code html 
$i = 0; 
foreach ($element->getMultiOptions() as $value => $label){ 
    $html .= '<input type="checkbox" ' 
      .   'name="'.$element->getName().'[]" ' 
      .   'id="'$element->getName()'-'.$i.'" ' 
      .   'value="'.$value.'" />'; 
    $i++; 
} 
return $html; 

Questo appare come un buon inizio, ma mi chiedo se si utilizza un decoratore è sufficiente. I valori restituiti devono essere letti correttamente e consegnati al server, quindi convalidati sul lato server. Quindi un decoratore ha un'idea sbagliata? Un elemento personalizzato avrebbe più senso qui? Non ho visto un buon esempio che mostra come ciò possa essere fatto.

+0

Controllare il manuale: http://framework.zend.com/manual/en/zend.form.advanced.html –

risposta

13

Penso che ZF non consenta la creazione di campi di testo di input individuali denominati person[], sebbene sia possibile farlo per l'intero modulo o una sottomaschera. Tuttavia, consente qualcosa di simile. In particolare, è possibile creare campi chiamati person[0], person[1], ecc

Per fare questo, si potrebbe procedere come segue:

$in1 = $this->createElement('text', '0'); 
$in2 = $this->createElement('text', '1'); 
$in1->setBelongsTo('person'); 
$in2->setBelongsTo('person'); 

questo modo si potrebbe normalmente collegare i tuoi validatori, filtri, ecc a $ in1 o $ in2 e funzionerebbero come previsto. Nella vostra azione, dopo la validazione dei form, si potrebbe ottenere un array di campi di testo di input della persona come:

$values = $yourForm->getValues(); 
var_dump($values['person']); 

È interessante notare che, il seguente sarà NON lavoro:

$in1 = $this->createElement('text', 'person[0]'); 
$in2 = $this->createElement('text', 'person[1]'); 

Spero che questo vi aiuterà .

+3

Ho visto qualcosa di simile alla tua idea mentre stavo cercando, ma questo non funziona quando il il numero di 'persona []' è dinamico. Prendi questo scenario: chiedi all'utente le e-mail dei suoi amici, ma tu gli presenti solo 1 "" e un pulsante "aggiungi un altro" se vuole aggiungere altro. Il pulsante "aggiungi un altro" è solo un javascript che aggiunge "" al modulo. Il numero di volte in cui l'utente fa clic su "aggiungi un altro" non è noto. Senza zend_form, io semplicemente uso 'persona []' per questo, quindi lo mando al back-end per la convalida. Per questo campo, eseguo il ciclo di tutti gli array e controllo ciascuno. – jblue

+0

@jblue. sì, vedo che questo non è quello stretto in avanti. Ma penso che ci siano altre possibilità che potrebbero essere considerate. Uno potrebbe utilizzare le sottomaschere e contrassegnare la sottomaschera ZF come una matrice (guardare l'utilizzo avanzato di ZF). Un'altra possibilità sarebbe quella di generare più input in ZF e nascondere tutti tranne il primo. JS di quanto vorrebbe mostrare il resto se necessario. Ancora un altro, sarebbe quello di creare campi di input per una ZF in modo dinamico in PHP. Se JS genera 10 campi di input, quindi, dopo l'invio, aggiungi questi campi nel tuo modulo Zend, con i filtri (ecc.) Che desideri, compilare e convalidare come al solito. – Marcin