Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony]Walidacja formularza
Forum PHP.pl > Forum > PHP > Frameworki
ceieneka
Witam
Uczę się Symfony robiąc portal który wcześniej zrobiłem bez frameworka, i mam problem przy walidacji formularza. Googluje caly dzien probuje coraz nowszych (glupszych) rozwiazan i ciagle nic. Chociaz pomoc dotyczaca walidacji formularzy jest obszerna to jednak tam jest mowa o formularzach stworzonych na podstawie modelu przez propela lub doctrine. Czy moglby mi ktos pomoc w walidacji prostego formularza kontaktowego sa w nim pola:

imię i nazwisko - poprzednio walidowalem tak
  1. if(!eregi("(^[a-ząćęłńóśźż]{3,} [a-ząćęłńóśźż]{2,}$)|(^[a-ząćęłńóśźż]{3,} [a-ząćęłńóśźż]{2,}-[a-ząćęłńóśźż]{2,}$)",$imie))
  2. {
  3. $errors[0]="Imię i nazwisko - pole składa się z dwóch członów oddzielonych spacją:<br/> -imię: dozwolone są wyłącznie litery, musi składać się co najmniej z trzech liter<br/> -nazwisko: dozwolone są wyłącznie litery,w przypadku nazwisk dwóczłonowych łącznikiem jest znak '-', człon musi składać się z conajmniej dwóch znaków.<br/><br/>";
  4. $prawidlowo=false;
  5. }


adres e-mail -
  1. if(!eregi("^[0-9a-ząćęłńóśźż_.-]+@[0-9a-ząćęłńóśźż\.]{2,}.[a-z]{2,3}$",$mail))
  2. {
  3. $errors[1]]="Adres email.<br/><br/>";
  4. $prawidlowo=false;
  5. }


wiadomość -
  1. if(strlen($wiadomosc)>1000)
  2. {
  3. $errors[2]="Wiadomość - maksymalnie może zawierać 1000 znaków.<br/><br/>";
  4. $prawidlowo=false;
  5. }


Niby prosty formularz sciana.gif
Formularz wystepuje w module kontakt, w katalogu lib/form stworzylem plik KontaktForm.class.php (bo chyba powinienem co nie?questionmark.gif) ktory wyglada tak:
  1. class KontaktForm extends sfForm
  2. {
  3. public function configure()
  4. {
  5. $this->setWidgets(array('mail' => new sfWidgetFormInput(),'wiadomosc' => new sfWidgetFormTextarea(),'nazwa' => new sfWidgetFormInput(),'company' => new sfWidgetFormInput()));
  6. $this->setValidators(array('mail' => new sfValidatorEmail(),'wiadomosc' => new sfValidatorString(array('max_length' => 1500,'required' => true)),'nazwa'));
  7. }
  8. }

Ale nie wiem jak dodac warunki z ifow do validatora. Nie brechtajcie sie jesli to glupoty, bo w ogole nie jarze tych formularzy sad.gif
destroyerr
Powinieneś napisać własne walidatory jeśli tego potrzebujesz, możesz także wykorzystać sfValidatorCallback.
Adres e-mail ma już dodany walidator więc wystarczy. Dla "Imię i nazwisko" w starej wersji walidowałeś za pomocą wyrażenia regularnego. W symfony też tak zrób, wykorzystując do tego sfValidatorRegex. Co do długości wiadomości, to widzę, że już umiesz tym sterować, więc nie wiem dlaczego o to pytasz.

Pamiętaj, jeśli nie ma czegoś w dokumentacji, to zawsze możesz zajrzeć w kod.
ceieneka
  1. $this->setValidators(array(
  2. 'mail' => new sfValidatorEmail(),
  3. 'wiadomosc' => new sfValidatorString(array('max_length' => 1500,'required' => true)),
  4. 'imie_nazwisko' =>new sfValidatorRegex("(^[a-ząćęłńóśźż]{3,} [a-ząćęłńóśźż]{2,}$)|(^[a-ząćęłńóśźż]{3,} [a-ząćęłńóśźż]{2,}-[a-ząćęłńóśźż]{2,}$)")));


Czy w ten sposób napisałem własne walidatory??

No i jeszcze jedno pytanie mam, moj formularz wyglada tak:

  1. <form action="kontakt" method="post">
  2. <dl>
  3. <dt>Imię i Nazwisko:</dt>
  4. <dd><input type="text" name="nazwa" size="50" /></dd>
  5. <dt>E-mail:</dt>
  6. <dd> <input type="text" name="mail" size="50" /></dd>
  7. <dt>Firma:</dt>
  8. <dd><input type="text" name="company" size="50" /></dd>
  9. <!--<dt>Telefon:</dt>
  10. <dd><input type="text" name="phone" size="40" /></dd>-->
  11. <dt>Wiadomość:</dt>
  12. <dd><textarea name="wiadomosc" rows="6" cols="60" title="wiadomosc" ></textarea></dd>
  13.  
  14. <dt><input type="submit" value="Wyślij" class="buttonik" />
  15. <input type="reset" value="Wyczyść" class="buttonik" /></dt>
  16. <dd></dd>
  17. </dl>
  18. </form>


No i z tego co zrozumialem to w symfony znaczniki form itd. tworzy sie za pomoca widgetow, no i czy w taki sposob piszac tylko:

  1. $this->setWidgets(array('mail' => new sfWidgetFormInput(),'wiadomosc' => new sfWidgetFormTextarea(),'nazwa' => new sfWidgetFormInput(),'company' => new sfWidgetFormInput()));


nie pozbywam sie stylow??
destroyerr
Cytat
Czy w ten sposób napisałem własne walidatory??

Nie. Wykorzystałeś istniejący walidator, czyli utworzyłeś intancje napisanej już klasy. Tworzenie nowych walidatorów polega na rozszerzeniu klasy sfValdatorBase (lub sfValidator*).

Cytat
nie pozbywam sie stylow??

A nie możesz sam tego sprawdzić? Kod formularza, który pokazałeś nie zawiera żadnych stylów, więc symfony też ich Ciebie nie ma jak pozbawić.
ceieneka
OK sorry pytania nie było smile.gif
Ale pojawiło się następne przy form_tag_for($form, 'sciezka') no wlasnie co to jest ten drugi argument, do czego to jest sciezka??
destroyerr
Nie wiem skąd wziąłeś, że tam jest ścieżka. Gdybyś zajrzał do dokumentacji, to znalazłbyś to.
Ale chętnie Ci na to odpowiadam, tym samym zabijam konkurencję i zwiększam swoje szanse na rynku pracy. W zasadzie powinienem wcisnąć pomógł.
ceieneka
Cytat(destroyerr @ 15.09.2009, 17:29:03 ) *
Nie wiem skąd wziąłeś, że tam jest ścieżka. Gdybyś zajrzał do dokumentacji, to znalazłbyś to.


No Właśnie tam jest $routePrefix, route to chyba ścieżka z angielskiego, qrcze nadal stoje z ta walidacja moze zamieszcze kod ktory do tej pory wymeczylem:

W katalogu glownym projektu w folderze lib/form stworzylem nastepujacy plik KontaktForm.class.php

  1. <?php
  2. class KontaktForm extends sfForm
  3. {
  4. public function configure()
  5. {
  6. $this->setWidgets(array('mail' => new sfWidgetFormInput(),'wiadomosc' => new sfWidgetFormTextarea(),'nazwa' => new sfWidgetFormInput(),'company' => new sfWidgetFormInput()));
  7. $this->setValidators(array('mail' => new sfValidatorEmail(),'wiadomosc' => new sfValidatorString(array('max_length' => 1500,'required' => true)),'nazwa' =>'imie_nazwisko' =>new sfValidatorRegex("(^[a-ząćęłńóśźż]{3,} [a-ząćęłńóśźż]{2,}$)|(^[a-ząćęłńóśźż]{3,} [a-ząćęłńóśźż]{2,}-[a-ząćęłńóśźż]{2,}$)")));
  8. }
  9. }


apps/frontend/modules/kontakt/templates pliczek indexSuccess.php wyedytowalem do nastepujacej postaci
  1. <div id="content">
  2. <div class="container">
  3. <div id="oferta_tresc">
  4.  
  5. <h2>Kontakt</h2>
  6. <p>
  7. Prosimy skorzystać z formularza kontaktowego
  8. </p>
  9. <br />
  10. <?php echo form_tag_for($form, 'XXXX')?>
  11. <table>
  12. <tfoot>
  13. <tr>
  14. <td colspan="2">
  15. <input type="submit" value="Wyślij"/>
  16. </td>
  17. </tr>
  18. </tfoot>
  19. <tbody>
  20. <?php echo $form ?>
  21. </tbody>
  22. </table>
  23. </div>
  24.  
  25. <div class="czysc"></div>
  26. </div>
  27. </div>

Tu jest ten nieszczesny form_tag_for($form, 'XXXX') gdzie nie wiem co wplesc zamiast XXXX

natomiast apps/frontend/modules/kontakt/actions/actions.class.php wyedytowalem tak:
  1. class kontaktActions extends sfActions
  2. {
  3. /**
  4.   * Executes index action
  5.   *
  6.   * @param sfRequest $request A request object
  7.   */
  8. public function executeIndex(sfWebRequest $request)
  9. {
  10. $this->form = new KontaktForm();
  11. }
  12. }


Po zatwierdzeniu wiadomosci i walidacji wiadomosc powinna zostac wyslana powiedzmy funkcja mail().
Sa jakies pomysly?? sciana.gif
destroyerr
Widzę, że moja sugestia w poprzednim poście nie poskutkowała. W takim razie, jeśli nie chce Ci się uczyć i szukać to Twoja sprawa.
$routePrefix Prefix ścieżki jak już, a jeszcze lepiej to prefix trasy. Route -> Routing, nie miałeś takiego skojarzenia?
Radzę Ci olać form_tag_for bo zbyt dużo tłumaczenia, a sam do tego jak widać nie dojdziesz. Skorzystaj lepiej normalnie z tagu <form>, tylko nie zapomnij go zamknąć!

Cytat
natomiast apps/frontend/modules/kontakt/actions/actions.class.php wyedytowalem tak:

No to dużo zedytowałeś. Jak obsłużyć formularz? Jest to napisane w dokumentacji. Rusz do niej swoje 4 literki winksmiley.jpg
ceieneka
wstydnis.gif
Cytat(destroyerr @ 15.09.2009, 19:20:49 ) *
Widzę, że moja sugestia w poprzednim poście nie poskutkowała. W takim razie, jeśli nie chce Ci się uczyć i szukać to Twoja sprawa.
$routePrefix Prefix ścieżki jak już, a jeszcze lepiej to prefix trasy. Route -> Routing, nie miałeś takiego skojarzenia?
Radzę Ci olać form_tag_for bo zbyt dużo tłumaczenia, a sam do tego jak widać nie dojdziesz. Skorzystaj lepiej normalnie z tagu <form>, tylko nie zapomnij go zamknąć!


No to dużo zedytowałeś. Jak obsłużyć formularz? Jest to napisane w dokumentacji. Rusz do niej swoje 4 literki winksmiley.jpg


Ojoj tego sie obawialem to nie tak ze nie chce mi sie uczyc, bo calutki dzien nad tym siedze i kombinuje tylko ze sam chyba nie dam rady dlatego tez zaczalem watek liczylem po prostu na pomoc kogos kto podobne rzeczy juz robil i potrafi jasno wytlumaczyc jak taka walidacje zrobic (co najmniej w przyblizeniu), dostalem same odnosniki na dokumentacje. Co do skojarzenia to wlasnie od razu takie mialem tylko wlasnie na co powinienem ten tag "routowac", przypomne jedno z moich poprzednich pytan "...form_tag_for($form, 'sciezka') no wlasnie co to jest ten drugi argument, do czego to jest sciezka??" (w odpowiedzi link na dokumentacje w ktorej napisano ze drugi argument nazywa sie $routePrefix exclamation.gif SUPER przynajmniej znam poprawna nazwe tego argumentu).
Gdybym byl w stanie dojsc sam nie zamieszczalbym postu, kod ktory zamiescilem jest caly czas rzezbiony (zamknalem <form> niedlugo po napisaniu poprzedniego posta - mimo wszystko dzieki).
O moze tym razem cos wiecej napisali w tej dokumentacji prosze o link na to CO NAPISALI...
I jeszcze raz blagam o cierpliwosc w stosunku do swiezakow, niektorych zeczy nie da sie wytlumaczyc jednym zdaniem...
I jeszcze przez przypadek kliknalem pomogl sadsmiley02.gif
gdyby ktos zdecydowal sie jednak pomoc to modules/action/kontakt/actions/actionsclass.php wyglada juz tak(choc nie mam zielonego pojecia czy w dobra strone zmierzam??):
  1. class kontaktActions extends sfActions
  2. {
  3. /**
  4.   * Executes index action
  5.   *
  6.   * @param sfRequest $request A request object
  7.   */
  8. public function executeIndex(sfWebRequest $request)
  9. {
  10. $this->wpisy_list = WpisyPeer::doSelectNew(new Criteria(), 3);
  11. $this->form = new KontaktForm();
  12. }
  13. public function executeValid(sfWebRequest $request)
  14. {
  15. $this->form = new KontaktForm();
  16. $this->processForm($request, $this->form);
  17. $this->setTemplate('index');
  18. }
  19. protected function processForm(sfWebRequest $request, sfForm $form)
  20. {
  21. $form->bind($request->getParameter($form->getName()));
  22. if($form->isValid())
  23. {
  24. mail(.tu nie wiem jak sie dobrac do tresci.)
  25. }
  26. }
  27. }

w miejsce XXXX w indexsuccess dalem @kontakt_valid (tez nie wiem skad takie cos mi do glowy przyszlo - improwizuje po prostu)
destroyerr
Nie chodzi o to, że ktoś nie ma cierpliwości, czy też ktoś pozjadał wszystkie rozumy i nie chce podzielić się swoją wiedzą. Raczej chodzi o to, że pisanie dokumentacji to dosyć trudna sprawa. Zazwyczaj dokumentacja nie powstaje lub jest lakoniczna. Dokumentacja do symfony (potwierdzają to także przeciwnicy symfony) jest na prawdę na wysokim poziomie. Niestety, trzeba poświęcić trochę czasu na zapoznanie się z dokumentacją i frameworkiem. Doceń ten trud i zapoznaj się z materiałami.
Zrobiłeś cały Jobeet? Jak zrobisz to wróć i pytaj wtedy. Nie da się ściągnąć, coś dopisać i wszystko działa.

Cytat
w miejsce XXXX w indexsuccess dalem @kontakt_valid (tez nie wiem skad takie cos mi do glowy przyszlo - improwizuje po prostu)

Dodałeś trasy w pliku routing.yml?
ceieneka
Ja nie twierdze ze dokumentacja jest kiepska tylko ze nie rozwiazuje wszystkich watpliwosci, tym bardziej mniej zaawansowanym uzytkownikom ktozy sie ucza.


Sciezki mam standardowe tzn. /nazwa_modulu/nazwa_akcji

routing.yml
  1. # default rules
  2. homepage:
  3. url: /
  4. param: { module: home, action: index }
  5.  
  6. default_index:
  7. url: /:module
  8. param: { action: index }
  9.  
  10. default:
  11. url: /:module/:action/*


url_for_form(sfForm $form, $routePrefix) zauwazylem ze ta funkcja wywoluje akcje create lub update, czyli moje uzycie ktore umiescilem poprzednio jest do chrzanu, no ale zanim w ogole zajme sie akcja create, to nie wyswietla mi sie formularz module kontakt, tzn wyswietla sie biala strona czy moglby mi ktos wskazac gdzie moze lezec przyczyna:
indexSuccess.php wyglada tak:
  1. <div id="content">
  2. <div class="container">
  3. <div id="oferta_tresc">
  4. <h2>Kontakt</h2>
  5. <p>
  6. Prosimy skorzystać z formularza kontaktowego
  7. </p>
  8. <br />
  9. <?php echo form_tag_for($form, '@kontakt')?>
  10. <table>
  11. <tfoot>
  12. <tr>
  13. <td colspan="2">
  14. <input type="submit" value="Wyślij"/>
  15. </td>
  16. </tr>
  17. </tfoot>
  18. <tbody>
  19. <?php echo $form ?>
  20. </tbody>
  21. </table>
  22. </form>
  23. </div>
  24.  
  25. <div class="czysc"></div>
  26. </div>
  27. </div>


kontaktForm.class.php tak:
  1. <?php
  2. class KontaktForm extends sfForm
  3. {
  4. public function configure()
  5. {
  6. $this->setWidgets(array('mail' => new sfWidgetFormInput(),'wiadomosc' => new sfWidgetFormTextarea(),'nazwa' => new sfWidgetFormInput(),'company' => new sfWidgetFormInput()));
  7. $this->setValidators(array('mail' => new sfValidatorEmail(),'wiadomosc' => new sfValidatorString(array('max_length' => 1500,'required' => true)),'nazwa' =>'imie_nazwisko' =>new sfValidatorRegex("(^[a-ząćęłńóśźż]{3,} [a-ząćęłńóśźż]{2,}$)|(^[a-ząćęłńóśźż]{3,} [a-ząćęłńóśźż]{2,}-[a-ząćęłńóśźż]{2,}$)")));
  8. }
  9. }


wrzuce jeszcze action.class.php
  1. ...
  2. public function executeIndex(sfWebRequest $request)
  3. {
  4. $this->wpisy_list = WpisyPeer::doSelectNew(new Criteria(), 3);
  5. $this->form = new KontaktForm();
  6. }
  7. ...

No i dlaczego nie chce sie wyswietlic??
Pr0100
Cytat
Ja nie twierdze ze dokumentacja jest kiepska tylko ze nie rozwiazuje wszystkich watpliwosci, tym bardziej mniej zaawansowanym uzytkownikom ktozy sie ucza.


Fakt są tematy o których w dokumentacji jest trochę za mało ale są to dosyć zaawansowane problemy. Wszystkie odpowiedzi na twoje pytana są zawarte w dokumentacji. Osoba ze średnim IQ, znająca angielski i PHP nie powinna mieć problemów z jej zrozumiem, jeżeli Ty masz z tym problem to zmień framework/język programowania/zawód(hobby).
ceieneka
Cytat(Pr0100 @ 16.09.2009, 00:58:00 ) *
Fakt są tematy o których w dokumentacji jest trochę za mało ale są to dosyć zaawansowane problemy. Wszystkie odpowiedzi na twoje pytana są zawarte w dokumentacji. Osoba ze średnim IQ, znająca angielski i PHP nie powinna mieć problemów z jej zrozumiem, jeżeli Ty masz z tym problem to zmień framework/język programowania/zawód(hobby).

Byc moze masz racje, moze jestem za glupi przypomne klasyka "wiem ze nic nie wiem" jesli twoje IQ i wiedza jest na co najmniej srednim poziomie to wiesz co mam na mysli exclamation.gif smile.gif
Tylko zaczyna mi sie powoli rozmywac sens istnienia takiego forum, jak to wesolo sie powyzywac, a odpowiedzi nadal nie ma - dlatego jezeli ktos ma jeszcze uwagi podobne do przedmowcy to nie musi nic pisac i zasmiecac postu - z gory dziekuje.

Na szczescie ludzie za granica sa bardziej wyrozumiali po pierwszym poscie dostalem w odpowiedzi link http://blog.barros.ws/2008/11/05/condition...other-approach/ i wystarczylo - oprocz php trzeba tez uczyc sie kultury...
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.