Звук для p_newmessage от SJen (одно сообщение - один звук)

+17
2.08K

Всем доброго времени суток.

--предыстория--
Идея привязать звук к Плагину "Новые сообщения" от SJen появилась сразу как только поставил себе этот плагин. Реализация с постоянным звучанием (каждые несколько секунд) была мной реализована и тут же заставила морщиться — ну не нравится мне, слишком навязчиво и назойливо.

--сделано--
Итак, что имеем:
— звук сообщения приходит один раз для каждого нового сообщения
— в случае, когда есть "Сообщения(1)" и приходит новое — звучит еще одно оповещение, и т.д. для каждого нового сообщения
— в таблицу cms_user_msg добавлено поле is_sound, которое говорит, "звучало" уже это сообщение, или нет
— в таблицу cms_user добавлено поле newmes, которое говорит, сколько новых сообщений было во время предыдущего запроса
— увеличилось количество запросов к бд: теперь их от 5 до 7 на каждом обновлении(это в графу "минусы" моей реализации)

--как сделано--
Итак, что делаем.

Заменяем файл plugins/p_newmessages/update.php на
  1. <?php
  2. $user_id = isset($_SESSION['user']['id']) ? $_SESSION['user']['id'] : 0;
  3. if ($user_id){
  4. define("VALID_CMS", 1);
  5. define('PATH', $_SERVER['DOCUMENT_ROOT']);
  6. include(PATH.'/includes/config.inc.php');
  7. mysql_connect($_CFG['db_host'],$_CFG['db_user'],$_CFG['db_pass']);
  8. mysql_select_db($_CFG['db_base']);
  9. $sql = "select count(distinct id) from {$_CFG['db_prefix']}_user_msg where to_id = {$user_id} and is_new = 1 and to_del = 0 and from_del = 0";
  10. $newmsg = mysql_result(mysql_query($sql),0);
  11. $sql="select newmes from {$_CFG['db_prefix']}_users where id={$user_id}";
  12. $colnew=mysql_result(mysql_query($sql),0);
  13. if ($newmsg!=0 ){
  14. $idsound=mysql_result(mysql_query("select id from {$_CFG['db_prefix']}_user_msg where to_id = {$user_id} and is_new = 1 and to_del = 0 and from_del = 0"),0);
  15. $issound=mysql_result(mysql_query("select is_sound from {$_CFG['db_prefix']}_user_msg where id={$idsound}"),0);}
  16.  
  17. if ($newmsg!=0 ){
  18. if ($issound!=1 || $newmsg>$colnew){
  19. echo '<audio src="/mes.ogg" autoplay autobuffer></audio><a class="has_new" href="/users/'.$user_id.'/messages.html">Сообщения ('.$newmsg.')</a>';
  20. $sql = "UPDATE cms_user_msg SET is_sound = 1 WHERE id= {$idsound}";
  21. $sql = "UPDATE cms_users SET newmes = {$newmsg} WHERE id= {$user_id}";
  22. }else
  23. {
  24. echo '<a class="has_new" href="/users/'.$user_id.'/messages.html">Сообщения ('.$newmsg.')</a>';
  25. }
  26. if ($newmsg<$colnew){
  27. $sql = "UPDATE cms_users SET newmes = {$newmsg} WHERE id= {$user_id}";
  28. }
  29. return ;
  30. }else{
  31. echo '<a href="/users/'.$user_id.'/messages.html">Мои Сообщения</a>';
  32. }
  33. }
  34. ?>
Забираем звук, или делаем свой(либо с именем mes.ogg, либо меняем название звукового файла в update.php на Ваше)
Кладем его в /plugins/p_newmessages

Создаем поля в бд.(выбрать таблицу -> структура -> добавить поле(я))

Параметры is_sound(вставляем в таблицу cms_user_msg):
Поле: is_sound
Тип: INT
По умолчанию: NULL

Параметры newmes(вставляем в таблицу cms_users):
Поле: newmes
Тип: INT
Длина/значения: 11
По умолчанию: "Как определено: 0"

--эпилог--
Вроде все, если ничего не забыл...

--на пиво--
WMID: 167739785201
Z354035537647
R235136301990
+1
Майкл Майкл 12 лет назад #
Тепрь поясните пжл, чем Ваша реализация лучше этого?
http://instantcms.ru/blogs/poleznosti-ot-sjen/zvuk-v-plagine-novye-sobshenija-i-bag-v-hake-optimizacija-vyvoda-komentariev.html
+3
Def Def 12 лет назад #
он же написал выше - звук не постоянно издается, а только единожды при приходе нового сообщения.
+1
Майкл Майкл 12 лет назад #
Ясно!
+4
SJen SJen 12 лет назад #
ByMind, на правах создателя оригинала можно покритиковать немножко?)

Смысл доработки понятен, ну и цели вы достигли (звук играет один раз). Только вот решение, если честно, не очень красивое.
увеличилось количество запросов к бд: теперь их от 5 до 7
Плохо, это совсем не обязательно. Можно решить без увеличения нагрузки на сервер.

- в таблицу cms_user_msg добавлено поле is_sound, которое говорит, "звучало" уже это сообщение, или нет - в таблицу cms_user добавлено поле newmes, которое говорит, сколько новых сообщений было во время предыдущего запроса
Новые поля тоже не обязательно вводить - увеличится размер БД, добавятся запросы на запись в эти поля.. Необязательная нагрузка.


ИМХО, я бы лучше вынес настройки звука в профиль - чтобы каждый посетитель сам выбрал играть звук один раз или много (мне, например, удобнее было, чтобы играло периодически - если я, скажем, отошел за чашкой чая на кухню - пусть пиликает пока я не услышу).

Покритиковал, но от меня плюсик однозначно - цель достигнута, хоть и не самым коротким путем.

PS Проверку играл ли звук и не изменилось ли количество новых сообщений можно сделать одной строкой в javascript при получении ответа от сервера (если интересно как - стучите в личку, подскажу).

PPS Критика исключительно ради того, чтобы вы поняли минусы своего решения, которое тем не менее имеет право на жизнь и кому-то тоже окажется полезно.
+1
ByMind ByMind 12 лет назад #
так я и писал, что понимаю огромный минус при работе с бд
+1
Александр Сергеевич Александр Сергеевич 12 лет назад #
Нету звука. Сделал всё по инструкции, кроме:

в таблице cms_user_msg По умолчанию: NULL не выставляется, выдаёт ошибку, ставлю нет тогда сохраняется.
0
Александр Сергеевич Александр Сергеевич 12 лет назад #
Ошибка

SQL-запрос:

ALTER TABLE `cms_user_msg` CHANGE `is_sound` `is_sound` INT NOT NULL DEFAULT NULL

Ответ MySQL:
#1067 - Invalid default value for 'is_sound'
0
ByMind ByMind 12 лет назад #
поставьте "как определено: 0"
+3
Виктор Данилов Виктор Данилов 12 лет назад #
в 20 строчке указал полный путь до звука и всё заработало

<audio src="/plugins/p_newmessages/mes.ogg"

Еще от автора

В который раз - социальные кнопки [дизайн]
Доброго времени суток. Пришла мне мысль сделать собственные кнопки для расшарки в социальные сети постов в блогах.
К теме о георгиевских ленточках
Еще один вариант вставки ленточки. Навеяно этим. Это вариант с прикрепленной ленточкой в левом верхнем углу экрана(при прокрутке остается на экране).
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.