Перейти к содержимому


О валидации массива значений

Проблема:

  1. Имеется несколько полей формы с одинаковым именем (я экспериментировал с файловыми инпутами, поэтому назову их ‘files[]‘). Какие именно это поля, по сути неважно, это могут быть к примеру чекбоксы, и называться ‘options[]‘.
  2. При проверке данных первое значение теряется, вне зависимости от того, соответствует ли оно правилам или нет. С остальными все в порядке.

Очень долго пытался найти решение, а оказалось все достаточно просто. Помимо установки правил/фильтров/коллбэков по отдельности для каждого поля, объект Validate позволяет назначать их сразу для всех полей, для этого вместо имени поля подставляем TRUE. Перед цикличной проверкой в методе check() эти “общие” методы тиражируются по имеющимся полям, а потом удаляются:

// Remove the filters, rules, and callbacks that apply to every field
	unset($filters[TRUE], $rules[TRUE], $callbacks[TRUE]);

Как мы помним, константа TRUE и есть единица, таким образом для системы поле под номером 1 всегда занято под собственные нужды. Отсюда вывод: именуйте подобные множественные поля вручную, например как ‘files[f1]‘, ‘files[f2]‘ и т.д., либо подкладывайте в Validate уже обработанные массивы.

Попутно выяснилась еще одна проблема. Если я использую только общие правила (т.е. не вызываю rule()/filter()/callback() для определенного поля), то валидация вообще не пройдет, система вернет FALSE и никаких ошибок. Дело в том, что для полей не будут заполнены метки (labels), поэтому объект Validate подумает, что никаких данных не передано.

UPD. Судя по всему, прозрачная валидация массивов будет добавлена в версии 3.1.0.

Google Bookmarks del.icio.us Technorati News2.ru БобрДобр.ru RUmarkz Memori.ru МоёМесто.ru

Связанные записи

Размещено в Kohana3. Метки: , , .

1 звезда2 звезды3 звезды4 звезды5 звезд (No Ratings Yet)
Загрузка ... Загрузка ...

Комментариев: 0

Чтобы быть в курсе обсуждения, подпишитесь на RSS-ленту комментариев.

(required)

(обязательное поле, не увидят)

или ответить на пост через trackback.