Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [ZF][ZendFramework] Walidacja formularza w innym kontrolerze
Vill
post 2.11.2014, 19:18:18
Post #1





Grupa: Zarejestrowani
Postów: 62
Pomógł: 0
Dołączył: 22.05.2009

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
Turson
post 3.11.2014, 08:32:37
Post #2





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

Ostrzeżenie: (0%)
-----


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...

Ten post edytował Turson 3.11.2014, 08:34:10
Go to the top of the page
+Quote Post
Vill
post 8.11.2014, 17:16:21
Post #3





Grupa: Zarejestrowani
Postów: 62
Pomógł: 0
Dołączył: 22.05.2009

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Vill 8.11.2014, 17:17:08
Go to the top of the page
+Quote Post
Turson
post 8.11.2014, 19:45:48
Post #4





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Vill
post 9.11.2014, 14:23:51
Post #5





Grupa: Zarejestrowani
Postów: 62
Pomógł: 0
Dołączył: 22.05.2009

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
Turson
post 9.11.2014, 15:13:02
Post #6





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

Ostrzeżenie: (0%)
-----


  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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 07:40