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.