Задать вопрос

После создания формы Ajax не проходит валидация?

Добавляю форму при помощи Ajax но она не проходит валидацию на клиенте. Там присутствует форма но исходя из выбора пользователя часть формы меняется. Следующим образом отправляется ajax запрос указывается какой выбор пользователь сделал, меняется форма и тем же скриптом в случае получения ответа меняется часть формы собственно вот так записано в js

$('#deliveryForm .radio-tab input').change(function () {
            var datas = $(this).val();
            $.ajax({
                method: "POST",
                url: "/cart",
                data: 'delivery='+datas,
                success: function (data) {
                    $.pjax.reload({container: "#pjax-form-cart"});
                    $('#deliveryForm .radio-tabs .tab-pane').removeClass('active');
                    $('#deliveryForm .radio-tabs .tab-pane.delivery2').addClass('active');
                }
            })
    
        });


вот так в контролере обрабатываю выбор пользователя

public function actionIndex(){
          if(Yii::$app->request->isAjax &&isset($post['delivery']))
                $this->userCartChoice($post['delivery']);
                 $choice= UserCartChoice::find()->one();
           ...
    }
     private function userCartChoice($choise){
            $userChoise=UserCartChoice::find()->one();
            if(!$userChoise)
                $userChoise= new UserCartChoice();
            $userChoise->choice=$choise;
            $userChoise->save();
        }


ну и соответственно весь заменяемый блок

<?php Pjax::begin(['id' => 'pjax-form-cart']); ?>
        <div class="tab-content">
            <div class="tab-pane delivery1 <?= ($userChoice==0)?'active':''?> ">
                <?php  if($userChoice==0){ echo PickUp::widget(['form'=>$form]); } ?>
            </div>
            <div class="tab-pane delivery2 <?= ($userChoice==1)?'active':''?>">
                <?php  if($userChoice==1){ echo DeliveryPiter::widget(['form'=>$form]); } ?>
            </div>
        </div>
        <?php Pjax::end(); ?>


И когда я создаю форму она не валидируется. На клиенте. Если нажимаю кнопку отправить. Ошибки валидации показывается.
Я так понимаю надо инициализировать заново проверку. Вопрос что надо инициализировать
  • Вопрос задан
  • 445 просмотров
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • teamcoding
    TC200PY Разработка PHP веб-приложений на Yii2. Шаблон приложения advanced
    3 месяца
    Далее
  • Onskills
    PHP: базовый курс
    1 месяц
    Далее
  • FructCode
    Yii2 Фреймворк
    2 месяца
    Далее
Решения вопроса 1
Sergalas
@Sergalas Автор вопроса
Учусь
В общем я решил вопрос следующим образом
<?php $this->registerJs("
    $('#pjax-form-cart').on('pjax:end',function(){
        $('#deliveryForm .required input').on('blur',function(){
            var id= $(this).attr('id');
            $('#deliveryForm').yiiActiveForm('validateAttribute', id);
        })  
    });", yii\web\View::POS_READY); ?>

в каждой вьюхе виджета
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
proudmore
@proudmore
Я правильно вас понял, что вы решили вместо
<?php $form = ActiveForm::begin([
    'action'=>'cart/checkout', 
    'method'=>'post',
    'id'=>'deliveryForm',
    'enableAjaxValidation' => true
 ]) ?>


Решили в саму форму впихнуть Pjax-container, который перезагружает html внутри себя?
Ответ написан
slo_nik
@slo_nik Куратор тега Yii
Добрый день.
Это видео Вам поможет.
Pjax тут совсем не нужен.
Вам в параметрах надо указать, что нужна ajax валидация, сделать действие для этой валидации и указать адрес, по которому будет проходить валидация.
Приблизительно вот так:
$form = ActiveForm::begin([
      'id' => 'testForm',
      'enableAjaxValidation' => true,
      //'enableClientValidation' => false,
      'validationUrl' => ['dynamic/ajax-validation']
  ]);

// и действие в контролере
if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
    Yii::$app->response->format = Response::FORMAT_JSON;
    return ActiveForm::validate($model);
}
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы