Validación del modelo de formulario Yii: se requiere cualquiera de los dos

Resuelto Bujji asked hace 54 años • 9 respuestas

Tengo dos campos en el formulario (formulario de contraseña olvidada): nombre de usuario e identificación de correo electrónico. El usuario debe ingresar uno de ellos. Me refiero a recuperar la contraseña, el usuario puede ingresar el nombre de usuario o la identificación de correo electrónico. ¿Alguien podría indicarme la regla de validación para esto?

¿Existe alguna regla incorporada que pueda usar?

Bujji avatar Jan 01 '70 08:01 Bujji
Aceptado

Estaba tratando de resolver el mismo problema hoy. Lo que tengo es el siguiente código.

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

La idea general es mover la validación 'requerida' al método personalizado my_required() que puede verificar si alguno de los campos está completo.

Veo que esta publicación es de 2011, sin embargo, no pude encontrar ninguna otra solución. Espero que funcione para usted o para otros en el futuro.

Disfrutar.

Mario Bross avatar Jun 25 '2012 12:06 Mario Bross

Algo como esto es un poco más genérico y se puede reutilizar.

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;
}
Damian Dennis avatar Sep 29 '2013 01:09 Damian Dennis

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

en modelo:

public function rules()
{
    return [
        [['attribute1', 'attribute2', 'attribute3', ...], EitherValidator::className()],
    ];
}
AndreyTalanin avatar Mar 22 '2016 04:03 AndreyTalanin

No creo que exista una regla predefinida que funcione en ese caso, pero sería bastante fácil definir la suya propia donde para los campos de nombre de usuario y contraseña la regla era "si está vacía ($nombre de usuario. $contraseña) { error de retorno} " - Es posible que desees comprobar también la longitud mínima u otros requisitos a nivel de campo.

ldg avatar Aug 16 '2011 22:08 ldg