Takže další část o Zend_Form. Formulář jsme si minule nainstancovali, přidali jsme do něj elementy a validace. Teď zbývá zobrazení formuláře a právě o to se starají dekorátory. Jak už je z názvu patrné, dekorátor přidává nebo upravuje chování nějakého objektu, ke kterému je připojen. V našem případě tedy zajistí vykreslení formuláře do HTML, ale stejně tak by bylo pravděpodobně možné použít dekorátory k vykreslování formulářů třeba do PDF, GUI atd.
Dekorátor lze přiřadit nejen k elementům formuláře, ale i k formuláři samotnému dále k podformulářům, skupinám elementů. Jak už jsem se zmínil minule je definována sada implicitních dekorátorů, které se použijí pokud se dekorátory nebudete zabývat a formulář s elementy v šabloně rovnou vykreslíte. Já jsem potřeboval implicitní vykreslování změnit takto:
- všechny elementy umístit do
fieldset
u - textové inputy a textareu umístit do
div
ů - buttony mít vedle sebe
- speciální preview button
noscript
ajavascript
pro ošetření proti spamu.
Zend framework obsahuje mnoho předpřipravených dekorátorů, se kterými jsem vystačil, takže nebylo třeba psát vlastní dekorátory.
Elementy ve fieldsetu
Pomocí metody formuláře addDisplayGroup
přidáme do formuláře náš fieldset. Jako další parametr je pole s identifikátory elementů, které do fieldsetu přidáme, pak název (commentGroup
), který bude jako id fieldsetu. Jako poslední je pole parametrů, které určují další HTML atributy elementu fieldset (v našem případě legend
a class
).
$commentForm->addDisplayGroup( array('username', 'email','www','message','homepage','formAction','submitB','resetB','preview') ,'commentGroup' ,array("legend"=>"Add comment","class"=>'dialog') );
dále pro náš fieldset nastavíme dekorátory FormElements
a Fieldset
. Ty nám zajistí vykreslení fieldsetu a elementů v něm.
$commentForm->setDisplayGroupDecorators(array( 'FormElements', 'Fieldset' ));
Elementy v DIVech
Nastavíme nejdříve dekorátory na pro celý formulář na FormElements
a Form
.
$commentForm->setDecorators(array( 'FormElements', 'Form' ));
Pak pomocí setElementDecorators
definujeme sadu dekorátorů pro jednotlivé elementy. Nastavení elementů do divů zajistíme dekorátorem HtmlTag
s nastavenými parametry tag
na div a naší stylovou třídu formElement
.
$commentForm->setElementDecorators(array( 'ViewHelper','Errors', array('HtmlTag', array('tag' => 'div','class'=>'formElement')), array('Label') ));
Buttony vedle sebe
Protože jsme v předešlém kroku všem elementům přiřadili dekorátor HtmlTag
, tak se nám i buttony renderují do divů. Našim buttonům tedy necháme jen dekorátor ViewHelper
.
$formAction->clearDecorators(); $formAction->addDecorator('ViewHelper'); $submit->clearDecorators(); $submit->addDecorator('ViewHelper'); $reset->clearDecorators(); $reset->addDecorator('ViewHelper');
Speciální preview button
Protože Zend Framework pro buttony využívá HTML element button
a já jsem potřeboval input type="button"
, tak jsem si musel napsat vlastní view helper a ten pak elementu vnutíme přes ViewHelper
dekorátor.
$preview->clearDecorators(); $preview->addDecorator('ViewHelper',array('helper'=>'FormButtonType'));
Ošetření proti spamu
Je to metoda popsaná J. Vránou, s výhodou lze využít dekorátoru ViewScript
, který nám dovoluje pro element použít vlastní šablonu - antiSpamInput.phtml.
$antiSpam->clearDecorators(); $antiSpam->addDecorator('ViewScript',array('viewScript'=>'antiSpamInput.phtml')); $antiSpam->addDecorator('Errors');
Náš element antiSpam
máme definován jako obyčejný text input - viz minulý díl.
$antiSpam = $commentForm->createElement('text','homepage'); $antiSpam->setRequired(true); $antiSpam->addValidator(new Zend_Validate_Identical('NejsemSpammer'));
No a tím máme formulář hotov, dokonce fungují i chybové hlášky. Poslední co zbývá, je podpora překladu pro chybové hlášky a labely formuláře. O tom příště.
Komentáře (2)
Dobrá práce, přehledné, žadná "omáčka" kolem a rovnou na věc. Jen mi tady chybí "třešnička na dortu" a to odkaz na stránku, kde by byl vidět konečný výstup (HTML output). (Rejpalové teď určitě chtějí napsat "Si zkopči kód a vyzkoušej si to sám na localhostu ne?" ; má odpověď: "No vídíš, to mě nenapadlo :-)")
konečný výstup je právě ten formulář, kam zrovna teď píšu ten kometář :-), viz první díl, komplet php kód pro formulář je v svn
v metode viewEntryAction()
Komentáře jsou uzavřeny.