Technologie i narzędzia: język PHP 5, Java, JavaScript, Python, system Zend Framework, Django, biblioteka jQuery, Smarty, platforma Eclipse, MySQL, SVN, CVS, UML, Firefox.
WebProgramming - wszystko o serwisach internetowych
O serwisach internetowych.
[php] Integracja biblioteki Fasic_Form z Zend Framework.
W poprzednim artykule omówiłem jedną z wizji obsługi formularzy - przedstawiłem ją na przykładzie prostego skryptu PHP. Teraz czas na odważniejszy krok - integracja biblioteki z systemem Zend Framework. Tym razem naszym celem jest ładna i prosta integracja Fasic_Form z kontrolerem akcji (klasą typu Controller) .
W celu przedstawienia rozwiązania omawianego problemu ponownie posłużę się przykładowym (dobrze skomentowanym) kodem - uważam, że to najefektywniejszy sposób omawiania takich rozwiązań.
Uwaga: w dalszej części zakładam, iż masz doświadczenie w programowaniu oraz korzystałeś chociaż trochę z systemu Zend Framework.
Podczas budowania rozwiązania założyłem, iż inicjacja strony z formularzem odbywa się za pomocą żądania wysłanego metodą GET. Nastomiast żądania wysłane metodą POST (na ten sam adres) oznaczają obsługę formularza (np. zapis do bazy danych).
Rozwiązanie problemu polegało na:
- oddzieleniu standardowych czynności tworzenia obiektu formularza do metody processForm()
- oddzielenie definiowania formularza (listy pól, itp) do oddzielnej metody klasy kontrolera (metody kończące się na Form)
Dzięki temu w treści samej akcji (metody kończące się na Action) możemy skupić się na implementacji funkcjonalności biznesowej. Jednocześnie w łatwy i przejrzysty sposób możemy tak zmodyfikować metody typu *Form, aby inicjowały formularz z zewnętrzenego źródła (np. listę walidatorów umieszczamy w pliku konfiguracyjnym).
Oto przykładowy kod wykorzystania:
-
class IndexController extends Fasic_Controller_Action {
-
// Metoda akcji - domyślnie wykonywana przez FrontController.
-
public function newAction() {
-
$message = ”;
-
// zainicjuj formularz
-
$form = $this->processForm();
-
// pobierz widok
-
$view = $this->getView();
-
// jeżeli wysłano formularz metodą POST
-
if($form->isPopulated()) {
-
// sprawdź czy formularz jest poprawny
-
if($form->isValid()) {
-
// zapisz do bazy, itp.
-
// dostęp do wartości pól np.: $form->id, $form->email
-
} else {
-
$message = $form->getError();
-
}
-
}
-
$view->form = $form;
-
$view->error = $message;
-
}
-
// Metoda formularza - wykonywana przez metodę processForm()
-
// Zwraca definicję formularza dla akcji new (metoda newAction()).
-
public function newForm() {
-
// dodaj pola, walidatory, filtry, itp.
-
return $form;
-
}
-
}
Klasa bazowa dla naszego kontrolera powinna implementować metodę processForm, na przykład:
-
abstract class Fasic_Controller_Action extends Zend_Controller_Action {
-
/**
-
* @return Fasic_Form
-
*/
-
public function processForm($row = null) {
-
// pobierz nazwę akcji
-
$action = $this->getRequest()->getActionName();
-
// stwórz nazwę metody, która zwraca obiekt formularza
-
// jeżeli metoda formularza istnieje
-
// sprawdź, czy wywołana metoda zwróciła obiekt formularza
-
if($form instanceof Fasic_Form) {
-
// inicjacja z parametru (np z bazy danych)
-
if(($row != null)) {
-
// przypisz domyślne wartości
-
} else {
-
$form->resetToDefaults();
-
}
-
// jeżeli wysłano formularz (metodą POST)
-
if($this->getRequest()->isPost()) {
-
// zainicjuj wartości oraz uruchom filtry i walidatory
-
$form->populate($this->getRequest()->getPost());
-
}
-
return $form;
-
}
-
}
-
return null;
-
}
-
}
Uwagi mile widziane.
1 Komentarz to “[php] Integracja biblioteki Fasic_Form z Zend Framework.”
Napisz komentarz
[...] Nie oznacza to oczywiście, że twórcy ZF nie moją głupich pomysłów… moim zdaniem do nich m.in należy obsługa formularzy i osobiście preferuje rozwiązanie Szymona: Fasic_Form. [...]