Yii表单模型验证-需要其中一个

gcmastyq  于 2022-11-09  发布在  其他
关注(0)|答案(9)|浏览(142)

我有两个字段的形式(forgotpassword形式)用户名和电子邮件ID。用户应该输入其中之一。我的意思是检索密码用户可以输入用户名或电子邮件ID。有人可以指出我的验证规则吗?
有没有我可以使用的内置规则?
(如果已经讨论过或者我错过了,请表示抱歉)
谢谢你的帮助
此致
基兰

nfs0ujit

nfs0ujit1#

我今天也在尝试解决同样的问题。我得到的是下面的代码。

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;
}

一般的想法是将“required”验证移到自定义的my_required()方法中,该方法可以检查是否有任何字段被填充。
我看到这篇文章是从2011年,但我找不到任何其他的解决方案。我希望它能为您或其他在未来的工作。
请慢用

neskvpey

neskvpey2#

类似这样的东西更通用,可以重用。

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;
}
q0qdq0h2

q0qdq0h23#

一二

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()],
    ];
}
dffbzjpn

dffbzjpn4#

我不认为有一个预定义的规则,将工作在这种情况下,但它会很容易定义自己的用户名和密码字段的规则是“如果空($username . $password){ return error }”-您可能需要检查的最小长度或其他字段级别的要求。

hiz5n14c

hiz5n14c5#

这对我很有效:

['clientGroupId', 'required', 'when' => function($model) {
                return empty($model->clientId);
            }, 'message' => 'Client group or client selection is required'],
zpqajqem

zpqajqem6#

您可以使用模型类内的私有属性来防止两次显示错误(不要将错误分配给模型的属性,而只添加到模型而不指定它):

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;
    }
}
9gm1akwq

9gm1akwq7#

别忘了“skipOnEmpty”属性。它花了我几个小时。

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;
}
axkjgtzd

axkjgtzd8#

益一
当然,它可以优化,但可能会帮助某些人

class OneOfThemRequiredValidator extends \CValidator
{
    public function validateAttribute($object, $attribute)
    {
        $all_empty = true;
        foreach($this->attributes as $_attribute) {
            if (!$this->isEmpty($object->{$_attribute})) {
                $all_empty = false;
                break;
            }
        }

        if ($all_empty) {
            $message = "Either of the following attributes are required: ";
            $attributes_labels = array_map(function($a) use ($object) {
                    return $object->getAttributeLabel($a);
                }, $this->attributes);
            $this->addError($object, $_attribute, $message . implode(',', 
            $attributes_labels));
        }
    }
}
w1e3prcc

w1e3prcc9#

public function rules(): array
{
    return [
        [
            'id',   // attribute for error
            'requiredOneOf', // validator func
            'id',   // to params array
            'name', // to params array
        ],
    ];
}

public function requiredOneOf($attribute, $params): void
{
    $arr = array_filter($params, function ($key) {
        return isset($this->$key);
    });

    if (empty($arr)) {
        $this->addError(
            $attribute,
            Yii::t('yii', 'Required one of: [{attributes}]', [
                '{attributes}' => implode(', ', $params),
            ])
        );
    }
}

相关问题