Доброе утро! У меня есть на сайте прямой эфир, и рядом чат. Люди в прямом эфире оставляют комментарии, и эти коменты через форму с помощью 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 работает