Одно поле из двух

Столкнулся с необходимостью сделать так, чтобы Cake проверял при валидации заполненность хотя бы одного поля формы из двух. Чтобы от клиента требовать хотя бы имя или фамилию ну, или оба.

Сделал вот такой метод для валидации:

Вот так его в правилах валидации указываю.

Получилось красиво, но насыпалась неприятностей:

  1. Cake считает, что оба поля необходимы, в форме он формирует поля со свойством required и div обертки с соответствующим классом
  2. Если принудительно указать при вызове помощника (helper), что ‘required’=>false, то у input’а свойство убирает, но div продолжает оборачивать. Возможно, глюк dev-версии 2.4
  3. Если обоим полям в модели при валидации указать ‘allowEmpty’=>true, то красивый метод не срабатывает, Cake тогда считает что оба пустых поля тоже валидны

Увы, придется, видимо, в beforeValidation или afterValidation переносить проверку.

Добавляем правила проверки данных на лету

Все в общем-то, тривиально и не стоило бы, наверное, пост городить. Но рассматривая код некоторых проектов на CakePHP я обнаружил удивительную вещь — во многих случаях данные формы проверяются не встроенным валидатором, а специально написанным кодом. Зачем? Непонятно.

Во-первых правила проверки — это просто ассоциативный массив, в который вполне можно добавлять элементы, прямо из метода контроллера. Никуда они при инициализации модели, не парсятся и не обрабатываются, пока не будет вызван валидатор.

Во-вторых валидатор отлично справляется с полями формы, которым нет соответствия в модели. А метод модели save() записывает только те поля, которым соответствуют колонки в таблице.

Вот, например, простая форма регистрации пользователя. Читать далее Добавляем правила проверки данных на лету