@varenik163

Комментарии yii2 и pjax. Почему не обновляет контенер?

Идея в том, что бы комментарии добавлялись без перезагрузки страницы. Обернул форму в pjax, вывод тоже. При клике по ссылке внизу(Reply) выезжает склонированная форма(та же что сверху). При отправке комментария просто убирается форма почему-то. Внизу пример контроллера и вью. Ребят, подскажите,что не так?
Это вью
<?php Pjax::begin([ //форма отправки
        'id' => 'new_com',
        'enablePushState' => false,
        'timeout' => 5000,
        'linkSelector' => '.btn-custom'
    ]) ?>

    <?php $form2 = ActiveForm::begin(['options' => ['data-pjax' => true,'class' => 'comm_tree']]); ?>

    <?= $form2->field($comment, 'message')->textarea(['rows' => 3]) ?>
    <?= $form2->field($comment, 'parent_id')->hiddenInput()->label(false) ?>

    <div class="form-group">
        <?= Html::submitButton('Добавить комментарий', ['class' => 'btn btn-success']) ?>
    </div>
    <?php ActiveForm::end(); ?>
    <?php Pjax::end() ?>


    <?php Pjax::begin([ 'id' => 'task_comments'])  //вывод дерева?>
    <?php $is_child = ''; $lavel = 0;
    if($commentsTree):
    foreach ($commentsTree as $cmt):
        if(!is_object($cmt)){
            var_dump($cmt);
            continue;
        }
        if($cmt->parent_id) {
            $is_child = 'is_child';
            $lavel++;
        }else  $is_child = '';
        $created_at = Yii::$app->formatter->asDatetime($cmt->created_at, "php:d.m.Y")
        ?>
        <div class="comment <?= $is_child ?>" style="margin-left: <?= $cmt->lavel*20 ?>px">
            <a name="comment<?=$cmt->id?>"></a>
            <p><span class="data-grey"><?=$created_at?></span><strong><?= $cmt->user->username ?></strong></p>
            <p><?= str_replace("\n", '<br>', $cmt->comment) ?></p>
            <p><?=Html::a(Yii::t('app', 'Reply'), ['task/view'],['class' => 'com-reply', 'data-parent_id' => $cmt->id])?></p>
            <hr>
        </div>
    <?php endforeach; endif;?>
    <?php Pjax::end() ?>


Это контроллер
public function actionView($id)
    {
        \Yii::$app->user->can('learnerAccessTheTask', ['id' => $id]);

        $task = Task::findOne(['id' => $id]);

        $model = UserTask::findOne(['task_id' => $id, 'user_id' => \Yii::$app->user->id]);


        if (!$model){
            $model = new UserTask([
                'status' => UserTask::STATUS_NEW,
                'task_id' => $task->id,
            ]);
            $model->setScenario(UserTask::SCENARIO_INITIAL);
            
            $model->save();

        }

        $commentsTree = CommentsTree::makeTree('UserTaskComment',$model->id,0,0);
        
        $comment = new CommentForm([
            'modelId' => $model->id
        ]);

        if ($model->load(\Yii::$app->request->post()) && $model->complete(\Yii::$app->request->post('status'))) {

            \Yii::$app->session->setFlash('success', 'Сохранено');
            
            
            
            return $this->redirect(['view', 'id' => $model->task_id]);
        }
        
        if ($comment->load(\Yii::$app->request->post()) && $comment->addTaskComment()) {

            \Yii::$app->session->setFlash('success', 'Комментарий добавлен');
            //здесь был рефреш
        }

        return $this->render('view', [
            'task' => $task,
            'model' => $model,
            'comment' => $comment,
            'commentsTree' => $commentsTree,
        ]);
    }


Это JS

$("#new_com").on("pjax:end", function() {
        $.pjax.reload({container:"#task_comments"});
    });
  • Вопрос задан
  • 551 просмотр
Пригласить эксперта
Ответы на вопрос 1
qonand
@qonand
Software Engineer
Честно говоря Вы не совсем правильно реализовываете задачу, с точки зрения архитектуры и чистоты кода. У Вас есть список комментариев и форма - так разделите функционал, не нужно делать все в одном экшене. Мало того что людям которые будут работать с проектом после Вас придется в этой куче кода копаться, так и Вы сами даже на текущем этапе нормально дебажить этот код не можете. Сделайте отдельный экшен отвечающий за отображение списка комментариев, и отдельный экшен принимающий данные с формы и сохраняющих их. И просто дергайте последовательно экшены. По коду который сейчас мне сложно сказать в чем ошибка, но судя по нашим обсуждениям в комментариях могу сделать вывод что проблема в сохранении нового коммента - либо он вообще не сохраняется, либо сохраняется с некорректными данными. Попробуйте пошагово продебажить сохранения.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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