Validación de clientes personalizados Yii2 con renderizado ajax en modal

Tengo un modelo con un método de validación personalizado. Para las pruebas, siempre devuelve un mensaje de error.

public function rules() { return [ ... ['staff_ids', 'each', 'rule' => ['string']], [['staff_ids'], 'validateStaffIds'], ... ]; } public function validateStaffIds($attribute, $params, $validator) { $this->addError($attribute, 'There is an error in the staff ids'); } 

En view.php es el elemento modal

 

Url::to(['ensemble/add', 'id' => $model->id]), 'title' => 'Adding New Ensemble Staff', 'class' => 'showModalButton btn btn-primary']); ?>

[ 'label' => 'x', ], 'headerOptions' => ['id' => 'modalHeader'], 'id' => 'modal', 'size' => 'modal-lg', ]); echo "
"; Modal::end(); ?>

El código js que dispara todo …

 $(function(){ $(document).on('click', '.showModalButton', function(){ if ($('#modal').data('bs.modal').isShown) { $('#modal').find('#modalContent') .load($(this).attr('value')); } else { //if modal isn't open; open it and load content $('#modal').modal('show') .find('#modalContent') .load($(this).attr('value')); } //dynamiclly set the header for the modal ... }); }); 

Y el controlador de ensemble que maneja la acción de add

 public function actionAdd($id) { $model = $this->findModel($id); // in the post ( 'ensembleStaff_ids' => [0 => '2']); where the id actually is staff_id if ($model->load(Yii::$app->request->post()) && $model->save()) { return $this->redirect(['view', 'id' => $id]); } else { return $this->renderAjax('add', [ 'model' => $model, ]); } } 

Y la forma que inyecta el js en el modelo ( Url::to(['ensemble/add', 'id' => $model->id]), )

  'add-theater-stuff-form']); ?> field($model, 'staff_ids')->widget(Select2::className(), [ 'model' => $model, 'data' => ArrayHelper::map(app\models\TheaterStaff::find()->where(['theater_id' => $model->theater_id])->all(), 'staff_id', 'staff.fullname'), 'options' => [ 'multiple' => true, 'prompt' => 'Ensemble Staff', ], 'pluginOptions' => [ 'tags' => true ] ]); ?> 
'btn btn-primary']) ?>

Al hacer clic en el botón Add Ensemble Staff del conjunto funciona bien y aparece la ventana modal. La forma en sí funciona bien hasta el momento; también la validación por defecto funciona. Incluso se invoca la validación personalizada, pero el retorno $ this-> renderAjax (…) ya no se carga en la ventana modal; es por separado

Una imagen que muestra el modal cargado, el resultado después del envío y un modal con validación por defecto.

Encontré un problema similar aquí . Pero agregar una identificación al formulario no resuelve el problema. Entonces, ¿cómo obtener la validación predeterminada que se muestra correctamente en la ventana modal? ¿Alguien tiene una pista?

Solución

Gracias por la respuesta. Para mí, la solución fue: habilitar ajax en la forma

  'add-ensemble-stuff-form', 'enableAjaxValidation' => true]); ?> 

Y para agregar la siguiente lógica en el controlador

 public function actionAdd($id) { $model = $this->findModel($id); if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) { Yii::$app->response->format = Response::FORMAT_JSON; return ActiveForm::validate($model); } else { // in the post ( 'ensembleStaff_ids' => [0 => '2']); where the id actually is staff_id if ($model->load(Yii::$app->request->post()) && $model->save()) { return $this->redirect(['view', 'id' => $id]); } else { return $this->renderAjax('add', [ 'model' => $model, ]); } } } 

 if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) { Yii::$app->response->format = Response::FORMAT_JSON; return ActiveForm::validate($model); }else{/* your code */} 

agregue esto en el use yii\web\Response controlador use yii\web\Response