/** * AJAX * Получает новые сообщения * Эта функция стоит как слушатель и вызывается каждые 10 секунд * Возвращаемые сообщения будут отсортировны от ранних до поздних * * REQUEST: * - from - int - идентификатор пользователя, от кого * - last_datetime - int - время от которого нужно получить сообщения * * @return string json array * [ * { * 'datetime' => int, * 'html' => string * }, ... * ] */ public function actionGet_new_messages() { // self::validateRequestJson([ // [['last_datetime', 'from'], 'required'], // [['last_datetime', 'from'], 'integer'], // ]); $last_datetime = self::getParam('last_datetime'); $items = ChatMessage::query(['user_id_from' => self::getParam('from'), 'user_id_to' => \Yii::$app->user->id])->andWhere(['>', 'datetime', $last_datetime])->orderBy(['datetime' => SORT_ASC])->all(); $new = []; foreach ($items as $item) { $new[] = ['datetime' => $item['datetime'], 'html' => $this->renderFile('@app/views/cabinet_chat/get_new_messages.php', ['message' => new ChatMessage($item), 'user' => User::find($item['user_id_from'])])]; } return self::jsonSuccess($new); }
/** * Показывает все чаты */ public function actionIndex() { return $this->render(['items' => ChatMessage::query()->select(['cap_chat_messages.user_id_from as id', 'max(cap_chat_messages.datetime) as datetime', 'cap_users.name_first', 'cap_users.name_last', 'cap_users.email', 'cap_users.avatar'])->groupBy('if (`cap_chat_messages`.`user_id_from` = 7, `cap_chat_messages`.`user_id_to`, `cap_chat_messages`.`user_id_from`)')->innerJoin('cap_users', 'cap_users.id = cap_chat_messages.user_id_from')->orderBy(['max(cap_chat_messages.datetime)' => SORT_DESC])->all()]); }