По PJAX

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
FunStrike
Сообщения: 28
Зарегистрирован: 2018.07.23, 13:39

По PJAX

Сообщение FunStrike »

Здравствуйте,

Вопрос такой, работаю с модальными окнами и использую одно окно для разных целей. Загружаю контент так

Код: Выделить всё

modalWindow.find('.modal-body').load(data.url)
в php через renderAjax.

Но если в загруженной странице есть PJAX, то со второй загрузки (страницу полностью обновили, открыли модальное окно, закрыли и снова открыли), страница перестаёт корректно работать.
А именно, в странице есть ссылка, которая обновляет окно и передаёт id для загрузки данных

Код: Выделить всё

<a href="<?= Url::to([
	'/pm/duration/main',
	 'task_id' => $task->id,
	 'duration_id' => $duration->id
]) ?>">&#9658;</a>
Ну и форма ActiveForm.

В первый раз все корректно, все загружается, обновляется.
Во второй раз, запросы все уходят, все нормально. Но страница не обновляется, данные в форме не меняются, и при POST отправляется сразу два запроса, из-за чего две записи появляются.
Так происходит пока страницу полностью не обновить. Что делать не пойму.
Prooksius
Сообщения: 100
Зарегистрирован: 2019.01.17, 23:24

Re: По PJAX

Сообщение Prooksius »

Информации мало, но предположу, что при обновлении содержимого пиджака (Pjax) слетают скрипты, подключенные к элементам обновляемого блока. Надо видеть, конечно, весь код, чтобы сказать что-то определенное.
Возможно, нужно cодержимое пиджака выдавать не через rendrePartial, а через renderAjax
FunStrike
Сообщения: 28
Зарегистрирован: 2018.07.23, 13:39

Re: По PJAX

Сообщение FunStrike »

Prooksius писал(а): 2020.05.13, 20:54 Информации мало, но предположу, что при обновлении содержимого пиджака (Pjax) слетают скрипты, подключенные к элементам обновляемого блока. Надо видеть, конечно, весь код, чтобы сказать что-то определенное.
Возможно, нужно cодержимое пиджака выдавать не через rendrePartial, а через renderAjax
Окей понял, сейчас полее подробно.

Это то что передаётся контроллером, просто view файл. (лишнее убрал для читаемости)

Код: Выделить всё

<?php
Pjax::begin([
    'id' => 'duration-modal',
    'enablePushState' => false,
    'enableReplaceState' => false,
]);
?>
<?php foreach ($durations as $duration): ?>
    <div class="row list duration-list-item list-item">
        <div class="col-md-2">
	    <a href="<?= Url::to([ '/pm/duration/main', 
	    				'task_id' => $task->id, 
	    				'duration_id' => $duration->id]) ?>">&#9658;</a>
	</div>
    </div>
<?php endforeach; ?>
  <?php
    $form = ActiveForm::begin([
      'id' => 'duration-input-form',
      'method' => 'POST',
      'options' => ['data-pjax' => true],
      'action' => Url::to(['/pm/duration/main', 'task_id' => $task->id, 'duration_id' => $durationModel->id]),
    ]); ?>
    <div class="row">
        <div class="col-md-2">
          <?= $form->field($durationModel, 'days')->textInput() ?>
        </div>
        <div class="col-md-3">
          <?= $form->field($durationModel, 'date')->input('date') ?>
        </div>
        <div class="col-md-3">
          <?= $form->field($durationModel, 'schedule_type_id')->dropDownList($scheduleTypes) ?>
        </div>
        <div class="col-md-2">
            <label for="">&nbsp</label>
            <button type="reset"
                    class="btn gray_button no-margin">
              <?= Yii::t('app', 'new') ?>
            </button>
        </div>
        <div class="col-md-2">
            <label for="">&nbsp</label>
            <button type="submit"
                    class="btn gray_button no-margin">
              <?= Yii::t('app', 'add') ?>
            </button>
        </div>
    </div>
    <div class="row">
        <div class="col-md-6">
          <?= $form->field($durationModel, 'milestones')->textarea(['rows' => 2]) ?>
        </div>
        <div class="col-md-6">
          <?= $form->field($durationModel, 'deliverables')->textarea(['rows' => 2]) ?>
        </div>
    </div>
  <?php ActiveForm::end(); ?>
<?php Pjax::end(); ?>
И на странице есть кнопка которая вызывает эту функцию js.

Код: Выделить всё

    body.on('click', '.modal-window-open', function (e) {
        e.preventDefault();
        var data = $(this).data();
        $('.modal').modal('hide');
        modalWindow.find('.modal-body').empty();
        modalWindow.find('.modal-body').html('<p class="text-center"><img src="/img/loading_small.gif"/></p>');
        modalWindow.modal('show');
        modalWindow.find('.modal-body').load(data.url);
    });
И сам контроллер, который либо ищет PmDuration, либо создаёт новый.

Код: Выделить всё

    public function actionMain($task_id, $duration_id = null)
    {
      $task = PmTask::findById($task_id);
      $request = Yii::$app->request;
      if (isset($duration_id)) {
        $duration = PmDuration::findById($duration_id);
      } else {
        $duration = new PmDuration();
      }
      $duration->pm_task_id = $task_id;
      if ($request->isPost && $duration->load($request->post())) {
          $duration->save();
      }
      
      return $this->renderAjax('main', [
        'task' => $task,
        'durationId' => $duration_id
      ]);
    }
При первом открытий модального окна всегда создаётся новая модель, и там уже есть список уже созданных моделей на которые можно нажать и он уже вызывает обратно actionMain но уже с $duration_id . И получается что модель должна искаться. Это все работает. Но проблема в том, что в форму данные не идут.
Ответить