@frmax
человек

Как заставить ActiveForm отображать validate?

Добрый день,

Народ делаю аякс форму из простой работающей формы.
Без аякс все работает так как надо, как только делаю аякс форму перестает работать валидация.

Зама форма
$form = ActiveForm::begin([
    'id' => $model->formName(),
    'enableAjaxValidation' => true,
    'options' => [
        'enctype' => 'multipart/form-data',
        'class' => false,
    ],
    'errorCssClass' => 'hasError',
]);


Контролеер
public function actionTest(){
             $model = new MyPersonalForm('', $user,  Yii::$app->request->post('myPersonals'));

        if(Yii::$app->request->isPost && $model->validate()){
            if($model->saveMyPersonal()){

            }
        }
            return $this->renderAjax('test', [
                'model' => $model,
            ]);
        
    }


Проверяю в ответе приходит, отвалидируемая форма, как мне ее отобразить в аякс форме? Спасибо
Проверяю без аякса и попапа все работает как часы.

Ошибка валидации присваивается компоненту в MyPersonalForm()
public function validate($attributes=null, $clearErrors=true){
        $return = parent::validate($attributes,$clearErrors);
        $skip_activity =false;

        foreach($this->user_personal as $ui)
        {
            if(!$ui->validate())
            {
                $this->addErrors($ui->getErrors());
                $return = false;
            }

            if($ui->is_active){
                $skip_activity =true;
            }
        }

        if(!$skip_activity){
            foreach($this->user_personal as $ui)
                $ui->addError('is_active','At least one activity must be selected or None.');
            $return = false;
        }

        return $return;
    }
  • Вопрос задан
  • 361 просмотр
Пригласить эксперта
Ответы на вопрос 2
@Pogran
Я вот таким образом всегда делаю.

Создаю в компонентах ядра trait(его я использую везде где есть ajax валидация)
trait AjaxValidationTrait
{
    /**
     * Performs ajax validation.
     *
     * @param Model $model
     *
     * @throws \yii\base\ExitException
     */
    protected function performAjaxValidation(Model $model)
    {
        if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
            Yii::$app->response->format = Response::FORMAT_JSON;
            echo json_encode(ActiveForm::validate($model));
            Yii::$app->end();
        }
    }
}


Затем в нужном контроллере подключаю данный trait и в нужном action загружаю в него модель.
class DefaultController extends BaseAdminController
{
    use AjaxValidationTrait;

   public function actionCreate()
    {
        $model = new Point();
        $this->performAjaxValidation($model);
       if ($model->validate()) {
        ....
        } else {
             return $this->render('create', [
                'model' => $model]
             );
        }
    }
}


Затем в самой форме отключаю клиентскую валидацию и подключаю ajax валидацию
<?php $form = ActiveForm::begin([
    'enableAjaxValidation'   => true,
    'enableClientValidation' => false,
]); ?>
Ответ написан
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
1. Вы проверьте идет ли ajax запрос валидации и что он возвращает. Зачем копать код, когда в debug наверняка есть конкретная ошибка. Возможно маршрутизация не верна.
2. Судя по Вашем коду в контроллере У Вас не возвращается результат валидации. Чего Вы ожидаете? У вас приходит запрос, валидируется и сохраняется в случае успеха или возвращает рендер некоего view. А должно валидировать и возвращать например:
echo json_encode(ActiveForm::validate($model));
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы