Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZF][ZendFramework] Walidacja formularza w innym kontrolerze
Forum PHP.pl > Forum > PHP > Frameworki
Vill
Mam w jednym kontrolerze różne formularze. Każdy formularz ma akcję, która buduje formularz oraz akcję, która jest umieszczana w parametrze action formularza i zajmuje się przetworzeniem danych z formularza. Gdy zbudowanie formularza + walidacja + przetworzenie danych znajdowały się w jednym kontrolerze to walidacja formularza działała bez problemu, natomiast gdy rozdzieliłam budowe formularza i przetworzenie danych na osobne akcje, walidacja przestała działać. Dlaczego i jak zrobić żeby w ten sposób działała?

Mam mniejwięcej coś takiego:

Inicjalizacja formularza w kontrolerze
  1. public $form;
  2.  
  3. //inicjalizacja kontrolera
  4. public function init() {
  5.  
  6. $this->form = new Zend_Form();
  7.  
  8. }


zbudowanie formularza

  1.  
  2. public function formAction(){
  3.  
  4. $this->form->setMethod('post')
  5. ->setAction('/client/formdata');
  6.  
  7. //elementy
  8. $login = $this->form->createElement('text', 'login', array('label' => 'Login:'));
  9. ....
  10. //walidatory
  11. $login->addValidator('stringLength', true, array(2, 20));
  12. ....
  13. //filtry
  14. $login->addFilters(array('StringTrim', 'StripTags'));
  15. ....
  16.  
  17. //złożenie formularza
  18. $this->form->addElement($login)
  19. ....
  20. ->addElement($submit);
  21.  
  22. //przekazanie formularza do widoku
  23. $this->view->form = $this->form;
  24.  
  25.  
  26. }


action formularza:

  1.  
  2. public function formdataAction(){
  3.  
  4. if ($this->_request->isPost() && $this->form->isValid($_POST)) {
  5.  
  6. ..przetworzenie danych...
  7.  
  8. } else {
  9. $this->view->alert = '<div class="red-alert">Błąd. Sprawdź poprawność danych</div>';
  10. }
  11. }


Co trzeba zrobić aby walidacja zadziałała, albo chociaż żeby formularz nie przepuszczał niepoprawnych danych? W tym momencie pozwala zapisywać w bazie wszystko.
Turson
Zapewne walidacja nie działa ponieważ kiedy masz akcję w innej metodzie, to formularz w tej metodzie nie jest budowany, ponieważ jest zbudowany w innej, strona się przeładowuje, a tamta akcja nie jest wykonywana. Więc tak naprawdę Zend nie widzi żadnych pól formularza.
Jak to naprawić?
W Zendzie tworzy się klasy formularzy. W /forms umieszczasz klasę formularza np. o nazwie Application_Form_Przyklad
Tworzysz metodę i przekazujesz formularz w taki sposób
  1. public function formAction(){
  2. $form = new Application_Form_Przyklad();
  3. $this->view->form = $form;
  4. }

Analogicznie w drugiej metodzie
  1. public function formdataAction(){
  2. $form = new Application_Form_Przyklad();
  3. // walidacja etc
  4. }


Tutaj masz opisane
http://framework.zend.com/manual/1.12/en/l...reate-form.html

btw. po co uczysz się jeszcze Zenda? Też miałem taką wizje, ale ten framework już jest stary i ją porzuciłem...
Vill
Ok, prawie wszystko hula jak powinno, ale nie wyświetlają się komunikaty walidacji pod polami. Chodzi mi o komunikaty 'pole powinno mieć od 2 do 25 znaków' itp. Gdy wszystko jest w jednym kontrolerze nie ma problemu. Jak zrobić żeby one się teraz wyświetlały?

A Zenda się uczę, bo magisterka smile.gif I też planuje się go uczyć tylko tyle ile mi będzie potrzebne do magisterki. Ja jestem front-endowcem, ale tematów związanych z samym front-endem nie ma na mojej uczelni. W ogóle tematów związanych z web developingiem jest tyle co nic.
Turson
Jak nie wypełnisz danych formularza to do bazy wrzuca? Czy tylko nie ma komunikatów ale i tak nie wrzuca? I pokaż nowy kod
Vill
Nie wpisuje mi do bazy danych, które nie przeszły walidacji. Jeżeli mam coś takiego w kontrolerze

  1. .....
  2.  
  3. //walidacja
  4. if ($this->form->isValid($this->_request->getPost())) {
  5.  
  6. //zebranie danych z formularza
  7. $data = array(
  8. ......
  9. );
  10.  
  11. //update rekordu
  12.  
  13. $check = $this->clientTable->update($data, 'ClientLogin = "'.$login.'"');
  14.  
  15. if($check<=0){
  16. $this->view->alert = '<div class="red-alert">Błąd połączenia z bazą lub wysłane dane nie różnią się od już istniejących.</div>';
  17. return;
  18. }
  19.  
  20. $this->view->alert = '<div class="green-alert">Udało się</div>';
  21. } else {
  22.  
  23. $this->view->alert = '<div class="red-alert">Błąd. Nie przeszło walidacji.</div>';
  24.  
  25. }
  26.  


To wyświetla się napis "Błąd. Nie przeszło walidacji". Chciałabym zrobić taki efekt, że w przypadku niepoprawnych danych formularz wyświetla się ponownie z komunikatami, w którym polu są błędne dane i dlaczego. Redirect na formularz załaduje czysty formularz.

Gdy wszystko znajduje się w jednym kontrolerze, to formularz po prostu odświeża się, ale posiada już dodatkowe pola pod inputami informujące które dane nie przeszły walidacji i dlaczego. Np. 'pole musi posiadać więcej niż 2 i mniej niż 25 znaków' (po angielsku oczywiście). Chcę uzyskać taki sam efekt. Czy to jest w ogóle możliwe?
Turson
  1. public function metodaAction()
  2. {
  3. $form = new Application_Form_Formularz();
  4. if($this->getRequest()->getPost()){
  5. if($form->isValid($this->getRequest()->getPost())){
  6. // jest poprawnie
  7. return true;
  8. }
  9. }
  10. $this->view->form = $form;
  11. }

W ten sposób formularz zostanie wyświetlony ponownie wraz z bledami
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.