
Создадим свою проверку на заполнение полей в форме обратного звонка. Например, будут там будут 2 поля - email и телефон - и надо, чтобы пользователь заполнил хотя бы одно из них, какое захочет, чтобы с ним потом можно было связаться. Заполнять оба поля необязательно.
Для этого создадим кастомную функцию для проверки, что хотя бы одно из полей email или phone посетитель заполнил.
в models/SignupForm.php пишем
<?php namespace app\models; use Yii; use yii\base\Model; use yii\helpers\Security; class SignupForm extends Model { public $name; public $phone; public $email; /** * Здесь мы указываем правила валидации - они могут быть как стандартными, так и кастомными */ public function rules() { return [ ['name', 'required'], //[['phone','email'], 'safe'], [['email'], 'email'], [['phone', 'email'], 'validatePhoneEmailEmpty', 'skipOnEmpty'=> false], ]; } public function attributeLabels() { return [ 'name' => 'Ваше имя', 'email' => 'Email', 'phone' => 'Телефон', ]; } /* Кастомная функция для проверки, что хотя бы одно из полей email или phone посетитель заполнил */ public function validatePhoneEmailEmpty() { if(empty($this->phone) && empty($this->email)) { $errorMsg= 'Укажите ваш email или телефон'; $this->addError('phone',$errorMsg); $this->addError('email',$errorMsg); } if(!empty($this->phone) && (strlen($this->phone)<7)) { $errorMsg= 'Слишком мало цифр в номере телефона'; $this->addError('phone',$errorMsg); } } ...
В методе rules() укажем свой валидатор
validatePhoneEmailEmpty
. Обратите внимание, что мы подключили его с параметром 'skipOnEmpty'=> false
. Это сделано, потому что в Yii2 по умолчанию для всех правил валидации установлен 'skipOnEmpty'=> true, отчего пустые поля пропускаются и не валидируются проверкой на пустое значение. Не зная этой вещи, долго не понимал, почему мой валидатор не срабатывал вообще, пока наконец, не выключил этот параметр.
Если нужно проверять значения на существование в базе данных, то использовать ExistValidator.
Ниже пишем свою функцию validatePhoneEmailEmpty(), в которой выполняется необходимая проверка. Замечу, что на поля email и phone по отдельности не устанавливали в rules() правило 'required'.
17 июня 2016, Программирование, веб-кодинг / Метки: валидация skipOnEmpty

