Mirin webspace

Nejbohatší život má ten, kdo žije s minimem nároků

24. 4. 2008 - Komentáře (2) Zend Framework

Zend_Form II

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 fieldsetu
  • textové inputy a textareu umístit do divů
  • buttony mít vedle sebe
  • speciální preview button
  • noscript a javascript 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)

  1. drakul - 28. 4. 2008 21:13

    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 :-)")

  2. koubel - 29. 4. 2008 10:10

    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.