Autor wpisu: Marek, dodany: 01.03.2012 19:58, tagi: zend_framework
Wygenerowany formularz z mojego poprzedniego wpisu wygląda tak:
<form enctype="multipart/form-data" method="post" action="/zf/test/public/index/rename"> <dl class="zend_form"> <dt id="newname-label"><label for="newname" class="optional">Zmień nazwę pliku:</label></dt> <dd id="newname-element"><input type="text" name="newname" id="newname" value=""></dd> <dt id="filename-label"><label for="filename" class="required">Plik:</label></dt> <dd> <input type="hidden" name="MAX_FILE_SIZE" value="8388608" id="MAX_FILE_SIZE"> <input type="file" name="filename" id="filename"> </dd> <dt id="submit-label"> </dt> <dd id="submit-element"> <input type="submit" name="submit" id="submit" value="Wyślij"></dd> </dl> </form>
Zend Framework podczas generowania formularzy stosuje domyślnie tagi dl, dd, dt. Ja jednak wolę przechowywać elementy formularza w tabeli. Poniżej przedstawiam kod, który chciałbym uzyskać:
<form enctype="multipart/form-data" method="post" action="/zf/test/public/index/rename"> <table> <tr> <th colspan="2">Wyślij plik</th> </tr> <tr> <td id="newname-label"><label for="newname">Zmień nazwę pliku:</label></td> <td><input type="text" name="newname" id="newname" value=""></td> </tr> <tr> <td id="filename-label"><label for="filename">Plik:</label></td> <td> <input type="hidden" name="MAX_FILE_SIZE" value="8388608" id="MAX_FILE_SIZE" /> <input type="file" name="filename" id="filename" /> </td> </tr> <tr> <td colspan="2"><input type="submit" name="submit" id="submit" value="Wyślij"></td> </tr> </table> </form>
Jak zatem wygenerować formularz w Zend Framework, tak aby jego elementy były zawarte w tabeli? Do tego oczywiście służą dekoratory.
Zmodyfikuję jeszcze tylko formularz dodając do niego opis:
$this->setDescription('Wyślij plik');
Po dodaniu elementów do formularza:
$this->addElements(array($newName, $file, $submit));
Ustawmy mu dekoratory:
// dekoratory formularza $this->setDecorators(array( array('Description', array('tag' => 'th', 'colspan' => 2)), array(array('tr' => 'HtmlTag'), array('tag' => 'tr')), 'FormElements', array('HtmlTag', array('tag' => 'table')), 'Form' ));
Nasz opis będzie znajdował się wewnątrz znaczników th. Po opisie zostaną wygenerowane elementy formularza, które razem z opisem zostaną zawarte w znaczniku table, a ten zostanie otoczony znacznikiem form.
Tutaj jedna uwaga. Dekoratory dodawane są do zmiennej tablicowej _decorators klasy formularza. A więc skoro raz używamy HtmlTag, będzie on użyty jako klucz w tablicy __decorators. Jeśli ponownie chcemy użyć tego samego dekoratora, musimy podać unikalny klucz (tutaj: array(‘tr’ => ‘HtmlTag’) )
Dalej ustawmy dekoratory kontrolek: