Yii: обновить виджет содержимого с помощью ajax

Я создал виджет уведомлений в фреймворке Yii, который вызывается на каждой странице и дает пользователю уведомления. Теперь я хотел бы обновлять эти уведомления автоматически каждые 10 секунд с помощью Ajax. Структура выглядит следующим образом:

<?php

class NotificationsWidget extends CWidget {

public function init(){

}
public function run() {

}

Каков наилучший способ сделать это? Я искал везде, но я не могу найти ответ. Может быть, я просто смотрю с неправильными ключевыми словами.. Если у кого-то есть другой (лучший) способ сделать это, пожалуйста! Единственное ограничение заключается в том, что он должен загружаться в макет интерфейса и обновляться как минимум каждые 10 секунд.

Большое спасибо:)

1 ответ

Решение

Вы настраиваете действие в своем контроллере и опрашиваете его каждые 10 секунд. Если есть обновление, оно вернет уведомление из частичного представления, если нет обновления, ничего не возвращается, это каркасная реализация, чтобы дать вам идею, запомните это не будет работать как есть.

В вашем файле макета

...
// Your normal layout content

<?php Yii::app()->clientScript->registerScript("poll_ajax_notifications",
 'function getNotification(){'.
   CHtml::ajax(array(
       'url'=>array("//notifications/update"),
       'dataType'=>'html',
       'type'=>'GET',
       'update'=>'#divcontainingNotificationWidget',
         )
     ) . '. }
   timer = setTimeout("getNotification()", 10000);
    ', CClientScript::POS_END);

В вашем контроллере уведомлений

class NotificationsController extends CController {
....
 public function actionUpdate(){
     $user = Yii::app()->user->id;
     // Your logic logic for finding notifications
     if($notificationPresent){ // or any validation to check whether to push data or not
       $this->renderPartial('_notificationWidget',array('widgetData'=>$widgetData)); // pass data required by widget here 
     }
     Yii::app()->end();
  }
 ... 
}

Наконец, создайте частичное представление в папке views/notifications под названием _notificationsWidget.phpПо вашему мнению разместите ваш виджет вызова

<?php 
  $this->widget('path.to.my.widget',array(
     //widget parameters
   ));
Другие вопросы по тегам