validaciones formularios dinamicos forms validation yii2

forms - formularios - Yii2: ¿cómo usar la función de validación personalizada para activeform?



validaciones en yii (11)

En el modelo de mi formulario, tengo una función de validación personalizada para un campo definido de esta manera

... class SignupForm extends Model { public function rules() { return [ [''birth_date'', ''checkDateFormat''], // other rules ]; } public function checkDateFormat($attribute, $params) { // no real check at the moment to be sure that the error is triggered $this->addError($attribute, Yii::t(''user'', ''You entered an invalid date format.'')); } }

El mensaje de error no aparece debajo del campo en la vista de formulario cuando pulso el botón Enviar, mientras que aparecen otras reglas como el correo electrónico y la contraseña requeridos.

Estoy trabajando en el formulario nativo de Signup, así que para estar seguro de que no se trata de un problema archivado, he establecido la regla

[''username'', ''checkDateFormat'']

y eliminó todas las demás reglas relacionadas con el campo de nombre de usuario, pero el mensaje no aparece ni para él.

Intenté pasar nada como parámetros a checkDateFormat , intenté pasar explícitamente el nombre del campo a addError()

$this->addError(''username'', ''....'');

pero nada aparece.

¿Cuál es la forma correcta de establecer una función de validación personalizada?


¿Estás por casualidad usando la validación del lado del cliente? Si lo hace, debe escribir una función de javascript que valide la entrada. Puedes ver cómo lo hacen aquí:

http://www.yiiframework.com/doc-2.0/guide-input-validation.html#conditional-validation

Otra solución sería desactivar la validación del cliente, usar la validación ajax, que también debería traer el error.

También asegúrese de no haber sobrescrito la plantilla de la entrada, es decir, asegúrese de que todavía tenga el {error} allí si lo sobrescribió.


Tu sintaxis sobre las reglas debería ser algo así como este hombre,

[[''birth_date''], ''checkDateFormat'']

no esta

[''birth_date'', ''checkDateFormat'']

Entonces, en tu caso, debería verse como a continuación

... class SignupForm extends Model { public function rules() { // Notice the different with your previous code here return [ [[''birth_date''], ''checkDateFormat''], // other rules ]; } public function checkDateFormat($attribute, $params) { // no real check at the moment to be sure that the error is triggered $this->addError($attribute, Yii::t(''user'', ''You entered an invalid date format.'')); } }


¿Leíste la documentación?

De acuerdo con los pasos de validación anteriores, un atributo se validará si y solo si es un atributo activo declarado en escenarios () y está asociado con una o varias reglas activas declaradas en rules ().

Entonces tu código debería verse así:

class SignupForm extends Model { public function rules() { return [ [''birth_date'', ''checkDateFormat''], // other rules ]; } public function scenarios() { $scenarios = [ ''some_scenario'' => [''birth_date''], ]; return array_merge(parent::scenarios(), $scenarios); } public function checkDateFormat($attribute, $params) { // no real check at the moment to be sure that the error is triggered $this->addError($attribute, Yii::t(''user'', ''You entered an invalid date format.'')); } }

Y en el escenario del conjunto de controladores, por ejemplo:

$signupForm = new SignupForm([''scenario'' => ''some_scenario'']);


Necesita desencadenar $model->validate() algún lado si se está extendiendo desde el modelo de clase.


Necesita renderizar el modelo desde el controlador. Sin inicializar el modelo a la vista. Y en el controlador necesita llamar a la función de validación


Intente forzar la validación en el campo vacío

[''birth_date'', ''checkDateFormat'', ''skipOnEmpty'' => false, ''skipOnError'' => false],

Además, asegúrese de no asignar id a su campo de fecha de birth_date en su vista.

Si tienes id para tu birth_date , debes especificar los selectors

<?= $form->field($model, ''birth_date'', [''selectors'' => [''input'' => ''#myBirthDate'']])->textInput([''id'' => ''myBirthDate'']) ?>


¿Estás seguro de que el primer parámetro de addError no debería ser así?

$this->addError(**''attribute''**, Yii::t(''user'', ''You entered an invalid date format.''));


Tuve un problema en común

En tu función de validación:

public function checkDateFormat($attribute, $params) { // no real check at the moment to be sure that the error is triggered $this->addError($attribute, Yii::t(''user'', ''You entered an invalid date format.'')); }

$ params no tiene ningún valor en absoluto. En realidad siempre es igual a Nulo. Debes verificar el valor de tu atributo en la función:

public function checkDateFormat($attribute, $params) { if($this->birth_date == False) { $this->addError($attribute, Yii::t(''user'', ''You entered an invalid date format.'')); } }

así es como funcionó para mí.


Me tropecé con esto cuando uso el generador CRUD. La función actionCreate () generada no incluye una llamada de validación de modelo para que los validadores personalizados nunca se llamen. Además, _form no incluye el resumen de errores.

Por lo tanto, agregue el resumen de error a _form.

<?= $form->errorSummary($model); ?>

... y agregue la llamada de validación - $ model-> validate () - a la acción del controlador

public function actionCreate() { $model = new YourModel(); if ($model->load(Yii::$app->request->post()) && $model->validate()) {...


Para realizar validaciones personalizadas en yii 2, puede escribir funciones personalizadas en el modelo y asignar esa función en la regla. por ej. Tengo que aplicar criterios de password en el campo de password luego escribiré así en el modelo.

public function rules() { return [ [''new_password'',''passwordCriteria''], ]; } public function passwordCriteria() { if(!empty($this->new_password)){ if(strlen($this->new_password)<8){ $this->addError(''new_password'',''Password must contains eight letters one digit and one character.''); } else{ if(!preg_match(''/[0-9]/'',$this->new_password)){ $this->addError(''new_password'',''Password must contain one digit.''); } if(!preg_match(''/[a-zA-Z]/'', $this->new_password)){ $this->addError(''new_password'',''Password must contain one character.''); } } } }

Referencias: - validación de formulario en yii 2


Si no usa escenarios para su modelo, debe marcar su atributo como ''seguro'':

[''birth_date'',''safe''], [''birth_date'', ''checkDateFormat''],

Y, por otro lado, puede usar esto para la validación de fecha:

[''birth_date'',''safe''], [[''birth_date''],''date'', ''format''=>''php:Y-m-d''],

Puede cambiar el formato como lo desee.