Проверка модели формы Yii - требуется либо - PullRequest
11 голосов
/ 16 августа 2011

У меня есть два поля в форме (забыл пароль) имя пользователя и адрес электронной почты. Пользователь должен ввести один из них. Я имею в виду, чтобы восстановить пароль, пользователь может ввести имя пользователя или идентификатор электронной почты. Может ли кто-нибудь указать мне правило проверки для этого?

Есть ли какое-нибудь встроенное правило, которое я могу использовать?

(Извините, если это уже обсуждалось или я пропустил)

Спасибо за вашу помощь

Привет

Киран

Ответы [ 7 ]

21 голосов
/ 25 июня 2012

Я пытался решить ту же проблему сегодня. У меня есть код ниже.

public function rules()
{
    return array(
        // array('username, email', 'required'), // Remove these fields from required!!
        array('email', 'email'),
        array('username, email', 'my_equired'), // do it below any validation of username and email field
    );
}

public function my_required($attribute_name, $params)
{
    if (empty($this->username)
            && empty($this->email)
    ) {
        $this->addError($attribute_name, Yii::t('user', 'At least 1 of the field must be filled up properly'));

        return false;
    }

    return true;
}

Общая идея состоит в том, чтобы переместить 'обязательную' проверку в пользовательский метод my_required (), который может проверять, заполнено ли какое-либо из полей.

Я вижу, что это сообщение 2011 года, но я не смог найти для него другого решения. Я надеюсь, что это сработает для вас или других в будущем.

Наслаждайтесь.

16 голосов
/ 29 сентября 2013

Что-то вроде этого немного более общее и может быть использовано повторно.

public function rules() {
    return array(
        array('username','either','other'=>'email'),
    );
}
public function either($attribute_name, $params)
{
    $field1 = $this->getAttributeLabel($attribute_name);
    $field2 = $this->getAttributeLabel($params['other']);
    if (empty($this->$attribute_name) && empty($this->$params['other'])) {
        $this->addError($attribute_name, Yii::t('user', "either {$field1} or {$field2} is required."));
        return false;
    }
    return true;
}
5 голосов
/ 22 марта 2016

Yii2

namespace common\components;

use yii\validators\Validator;

class EitherValidator extends Validator
{
    /**
     * @inheritdoc
     */
    public function validateAttributes($model, $attributes = null)
    {
        $labels = [];
        $values = [];
        $attributes = $this->attributes;
        foreach($attributes as $attribute) {
            $labels[] = $model->getAttributeLabel($attribute);
            if(!empty($model->$attribute)) {
                $values[] = $model->$attribute;
            }
        }

        if (empty($values)) {
            $labels = '«' . implode('» or «', $labels) . '»';
            foreach($attributes as $attribute) {
                $this->addError($model, $attribute, "Fill {$labels}.");
            }
            return false;
        }
        return true;
    }
}

в модели:

public function rules()
{
    return [
        [['attribute1', 'attribute2', 'attribute3', ...], EitherValidator::className()],
    ];
}
2 голосов
/ 17 августа 2011

Я не думаю, что есть предопределенное правило, которое будет работать в этом случае, но было бы достаточно просто определить свой собственный , где для полей имени пользователя и пароля правило было бы "если пусто ($ username. $ password) {return error} "- возможно, вы захотите проверить минимальную длину или другие требования на уровне поля.

1 голос
/ 23 августа 2017

Это работает для меня:

            ['clientGroupId', 'required', 'when' => function($model) {
                return empty($model->clientId);
            }, 'message' => 'Client group or client selection is required'],
0 голосов
/ 16 июня 2016

не забудьте "skipOnEmpty" attr.Это стоило мне нескольких часов.

 protected function customRules()
{
    return [
              [['name', 'surname', 'phone'], 'compositeRequired', 'skipOnEmpty' => false,],
    ];
}

public function compositeRequired($attribute_name, $params)
{
    if (empty($this->name)
        && empty($this->surname)
        && empty($this->phone)
    ) {
        $this->addError($attribute_name, Yii::t('error', 'At least 1 of the field must be filled up properly'));

        return false;
    }

    return true;
}
0 голосов
/ 10 мая 2016

Вы можете использовать закрытое свойство внутри класса модели для предотвращения ошибок отображения дважды (не назначайте ошибку атрибуту модели, а только добавляйте к модели, не указывая ее):

class CustomModel extends CFormModel
{
    public $username;
    public $email;

    private $_addOtherOneOfTwoValidationError = true;

    public function rules()
    {
        return array(
            array('username, email', 'requiredOneOfTwo'),
        );
    }

    public function requiredOneOfTwo($attribute, $params)
    {
        if(empty($this->username) && empty($this->email))
        {
            // if error is not already added to model, add it!
            if($this->_addOtherOneOfTwoValidationError)
            {
                $this->addErrors(array('Please enter your username or emailId.'));

                // after first error adding, make error addition impossible
                $this->_addOtherOneOfTwoValidationError = false;
            }

            return false;
        }

        return true;
    }
}
...