@kanly

Как отображать комментарии без обновлении?

Доброе утро! У меня есть на сайте прямой эфир, и рядом чат. Люди в прямом эфире оставляют комментарии, и эти коменты через форму с помощью ajax отправляю без обновлении, и сразу отображаются тоже без обновлении. Но это только у того кто отправляет, а у остальных кто сидят на том же странице-чате не отображается комментарий других без обновлении, только у того кто отправляет. Надо чтобы комментарии у других тоже отображались без обновлении страницы. Надеюсь понятно объяснил) Как это реализовать? Какие способы есть?

Я щас покажу код контроллера и формы:
public function actionIndex()
{
  $form = new AjaxCommentForm();
  if(Yii::$app->request->isAjax){
    Yii::$app->response->format = Response::FORMAT_JSON;
    if($form->load(Yii::$app->request->post()) && $form->validate()){
      $commentModel = new Comment();
      $commentModel->comment = $form->comment;
      if ($commentModel->save()) {
        return $data = [
          'success' => true,
          'comment' => $form->comment,
        ];
      }
    }
  }
 
  return $this->render('index', [
    'model' => $form,
    'comments' => Comment::getComments()
  ]);


<?php $form = ActiveForm::begin([
  'enableClientValidation' => true,
  'enableAjaxValidation'   => false,
  'action' => Url::to(['site/index']),
  'method' => 'post',
  'options' => ['id' => 'form']
]) ?>
<?= $form->field($model, 'comment')->textarea(['rows' => 5]); ?>
<?= Html::submitButton("Submit", ['class' => "btn btn-default"]); ?>
<?php ActiveForm::end() ?>
<div id="process">
  <img src="/img/loading.gif" alt="Loading">
</div>
<h2>Comments</h2>
<div id="comments">
  <?
  /**
   * @var $comments
   * @var $item \frontend\models\Comment
   */
  foreach ($comments as $item):
  ?>
  <div class="comment"><?= $item->comment ?></div>
  <? endforeach; ?>
</div>
<?php
$js = <<<JS
$('#form').on('beforeSubmit', function(){        
  var form = $(this),
    data = $(this).serialize();
  $.ajax({
    url: form.attr("action"),
    type: form.attr("method"),
    data: data,
    beforeSend: function(){
      $('#process').fadeIn();
    },
    success: function(data){
      form[0].reset();
      $("#comments").append('<div class="comment">'+ data.comment +'</div>');
      $('#process').fadeOut();
    },
    error: function(){
      $('#process').fadeOut();
      alert('Error!');
    }
  });
  return false;
}).on('submit', function(e){
  e.preventDefault();
});
JS;
$this->registerJs($js);
?>


Модель:
class Comment extends ActiveRecord
{
  public static function tableName()
  {
    return '{{%comment}}';
  }
 
  public static function getComments()
  {
    return self::find()->orderBy(['id' => SORT_DESC])->all();
  }
}


и еще у мя сортировка DESC тоже после обновлении работает, сначала комменты снизу появляются без перезагрузки, а после обновление страницы DESC работает
  • Вопрос задан
  • 98 просмотров
Пригласить эксперта
Ответы на вопрос 1
@abi7project
Самое простое решение - проверять наличие новых комментов делая запросы ajax через setInterval
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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