Программирование, веб-кодинг

Делаем свою валидацию полей в модели формы. Кастомные правила валидации

Кастомная функция для проверки, что хотя бы одно из полей email или phone посетитель заполнил

Делаем свою валидацию полей в модели формы. Кастомные правила валидации

Создадим свою проверку на заполнение полей в форме обратного звонка. Например, будут там будут 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'.