without validateonsubmit form errorsummary activeform active forms validation model yii

forms - validateonsubmit - yii2 basic



ValidaciĆ³n del modelo de formulario Yii: se requiere uno (7)

Tengo dos campos en el formulario (contraseña olvidada) nombre de usuario y dirección de correo electrónico. El usuario debe ingresar uno de ellos. Me refiero a recuperar la contraseña de usuario que puede ingresar el nombre de usuario o la identificación de correo electrónico. ¿Podría alguien señalarme la regla de validación para esto?

¿Hay alguna regla incorporada que pueda usar?

(Lo siento si ya se discutió o si me perdí)

Gracias por tu ayuda

Saludos

Kiran


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

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


Esto funciona para mí:

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


Intentaba resolver el mismo problema hoy. Lo que tengo es el código a continuación.

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 algún campo está lleno.

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

Disfrutar.


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


Puede usar propiedad privada dentro de la clase de modelo para evitar errores de visualización dos veces (no asigne un error al atributo del modelo, sino solo agréguelo al modelo sin especificarlo):

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


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 te olvides del atributo "skipOnEmpty" attr. Me costó algunas horas.

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