Примеры валидации(часть 1)

16.12.2012

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

1) Определяем, чтобы дата в формате mm/dd/yyyy была в будущем

array('startDate, endDate', 'date', 'format' => 'MM/dd/yyyy'),
array('startDate, endDate', 'compare', 'compareValue' => date('m/d/Y'), 'operator' => '>=', 'message'=>'{attribute} must be later or equal than Now.'),

2) Валидируем время в формате g:i a (10:05 am)

array('startTime, endTime', 'date', 'allowEmpty' => true, 'format' => 'M:m a'),

3) Валидируем чтобы дата окончания была больше начальной даты (endDate > startDate)

EDateCompare берем отсюда - http://www.yiiframework.com/extension/date-compare

array('startDate',
 'ext.validators.dateCompare.EDateCompare',
 'dateFormat' => 'm/d/Y',
 'compareAttribute' => 'endDate',
 'operator' => '<=',
 'message' => 'Start date must be before end date.'
),
array('endDate',
 'ext.validators.dateCompare.EDateCompare',
 'dateFormat' => 'm/d/Y',
 'compareAttribute' => 'startDate',
 'operator' => '>=',
 'message' => 'End date must be after start date.'
),

4) Пароль должен содержать хотя бы 1 заглавную букву и хотя бы 1 цифру

array('password', 'match', 'pattern'=>'/[A-Z]{1}/', 'message' => 'Password must contain at least 1 capital letter.'),
array('password', 'match', 'pattern'=>'/\d+/', 'message' => 'Password must contain at least 1 number.'),

5) Есть поле ENUM, нужно проверить входит ли выбранное значение в список

Вот список значений:

public static function getOptions() {
  return array(
    self::GENDER_FEMALE=>'Female',
    self::GENDER_MALE=>'Male',
    self::GENDER_NONE=>'None',
  );
}

И валидация:

array('gender', 'in', 'range'=>array_keys(self::getOptions()))

6) Устанавливаем значение по-умолчанию.

Валидация не производится, а просто задается значение. Используется при $model->save() или $model->validate()

array('user_id', 'default', 'value'=>Yii::app()->user->id),

7) Исключение валидации для определенных сценариев

В одном из последних релизов ий появилась возможность указать сценарий, для которого не должны срабатывать правила валидации при помощи except

array(
  'first_name, last_name, primary_phone, address1, country_id, state_id, email',
  'required',
  'except' => array('register'),
),

8) Поля first_name, last_name, middle_name должны содержать только текст

array('first_name, last_name, middle_name', 'match', 'pattern'=>'/[a-zA-Z]+$/s', 'message'=>'Must contains only letters.'),

9) Уникальность с условием

Проверяем уникальность имени при условии что owner_id = id-добавляющего имя пользователя. Получаем что пользователь не может добавить одинаковые имена.

array('name', 'unique', 'criteria'=>array(
  'condition'=>'owner_id=:owner_id',
  'params'=>array(':owner_id'=>Yii::app()->user->id)),
),

10) Работа с внешними ключами

Значения полей from_id и to_id должны существовать как значения атрибута id в моделе User. В данном случае form_id и to_id - внешние ключи.

array('from_id, to_id', 'exists', 'className' => 'User', 'attributeName' => 'id'),
blog comments powered by Disqus
Наверх