Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Klasa do sprawdzania formularzy
cer98
post
Post #1





Grupa: Zarejestrowani
Postów: 126
Pomógł: 5
Dołączył: 17.07.2011

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



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?

Ten post edytował cer98 6.08.2011, 21:31:59
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 16)
IceManSpy
post
Post #2





Grupa: Zarejestrowani
Postów: 1 006
Pomógł: 111
Dołączył: 23.07.2010
Skąd: Kraków

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


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.

Ten post edytował IceManSpy 6.08.2011, 19:43:33
Go to the top of the page
+Quote Post
cer98
post
Post #3





Grupa: Zarejestrowani
Postów: 126
Pomógł: 5
Dołączył: 17.07.2011

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


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.

Ten post edytował cer98 6.08.2011, 19:49:55
Go to the top of the page
+Quote Post
IceManSpy
post
Post #4





Grupa: Zarejestrowani
Postów: 1 006
Pomógł: 111
Dołączył: 23.07.2010
Skąd: Kraków

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


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?!

Ten post edytował IceManSpy 6.08.2011, 20:07:23
Go to the top of the page
+Quote Post
cer98
post
Post #5





Grupa: Zarejestrowani
Postów: 126
Pomógł: 5
Dołączył: 17.07.2011

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


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);




Ten post edytował cer98 6.08.2011, 20:15:57
Go to the top of the page
+Quote Post
IceManSpy
post
Post #6





Grupa: Zarejestrowani
Postów: 1 006
Pomógł: 111
Dołączył: 23.07.2010
Skąd: Kraków

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


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?

Ten post edytował IceManSpy 6.08.2011, 20:22:50
Go to the top of the page
+Quote Post
cer98
post
Post #7





Grupa: Zarejestrowani
Postów: 126
Pomógł: 5
Dołączył: 17.07.2011

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


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.
Go to the top of the page
+Quote Post
Spawnm
post
Post #8





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




Cer98 - to co próbujesz zrobić strasznie przypomina mi: http://spawnframework.com/doc/25/sf_valid (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
cer98
post
Post #9





Grupa: Zarejestrowani
Postów: 126
Pomógł: 5
Dołączył: 17.07.2011

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


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="") ?
Go to the top of the page
+Quote Post
IceManSpy
post
Post #10





Grupa: Zarejestrowani
Postów: 1 006
Pomógł: 111
Dołączył: 23.07.2010
Skąd: Kraków

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


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ć ;>
Go to the top of the page
+Quote Post
cer98
post
Post #11





Grupa: Zarejestrowani
Postów: 126
Pomógł: 5
Dołączył: 17.07.2011

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


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.
Go to the top of the page
+Quote Post
IceManSpy
post
Post #12





Grupa: Zarejestrowani
Postów: 1 006
Pomógł: 111
Dołączył: 23.07.2010
Skąd: Kraków

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


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.
Go to the top of the page
+Quote Post
cer98
post
Post #13





Grupa: Zarejestrowani
Postów: 126
Pomógł: 5
Dołączył: 17.07.2011

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


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ą ?

Ten post edytował cer98 7.08.2011, 13:06:57
Go to the top of the page
+Quote Post
ano
post
Post #14





Grupa: Zarejestrowani
Postów: 435
Pomógł: 40
Dołączył: 16.02.2003
Skąd: Wrocław

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


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.
Go to the top of the page
+Quote Post
IceManSpy
post
Post #15





Grupa: Zarejestrowani
Postów: 1 006
Pomógł: 111
Dołączył: 23.07.2010
Skąd: Kraków

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


Skoro piszesz o kontrolerach i modelach, to jakiego używasz frameworka? Czy coś własnego masz?
Go to the top of the page
+Quote Post
lukaskolista
post
Post #16





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

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


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





Grupa: Zarejestrowani
Postów: 126
Pomógł: 5
Dołączył: 17.07.2011

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


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

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

 



RSS Aktualny czas: 21.12.2025 - 00:26