Klasa walidacji - problem z walidacją ilości elementów tablicy


(jacko1998) #1

Mam problem z walidacją ilości elementów tablicy. Sprawdzam zwykłym if'em używając funkcji empty($tablica) bądź count($tablica) === 0 i chcę dodać błąd, który się nie dodaje. Jak zrobię count($tablica) !== 0 i wypiszę tablice to wszystko jest ok. Nie ma żadnego błędu, w kodzie więc nie wiem o co chodzi.

 

if(empty($field)) { // $field ~ $_POST['name']
$this->addError("Tablica $field nie może być pusta."); // $field = nazwa inputa
}

 

Waliduję grupę checkbox'ów.


(kostek135) #2

Nie rozumiem. Jeśli nie wchodzi, ci do warunku, to będzie ci wchodzić do jego negacji, jak widać tablica nie jest po prostu pusta. Gdzie masz problem?

PS Tu jeszcze link do ideone'a, wszystko działa, jak powinno, więc debuguj sobie zawartość tablicy.


(jacko1998) #3

Gdy mam tak:

 

if(count($field) === 0) { // lub empty($field)
$this->addError("Tablica $field nie może być pusta.");
}

 

błąd się nie dodaje(choć tablica jest pusta), a gdy tak:

 

if(count($field) !== 0) { // lub !empty($field)
$this->addError("Tablica $field nie jest pusta");
}

 

błąd się dodaje.

PS wiem jak walidować tablice


(kostek135) #4

Dalej nie rozumiem, jeśli chcesz, by wpadło w pierwszego if-a, przekaż pustą tablicę,tak jak tu: https://ideone.com/mkTscs

[edit]

co do twojego edita (że tablica jest pusta), to nie można tego ustalić z aktualnego kodu, i zapewne nie jest pusta, tylko ci się tak wydaje. Użyj jakiegoś debuggera, do sprawdzenia zawartości.


(jacko1998) #5

No ja też nie rozumiem. Pustą tablicę przekazuję, ponieważ nie zaznaczam żadnego checkbox'a, a błąd się nie dodaje.


(kostek135) #6

Tablica najwyraźniej nie jest pusta, zobacz, co się stanie jak zaraz po przyjęciu tablicy z form'a nadpiszesz ją pustą tablicą, tak jak ja to zrobiłem w kodzie z ideone'a. Użyj debuggera i ustal co się w niej przekazuje.

Możesz też wkleić forma + cały kod, bo błąd nie leży w if-ie, którego tak namiętnie kopiujesz, tylko w tym, że w tablicy są jakieś elementy.


(jacko1998) #7

inicjalizacja - http://goo.gl/5o1hPD

klasa - http://goo.gl/5Rwazp


(kostek135) #8

jeszcze form


(jacko1998) #9

Tagi:



HTML



CSS



JavaScript



jQuery



PHP



MySQL



Python



Ruby



C++



C#



SCSS



LESS

Kategoria:



Webmasterstwo



Gotowanie



Motoryzacja


(kostek135) #10

Masz poważne błędy logiczne w walidacji.

Jeśli tablica jest pusta, to nie wchodzisz, ani w if

if($rule === 'required' && empty($_field)) {

'tags' => array(
    'required_group' => true
),

bo reguła tags, nie spełnia pierwszego predykatu ($rule === 'required')

ani w else if (bo jest pusta oczywiście)

 

} else if(!empty($_field)) {

natomiast przy tablicy z elementami, wpadasz do else-if'a

 

if(count($_field) === 0) {

ale powyższy warunek nie jest spełniony.

To też wyjaśnia czemu "niby działa", jak go zanegujesz.

Tworzysz straszny spaghetti code, to też nie ma co się dziwić, że tak się dzieje.

Taka zmiana powinna pomóc, ale nie testowałem, to:

 

if($rule === 'required' && empty($_field)) {
    $this->addError("Pole $field musi zostać wypełnione.");
} else if(!empty($_field)) {

na

 

if(empty($_field)) {
    if ($rule === 'required') {
        $this->addError("Pole $field musi zostać wypełnione.");
    } else if (is_array($_field)) { // To, że jest pusta już wiemy z głównego if-a
        print_r($_field);
        $this->addError("Tablica $field nie może być pusta.");
    }
} else {

Zmieniłem odrobinę kod, głównie chodzi o to, by count === 0, nie był w sekcji, gdzie tablica, jest niepusta (bo te warunki są sprzeczne), ale tak naprawdę to co próbujemy zrobić, to posypać k*** cukrem pudrem i sprzedawać jako szarlotkę, kod tragiczny.


(jacko1998) #11

Już sobie poradziłem, dziękuje za pomoc. Usunąłem if'a i jeszcze kilka popraw i nareszcie działa. Dziękuje.

 

PS jeżeli można wiedzieć o co chodzi ze stwierdzeniem, iż kod jest jest tragiczny ? Chodzi o zły kod w myśl logiki czy po prostu cały czas piszę szit ? Mnie osobiście kod tej klasy się podoba.


(kostek135) #12

Kod jest beznadziejny z kilku powodów:

  1. Widać, że specyfikacja tego co ma się znaleźć jest tworzona na kolanie, nie masz całości planu od A do Z, tylko wpadłeś na pomysł jakiejś funkcjonalności to ją metodą code&fix dopisujesz, co tworzy bałagan jak ten powyżej, ponieważ jeden klocek nie uwzględnia drugiego. Dochodzimy przez to do sprzecznych warunków, pokrywamy coś nie efektywnie kilkukrotnie, albo co gorsza czegoś nie uwzględniamy.

  2. Dobry kawałek softu powinien być napisany tak, by móc dodawać do niego kolejne klocki bez potrzeby zmiany istniejącej już implementacji. W przeciwnym przypadku coś co działało i było przetestowane zmienia się i na jakieś 95% przestanie działać. Tak jest u ciebie, jeśli chcę dopisać nową zasadę to muszę modyfikować tego okropnego switcha, od takich rzeczy w OO jest polimorfizm. Może warto zapoznać się ze strategy pattern do tego zadania?

  3. Trzymanie konfiguracji powinno się odbywać na zasadzie language-agnostic. Teraz twoje "API" jest ściśle związane z jedynym słusznym językiem. Może komuś kiedyś spodoba się projekt, będzie chciał go przenieść do języka X, Y, Z. Fajnie byłoby móc korzystać z istniejącej konfiguracji, a oprogramować tylko sam engine, prawda?