Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Klasa do sprawdzania formularzy
Forum PHP.pl > Forum > Przedszkole
cer98

Ogólnie dopiero zaczynam programować w OOP, dlatego postanowiłem rozdzielić klasę do walidacji na części.
W ogólnym skrócie przejrzałem sporo materiału, znalazłem, iż klasa abstrakcyjna to taka klasa, której obiektu nie można utworzyć, więc można tylko dziedziczyć.
Proszę o nakierowanie mnie, jakie metody powinny znaleźć się w interfejsie, które w klasie, która dziedziczy. Czy użyć klasy abstrakcyjnej ?
Tutaj wykorzystałem informacje, że przy walidacji, która jest wszędzie, używam Validator validator, gdzie Validator to nazwa interfejsu z metoda doValidate().

Jakie elementy powinny znaleźć się w interfejsie czy są to np. filtry, sposób walidacji, sposób odebrania danych, a których mi brakuje ?
Jak powinna wyglądać taka zdatna klasa?
IceManSpy
Straszne błędy popełniasz.

1. Wiesz do czego służy interfejs? Ale nie wal regułki z wikipedii, tylko wg Ciebie, do czego głównie służy interfejs?
2. Tutaj masz klasę do walidacji tylko stringów, a co z liczbami, datami itd? Nazywaj klasy tak, aby było jednoznaczne co robią?

Na Twoim miejscu olałbym ten interfejs, bo jest tutaj nie potrzebny. Zrób sobie klasę Validator. W niej pola z nazwą obiektu do walidacji i parametrami. Potem dopisz metody set, get i dla każdego typu walidacji dopisz metode do walidacji na zasadzie:
  1. $obj = new Validator();
  2. $obj->doValidateString($_POST['nick']);
  3. $obj->doValidateEmail($_POST['mail']);
  4. $obj->doValidateDate($_POST['birth']);
itd.
cer98
1. Żeby obiekt klasy, która dziedziczy mógł nabrać jakieś właściwości i wiele innych
2. One są w private $parameters

Więc ani jednej klasy abstrakcyjnej, dziedziczącej i interfejsu ? Nie wierzę, że to dobre rozwiązanie, ponieważ walidacja jest wszędzie.
Nie wiem jak taka metoda mogłaby wyglądać, jeżeli walidację przeprowadza już jedna metoda, która wczytuje parametry z tablicy.
IceManSpy
1. A po co Ci to? Ok, możesz napisać interfejs,a potem go implementować dla każdego walidatora (każda osobna klasa dla każdego typu walidacji), ale po co? Ktoś, kto by używał Twojego kodu musi pamiętać nazwy klas. A moim przypadku zrobi sobie obiekt klasy walidator, napisze -> i wyskoczy mu podpowiedź. I przy dobrym nazewnictwie połapie się do czego dana metoda służy.
Zobacz jak to w Zendzie robią:
http://framework.zend.com/manual/en/zend.validate.set.html
A tutaj masz krótki kod:
  1. new Zend_Validate_NotEmpty(),
  2. new Zend_Validate_StringLength(2,30)

I od razu wiesz, co dana metoda robi.

2. A w tym przypadku inny programista musi wiedzieć jakie parametry ma podać. No chyba, że napiszesz do tego wielką dokumentację ;>

Strasznie utrudniasz sobie życie. To co chcesz zrobić to albo klasa zbiorcza, albo interfejs i miniklasy. Nie myśl, że wielki profesjonalizmem jest zrobieniem skomplikowanego dziedziczenia czy interfejsów. PO CO?!
cer98
Chodzi mi o to, żeby klasa była uniwersalna.
Podając po kolei metody na login, hasło, aktualnie muszę dodać również walidator, napisać co i jak ma być sprawdzane, dodaję za pomocą addValidator, następnie doValidate z nazwą stworzonego filtra w tej samej tablicy.
doValidateEmail po prostu wywoływałby funkcję doValidate z wnętrza, dobrze rozumiem ? nie chciałbym używać w kontrolerze $_POST, tylko dane odebrać wcześniej.

  1. $validate->addValidator('login', array('min_length' => 3,
  2. 'max_length' => 35,
  3. 'pattern' => 'numericString',
  4. 'label' => 'Login'
  5. ));
  6.  
  7. $validate->doValidate(@$_POST['login'] ,'login', true);


IceManSpy
Skąd Ci się jakiś kontroler tutaj bierze?! Zostaw na razie MVC.

Na prawdę poczytaj na temat obiektówki, bo strasznie mieszasz.
Zrób sobie klasę walidator, w niej metody doValidateString, doValidateMail itd które zwracaja true/false, a parametry możesz przekazać przez te metody (np długość itd).
Wtedy będziesz mógł wykorzystać to w przyszłości.

Jak się nie zgadzasz z tym to napisz jeszcze raz jak Ty myślisz. Tylko krótsze zadania pisz, a najlepiej to w punktach.

P.S. A podanie w tablicy: 'pattern' => 'numericString' to jak odbierzesz i przerobisz? Ile będzie tych patternów?
cer98
obecny sposób:
  1.  
  2. class Validate {
  3.  
  4. private $parameters = array(
  5.  
  6. 'numericString' => array(
  7. 'pattern' => '^[a-zA-Z0-9]+$',
  8. ),
  9.  
  10. 'www' => array(
  11. 'pattern' => '^(http://|https://)(([a-z0-9]([-a-z0-9]*[a-z0-9]+)?){1,63}\.)+[a-z]{2,6}',
  12. ));
  13.  
  14.  
  15.  
  16. public function addValidator(){
  17. // dodaje po prostu do tablicy wyżej, jeśli trzeba ustalić np. długość znaków i patter numericString
  18. }
  19.  
  20.  
  21. public function doValidate(){
  22. // sprawdzanie czy sa bledy (znaki lub pattern)
  23. }
  24.  
  25.  
  26. public function allClear(){
  27. // jesli wszystko gra
  28. }
  29.  
  30. }
  31.  
  32. //wywolanie
  33. $obj->addValidator('opis', array('min_length' => 3,
  34. 'max_length' => 35,
  35. 'pattern' => 'numericString',
  36. 'label' => 'Opis'
  37. ));
  38.  
  39. $obj->doValidate(@$_POST['opis'] ,'opis', true);
  40.  


Teraz możesz mi powiedzieć, jak mam wykonać twoją metodą, jeśli nie wiem, czy np. pole jest wymagane ? Jaki ma label ? Przecież jest mi to potrzebne, co widzisz powyżej, ale zwracam honor mogłeś nie wiedzieć mojej konstrukcji.
Spawnm
Cer98 - to co próbujesz zrobić strasznie przypomina mi: http://spawnframework.com/doc/25/sf_valid smile.gif
cer98
Po prostu jeśli dodam do

  1. $obj->doValidateString($_POST['nick']);


to, czy ma być wypełnione, label dla błędu, będzie takie same.

To nie mój pomysł, ja zaczerpnąłem sposób, w jaki wypełnić tablicę.

Może tak być ?

1. Jak napisać do tego kontroler wiedząc, że allClear zwraca true jeśli gra, jeśli nie serializuję tablicę błędów ?

2. Mam drugie pytanie, co do wysyłania formularza, bo musi być określone. Jeśli mam wzorzec router, do tego index.php korzysta z szablonów i w jednym szablonie mam plik z takim formularzem - wysyłam go gdzie (pole action="") ?
IceManSpy
Cytat(cer98 @ 6.08.2011, 22:40:03 ) *
Teraz możesz mi powiedzieć, jak mam wykonać twoją metodą, jeśli nie wiem, czy np. pole jest wymagane ? Jaki ma label ? Przecież jest mi to potrzebne, co widzisz powyżej, ale zwracam honor mogłeś nie wiedzieć mojej konstrukcji.
Do czego Ci label? Label służy tylko do opisu w formularzu - nie jest przekazywany. Tworzysz obiekt i dla każdej wartości z formularza wywołujesz odpowiednią metodę. I za pomocą niej sprawdzasz to co chcesz (np isRequired , isValid itd).
No ale zostańmy, że przekazujesz jako tablica parametry do sprawdzenia. Pomysł nie najgorszy o ile nie będzie kilkudziesięciu parametrów do przekazania.

Co do pytań.
1. Jak zwraca true to chyba Ty powinieneś wiedzieć, co chcesz zrobić z tymi danymi. Czyli:
  1. if($obj->allClear){
  2. przetwarzam dane
  3. } else {
  4. odrzucam dane
  5. }

Swoją drogą dla mnie allClear oznacza - wyczyść wszystko, a nie, że wszystko ok. Powinno być coś a'la isValid.

2. Tam go wysyłasz, gdzie go chcesz odebrać ;>
cer98
Czy powinienem użyć tutaj redirect z serializacją błędów ?

Label używam po to, aby przy określonym polu wyświetlić komunikat błędu.
IceManSpy
Cytat(cer98 @ 7.08.2011, 13:35:57 ) *
Czy powinienem użyć tutaj redirect z serializacją błędów ?


Używasz tam, gdzie są błędy i gdzie chcesz, aby ona się pokazały.
cer98
Mam już model do formularzy, jak napisać kontroler do obsługi formularzy, który korzystałby z modelu walidacja ?

p.s. czy te błędy można przesłać sesją ?
ano
Co do walidacji:
najbardziej uniwersalne byłoby, jakbyś napisał sobie interfejs Validator (np tylko z metodą isValid(string) )
potem do każdego typu walidacji osobną klasę implementującą Twój interfejs. (validator od emaila, adresu strony i co tam sobie wymyślisz).
W Twoim przypadku byłoby to korzystniejsze przy tworzenie formularzy i ich walidacji.
W zendzie element formularza to obiekt
  1. $title = new Zend_Form_Element_Text('title');
  2. $title->setLabel('Tytuł:')
  3. ->addValidator('NotEmpty') //metoda addvalidator tak naprawdę tworzy obiekt Validate_NotEmpty
  4. ->setRequired(true);



Dzięki czemuś takiemu, w przyszłości będziesz mógł łatwiej wykorzystywać swoje validatory do różnych celów.
Do prostych zastosowań możesz zrobić jedną klasę validator z metodami isEmailValid i milionem podobnych, ale na dłuższą metę to się nie sprawdzi.
IceManSpy
Skoro piszesz o kontrolerach i modelach, to jakiego używasz frameworka? Czy coś własnego masz?
lukaskolista
Polecam modul validacji z frameworka kohana, bez problemu mozna go "wyciagnac" z framweorka. Masz tam wszystkie popularne metody walidacji. Walidator: http://kohanaframework.org/3.1/guide/api/Validation, metody walidacji: http://kohanaframework.org/3.1/guide/api/Valid
Wykorzystanie jest banalnie proste:
  1. $validation = Validation::factory($_POST)
  2. ->rules('username', array(
  3. array('not_empty'),
  4. array(array('klasa', 'metoda'), array('parametr1', 'parametr2'))
  5. ))
  6. ->rules('password', array(
  7. array('not_empty'),
  8. array(array('klasa', 'metoda'), array('parametr1', 'parametr2'))
  9. ));
  10.  
  11. if ($validation->check())
  12. {
  13. echo 'Dane poprawne.';
  14. }
  15. else
  16. {
  17. echo 'Dane niepoprawne.';
  18. }

Zaleta jest mozliwosc definiowania wlasnych metod walidacji z ktorejkolwiek innej klasy
cer98
Ice piszę framework, mam już wszystko, jestem przy FrontControllerze, dispatcherze. W końcu muszę jakoś dobrać się do moich metod. Dzięki za przykłady.
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.