@gto6120

Как в yii2 можно сделать renderPartial после успешного сохранения модели?

Есть вьюха _form.

<?php if(!isset($subscribed)) : ?>
        <?php $form = ActiveForm::begin([
            'id' => 'subscribe',
            'action' => Url::toRoute('/subscription'),
            'method' => 'post',
            'enableAjaxValidation' => true,
        ]); ?>
        <div class="input-field">
            <?= $form->field($model, 'email')->textInput(['placeholder' => $model->getAttributeLabel('email')])->label(false); ?>
        </div>
        <div class="text-center">
            <?= Html::submitButton('Подписаться'); ?>
        </div>
        <?php ActiveForm::end(); ?>
<?php else: ?>
     <div>Ура, Вы подписаны!</div>
<?php endif; ?>


Есть экшн контрллера Subscription, который валидирует форму, он же должен в случае успеха обновить саму _form.

public function actionIndex()
    {
        $model = new Model();

        if (Yii::$app->request->isAjax) {
            if ($model->load(Yii::$app->request->post()) && $model->save()) {
                return $this->renderPartial('_form', ['subscribed' => true]);
            } else {
                \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
                return ActiveForm::validate($model);
            }
        }

    }


При ошибках валидации все ОК, показываются, а при успешном save модели не происходит обновления _form. B консоли на вкладке network видно

<div>Ура, Вы подписаны!</div>

Но обновления не происходит.
  • Вопрос задан
  • 2677 просмотров
Решения вопроса 1
qonand
@qonand
Software Engineer
У Вас и не может произойти обновление формы - потому что Вы его не делаете на клиентской стороне.
Сейчас Вы:
1. Сохраняете модель
2. Рендерите _form
3. Отправляете результат рендеринга на клиент, но на клиенте Вы этот результат по всей видимости никак не обрабатываете и не отображаете.

Соответственно Вам нужно:
1. Либо писать JS скрипт который будет обрабатывать ответ от сервера и заменять форму на него. Только в этом случае не вижу смысла использовать renderPartial для вывода одной строки текста, т.к. этот функционал можно реализовать на уровне JS
2. Либо копать в сторону PJAX
3. Либо реализовать обработку данных, как написал slo_nik
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
slo_nik
@slo_nik Куратор тега Yii
Добрый вечер.
Если успешно отработал save(), делайте redirect(),а перед этим сформируйте flash-сообщение.
В виде, через виджет Alert, покажите это сообщение.
Ответ написан
Ваш ответ на вопрос

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

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