В этой статье я расскажу про систему диалогов на php, которую я создал на одном из сервисов компании, где я работаю.

Изначально, хотелось получить систему, которая бы повторяла функционал диалоговой системы контакта. Требования были следующие: скрипт не должен требовать установки на сервер дополнительных средств (поддержка long-pool запросов, phpdemon, поддержки websocket и т.п), позволять создавать диалог неограниченного числа пользователей и работать на обычном ajax-post сообщении с сайтом.

Пощупайте Demo

Приступим

Для начала создадим структуру БД

Система диалогов на php как в контакте

Вот дамп

Когда один пользователь хочет написать сообщение другому, скрипт ищет подходящий диалог. Диалог, является подходящим, если в нем участвую те же лица. Т.е. если мы раньше писали этому человеку, и никого больше не подключали к этому диалогу, то он подходит. Если же подходящего диалога нет, то создаем новый. Диалог и пользователь связаны таблицей user_to_dialog. Когда пользователь посылает сообщение, оно записывается в табличку message. А информация о том, кому оно предназначено лежит в табличке message_to_user. По сути, эта таблица избыточна, так как у нас уже есть информация кому показывать сообщение исходя из данных user_to_dialog. Но мне было так удобно. Можете это изменить в своем форке.

Перейдем к коду.

Структура класса dialog


<?php
class dialog{
	public $utime = 0; // время по часовому поясу пользователя в UNIXTIME
	public $userid = 0;// id пользователя
	public $err = '';
	public $hash = ''; // hash диалога
	public $id = '';
	private $user_id_field = 'IDClient'; // название поля с id пользователя, необходимо для подключения 
	//к Вашему скрипту с уже созданной структурой пользователей
	private function create(){} // создание нового диалога
	public function find_suit_dialog($userlist = array()){} // поиск подходящего диалога
	function get_new_messages_cnt(){} // количество новых сообщений для пользователя
	function get_users_from_dialog(){} // список пользователей принадлежащих диалогу
	function get_user_dialogs( $start=0,$cnt = 10 ){} // вывод диалогов пользователя
	function get_messages_from_dialog($new=false,$reset_status = true){} // вывод сообщений из диалога
	function remove_users_from_dialog( $userlist = array() ){}
	function add_users_to_dialog( $userlist = array() ){} // добавить пользователя в диалог
	function send($msg,$intro = false){} // посылка сообщения в диалог
	function send_many_users( $msg,$userlist,$intro = false ){} // посылка сообщения нескольким пользователям
	public function delete_message( $messageid ){} // удаление сообщения
}

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

Полная реализация всех методов 

Как использовать

Создаем экземпляр класса dialog


<?php
$dialog = new dialog($db,time(),$userid,isset($_REQUEST['hash'])?$_REQUEST['hash']:'');

где $db инициализированный и подключенный экземпляр класса db, а $userid это id текущего пользователя.

Получить все диалоги пользователя


$dialogs = $xddialog->get_user_dialogs();
$out = '';
foreach($dialogs as $dg)
	$out.='
	<div class="dialog '.(!$dg['msg_status']?'newmsg':'').'">
		<div class="float_left">
			<span class="nikname"><a href="#" id="user_'.$dg['senderid'].'">'.$dg['sender_name'].'</a></span>
			<span class="message_time">'.date('H:i:s d/m/Y',$dg['public']).'</span>
			<div>'.$dg['message'].'</div>
		</div>
		<div class="float_right">
			<input  class="btn gotodialog" id="dialog_'.$dg['hash'].'" value="ПЕРЕЙТИ К ДИАЛОГУ"/>
		</div>
		<div class="clearex"></div>
	</div>';

получить все сообщения из текущего дилога


$cnt = $xddialog->get_new_messages_cnt();
$messages = (!$cnt)?array():$xddialog->get_messages_from_dialog();
$out = '';
foreach($messages as $msg)
	$out.='
	<div>
		<div class="float_left">
			<span class="nikname"><a href="#" id="user_'.$msg['senderid'].'">'.$msg['sender_name'].'</a></span>
			<span class="message_time">'.date('H:i:s d/m/Y',$msg['public']).'</span>
			<div>'.$msg['message'].'</div>
		</div>
		<div class="clearex"></div>
	</div>';

получить только новые сообщения 


$cnt = $xddialog->get_new_messages_cnt();
$messages = (!$cnt)?array():$xddialog->get_messages_from_dialog(true);

Отправка сообщения в диалог


$xddialog->send($_POST['message']);

Поиск подходящего диалога и добавление туда всех пользователей


$xddialog->find_suit_dialog(array($userid1,$userid2,$userid3,));
$xddialog->add_users_to_dialog(array($userid,$userid1,$userid2,$userid3,));

где $userid это id текущего пользователя, а $userid,$userid1,$userid2,$userid3, id пользователей с которыми будет вестись диалог

Протестировать систему можно скачав пример с гитхаба, либо на моем сайте в demo.

Разумеется, это мой очередной велосипед. 

Рассказать друзьям
author.jpg

Платная консультация по вопросам 2500 руб/час

Прочитали статью и остались вопросы? Меня зовут Валерий и я её автор. С радостью объясню Вам в скайпе все затруднительные моменты, которые остались за рамками статьи!

Подробнее ...

Добавить комментарий


Комментарии