Układanka Zend_Form
Przy pomocy Zend_Form i klas towarzyszących jej w frameworku Zend mamy możliwość kompleksowego obsłużenia formularzy. Te klasy pozwalają na wyświetlenie formularza, odfiltrowanie pól, wyczyszczenie i weryfikację poprawności danych i wiele innych.
W artykule przedstawiam mój sposób na zrobienie tego w jasny, poukładany sposób.
Artykuł będę bazował na przykładzie prostego skryptu z artykułami.
Na początek same formularze. Dla przykładowego projektu typu CRUD(Create, Read, Update, Delete) zazwyczaj wystarczą 3 formularze : Dodania, Edycji i potwierdzenia usunięcia. Ja Zazwyczaj tworzę więc 3 formularze :
zf create form AreYouSure zf create form PageCreate zf create form PageEdit
Zend_Tool wygenerował nam 3 szkielety formularzy:
class Application_Form_AreYouSure extends Zend_Form { public function init() { /* Form Elements & Other Definitions Here ... */ } } class Application_Form_PageCreate extends Zend_Form { public function init() { /* Form Elements & Other Definitions Here ... */ } } class Application_Form_PageEdit extends Zend_Form { public function init() { /* Form Elements & Other Definitions Here ... */ } }
Pola w formularzach
Typy pól w formularza zazwyczaj odzwierciedlają bazę danych. To jak przechowujemy dane odzwierciedlone powinno być w sposobie ich wprowadzania. Możemy więc zdefiniować przykładowe pola :
- Title - tytuł wpisu
- Head - nagłówek wpisu
- Body - Treść wpisu
- Type - typ wpisu
- Email - Adres autora
Ponieważ pola wykorzystywane są w obydwóch z formularzy (Create i Edit) umieszczamy je w osobnych klasach. Ja zazwyczaj w tym celu tworzę dodatkowy katalog form/Element . Umieszczam w nich klasy dla każdego z pól.
Klasy te dziedziczę po klasach z biblioteki. Przykładowymi klasami przydatnymi do dziedziczenia są Text, Textarea, Select oznaczających typowe elementy formularzy znane z HTMLa.
class Application_Form_Element_Body extends Zend_Form_Element_Textarea { public function init() { } } class Application_Form_Element_Email extends Zend_Form_Element_Text { public function init() { } } class Application_Form_Element_Head extends Zend_Form_Element_Textarea { public function init() { } } class Application_Form_Element_Title extends Zend_Form_Element_Text { public function init() { } } class Application_Form_Element_Type extends Zend_Form_Element_Select { public function init() { } }
Jak już mamy elementy formularzy, umieszczamy je na swoim miejscu. Każde z pól dodajemy do formularza w funkcji init. Do konstruktora obiektu pola przekazujemy jego indeks w formularzu. To po tym indeksie będziemy pobierać wartość danego pola z formularza.
class Application_Form_AreYouSure extends Zend_Form { public function init() { $this->addElement(new Zend_Form_Element_Submit('yes')); $this->addElement(new Zend_Form_Element_Submit('no')); } } class Application_Form_PageCreate extends Zend_Form { public function init() { $this->addElement(new Application_Form_Element_Title ('title')); $this->addElement(new Application_Form_Element_Head ('head')); $this->addElement(new Application_Form_Element_Body ('body')); $this->addElement(new Application_Form_Element_Type ('type')); $this->addElement(new Application_Form_Element_Email ('email')); $this->addElement(new Zend_Form_Element_Submit('create')); } } class Application_Form_PageEdit extends Zend_Form { public function init() { $this->addElement(new Application_Form_Element_Title ('title')); $this->addElement(new Application_Form_Element_Head ('head')); $this->addElement(new Application_Form_Element_Body ('body')); $this->addElement(new Application_Form_Element_Type ('type')); $this->addElement(new Application_Form_Element_Email ('email')); $this->addElement(new Zend_Form_Element_Submit('save')); } }
Dekoratory
Kolejnym krokiem jest praca nad samą prezentacją formularza użytkownikowi. W tym celu używam domyślny zestaw dekoratorów odpowiadających za wygenerowanie HTML. Przydatnych jest przy tym kilka funkcji, które pozwalają na ustawienie etykiety pola (setLabel ) i opisu ( setDescription) . Przykładowo klasa elementu Head będzie teraz wyglądał następująco :
class Application_Form_Element_Head extends Zend_Form_Element_Textarea { public function init() { $this ->setLabel('Nagłówek') ->setDescription('Ta część artykułu pojawiać się będzie na stronie głównej, oraz w widoku detalu artykułu') ; } }
Filtry i Validatory
Po odebraniu danych możemy przepuścić je przez różne filtry. Przydaje się tutaj głównie Zend_Filter_StringTrim. Dzięki niemu w kluczowych polach nie pojawiają się zbędne spacje na początku i końcu.
Sprawdzanie poprawności wprowadzonych danych jest bardzo ważną rzeczą. Pozwala to na zabezpieczenie się przed atakami i upewnienie, że użytkownik wpisał to, co powinien. Zend daje nam do tego szeroką gamę validatorów, które musimy tylko przypiąć i ustawić zgodnie z nasza bazą danych. Często zapomnianą rzeczą do sprawdzenia jest długość pól. Ponieważ w bazie danych większość pól ma swoje ograniczenia warto zablokować ich przekraczanie.
Uzupełniona klasa elementu Title będzie wyglądała tak :
class Application_Form_Element_Title extends Zend_Form_Element_Text { public function init() { $this ->setLabel('Tytuł') ->addFilter('StringTrim') ->addValidator('StringLength', false, array('max'=>255) ) ; } }
Użycie
Tak stworzone formularze bardzo pomagają w pracy z danymi otrzymywanymi od użytkownika. Głównymi funkcjami przydatnymi do użytku są :
- isValid($data) - ustawia wartości pól i sprawdza, czy dane spełniają warunki walidatorów.
- getValues() - pobiera wartość wszystkich pól po przefiltrowaniu w postaci tablicy
- getValue($name) - pobiera wartość z pola o danym indeksie
- setValues($arr) - ustawia wartości pól na podstawie tablicy
- setValue($index,$arr) - ustawia wartości pola
- __toString() - Pozwala na wyświetlenie formularze przez użycie echo $formularz
Podsumowanie
Formularze w Zend pozwalają na pobranie, przetworzenie, sprawdzenie danych oraz wyświetlenie wypełnionego formularza. Praca z formularzami jest prosta, oraz wydajna. Kod formularza może być wykorzystywany wielokrotnie na wielu poziomach, dzięki wydzieleniu klas jego elementów do osobnych obiektów.