Układanka Zend_Form

2011-02-24 15:42:55 2011-02-24 21:01:22

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.