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.