Mensagem de Yiiframework pop-up

Ele lá!

Se tiver uma pergunta relacionada a dois problemas diferentes que atualmente tenho em um aplicativo no qual estou trabalhando.

Problema 1: – Existe um sistema de mensagens. Os usuários podem se enviar mensagens. Gostaria de aparecer em tempo real quando o usuário receber uma nova mensagem e não estiver na página da checkbox de input.

Problema 2: – Gostaria de criar um sistema básico de realização, uma das conquistas poderia (por exemplo) ser: “Receber uma mensagem”.

Agora, penso que ambas as funcionalidades podem ser alcançadas da mesma forma. Qualquer um de vocês tem alguma experiência com este tipo de comunicação em tempo real? Eu realmente não tenho ideia de onde começar. Eu realmente adoraria se não fosse pesado.

Muito obrigado.

Aqui está um boilerplate que você pode usar para polling longo (usando jQuery e Yii):

Lado do servidor:

class MessagesController extends CController { public function actionPoll( $sincePk, $userPk ) { while (true) { $messages = Message::model()->findAll([ 'condition' => '`t`.`userId` = :userPk AND `t`.`id` > :sincePk', 'order' => '`t`.`id` ASC', 'params' => [ ':userPk' => (int)$userPk, ':sincePk' => (int)$sincePk ], ]); if ($messages) { header('Content-Type: application/json; charset=utf-8'); echo json_encode(array_map(function($message){ return array( 'pk' => $message->primaryKey, 'from' => $message->from, 'text' => $message->text, /* and whatever more information you want to send */ ); }, $messages)); } sleep(1); } } } 

Cliente:

 < ?php $userPk = 1; $lastMessage = Messages::model()->findByAttributes([ 'userId' => $userId ], [ 'order' => 'id ASC' ]); $lastPk = $lastMessage ? $lastMessage->primaryKey : 0; ?> var poll = function( sincePk ) { $.get('/messages/poll?sincePk='+sincePk+'&userPk=< ?=$userPk?>').then(function(data) { // the request ended, parse messages and poll again for (var i = 0;i < data.length;i++) alert(data[i].from+': '+data[i].text); poll(data ? data[i].pk : sincePk); }, function(){ // a HTTP error occurred (probable a timeout), just repoll poll(sincePk); }); } poll(); 

Lembre-se de implementar algum tipo de autenticação para evitar que os usuários lêem mensagens de cada um.