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

  1. Перейдемо до коду.
  2. Як використовувати

У цій статті я розповім про систему діалогів на php, яку я створив на одному з сервісів компанії, де я працюю.

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

пощупайте Demo

приступимо

Для початку створимо структуру БД

ось дамп

Коли один користувач хоче написати повідомлення іншому, скрипт шукає підходящий діалог. Діалог, є гідною кандидатурою, якщо в ньому беру участь ті ж особи. Тобто якщо ми раніше писали цій людині, і нікого більше не підключали до цього діалогу, то він підходить. Якщо ж відповідного діалогу немає, то створюємо новий. Діалог і користувач пов'язані таблицею 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: sd / 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: sd / 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 .

Зрозуміло, це мій черговий велосипед.

Розповісти друзям

Php $ dialog = new dialog ($ db, time (), $ userid, isset ($ _ REQUEST [ 'hash'])?
Dg [ 'msg_status']?

Дополнительная информация

rss
Карта