Validación del modelo de formulario Yii: se requiere cualquiera de los dos
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?
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.
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;
}
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()],
];
}
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.