Прочитанные сообщения v 2.0. "Отметить как прочитанное"

+30
2.28K
Приветствую всех! В преддверии нового хочется сделать маааааленький, но полезный презент. Напомню суть проблемы: надо было сделать так, чтобы когда приходят новые сообщения, пользователь мог прочитать одно из них… побродить по сайту и вернуться к другим, т.к. в пользовательском меню будет висеть количество непрочитанных сообщений. Предыдущая версия этой штуковины была не совсем удачная, возможно и эта не совсем доработана, но она лучше той:) Теперь у каждого сообщения появилась кнопка "отметить как прочитанное" и убран казус при входящем сообщении от служб рассылки и обновлений.
Итак, сначала....
Открываем /components/users/messages.php и находим строку примерно 130
  1. //erase new mark
  2. $inDB->query("UPDATE cms_user_msg SET is_new = 0 WHERE id = ".$record['id']);
и заменяем ее на
  1. //erase new mark
  2. if($record['sender_id']>0){
  3. $inDB->query("UPDATE cms_user_msg SET is_new = 1 WHERE id = ".$record['id']);
  4. } else {
  5. $inDB->query("UPDATE cms_user_msg SET is_new = 0 WHERE id = ".$record['id']);
  6. }
  7.  
далее идем в /components/users/fronted.php и находим там строку примерно 1862
  1. $is_reply_user = true;
  2. $msg = $inDB->fetch_assoc($result);
  3. $msg['senddate'] = $inCore->dateFormat($msg['senddate'], true, true);
  4.  
  5. $update_sql = "UPDATE cms_user_msg SET is_new = 0 WHERE id = '{$msg['id']}' LIMIT 1";
  6.  
  7. $inDB->query($update_sql);
  8.  
  9. }
  10.  
сразу после этой скобки вставляем
  1. //
  2. // Отметить как прочитанное
  3. //
  4.  
  5. $readid = $inCore->request('readid', 'int', 0);
  6. $is_read_user = false;
  7.  
  8. if ($readid){
  9.  
  10. $sql = "SELECT m.id as id,
  11. m.senddate, m.message, u.login, u.nickname
  12. FROM cms_user_msg m
  13. LEFT JOIN cms_users u ON u.id = m.from_id
  14. WHERE m.id = '$readid' AND m.to_id = '$from_id'";
  15.  
  16. $result = $inDB->query($sql) ;
  17.  
  18. $msg = $inDB->fetch_assoc($result);
  19.  
  20. $update_sql = "UPDATE cms_user_msg SET is_new = 0 WHERE id = '{$msg['id']}' LIMIT 1";
  21.  
  22. $inDB->query($update_sql);
  23. $inCore->redirectBack();
  24.  
  25. }
  26.  
затем идем в /components/users/router.php и находим там вот эти строки
  1. $routes[] = array(
  2. '_uri' => '/^users\/([0-9]+)\/messages\-history([0-9]+)\-([0-9]+).html$/i',
  3. 'do' => 'messages',
  4. 1 => 'id',
  5. 2 => 'with_id',
  6. 'opt' => 'history',
  7. 3 => 'cpage'
  8. );
и сразу после них вставляем
  1. $routes[] = array(
  2. '_uri' => '/^users\/([0-9]+)\/read([0-9]+).html$/i',
  3. 'do' => 'sendmessage',
  4. 1 => 'id',
  5. 2 => 'readid'
  6. );
затем открываем шаблон/components/com_users_messages.tpl находим строки
  1. {if $is_mes}
  2. <div>
  3. {foreach key=tid item=record from=$records}
  4. <div class="usr_msg_entry">
  5.  
после них идет одна таблица, заменяем ее на эту
  1. <table style="width:100%" cellspacing="0">
  2. <tr>
  3. <td class="usr_msg_title" width=""><strong>{$record.authorlink}</strong>, <span class="usr_msg_date">{$record.fpubdate}</span></td>
  4. {if $record.is_new}
  5. {if $opt=='in'}
  6. <td class="usr_msg_title" width="90" align="right"><span class="msg_new">{$LANG.NEW}!</span></td>
  7. {else}
  8. <td class="usr_msg_title" width="90" align="right"><a class="msg_delete" href="/users/delmsg{$record.id}.html">{$LANG.CANCEL_MESS}</a></td>
  9. {/if}
  10. {else}
  11. <td class="usr_msg_title" width="14" align="right"> </td>
  12. <td class="usr_msg_title" width="20" align="right"> </td>
  13. {/if}
  14. {if $opt=='in'}
  15. {if $record.sender_id>0}
  16. <td class="usr_msg_title" width="80" align="right"><a class="msg_reply" href="/users/{$record.from_id}/reply{$record.id}.html">{$LANG.REPLY}</a></td>
  17. <td class="usr_msg_title" width="80" align="right"><a class="msg_history" href="/users/{$id}/messages-history{$record.from_id}.html">{$LANG.HISTORY}</a></td>
  18. <td class="usr_msg_title" width="190" align="right"><a class="msg_reply" href="/users/{$record.from_id}/read{$record.id}.html">отметить как прочитанное</a></td>
  19. {/if}
  20.  
  21.  
  22.  
  23. {/if}
  24. {if $opt=='in' || ($opt=='out' && !$record.is_new)}
  25. <td class="usr_msg_title" width="70" align="right"><a class="msg_delete" href="/users/delmsg{$record.id}.html">{$LANG.DELETE}</a></td>
  26. {/if}
  27. </tr>
  28. </table>
  29.  
после нее сразу вторая таблица, заменяем ее на эту
  1. <table cellspacing="4">
  2. <tr>
  3. <td width="70" height="70" valign="middle" align="center" style="border:solid 1px #C3D6DF">
  4. {$record.user_img}
  5. {if $record.is_online}
  6.  
  7. <span class="online" style="font-size:10px;">{$LANG.ONLINE}</span>
  8. {/if}
  9. </td>
  10. {if $opt=='in'}
  11. {if $record.sender_id<0}
  12. <td width="" valign="top"><div style="padding:6px">{$record.message}</div></td>
  13. {/if}
  14. {/if}
  15.  
  16. {if $opt=='in'}
  17. {if $record.sender_id>0}
  18. <td width="" valign="top"><div style="padding:6px"><a style="text-decoration:none;" href="/users/{$record.from_id}/reply{$record.id}.html">{$record.message|truncate:200}</div></td>
  19. {/if}
  20. {/if}
  21.  
  22. {if $opt=='history' || $opt=='out'}
  23. <td width="" valign="top"><div style="padding:6px">{$record.message}</div></td>
  24. {/if}
  25.  
  26. </tr>
  27. </table>
  28.  
Вроде все… теперь когда приходят сообщение от юзера, его можно прочитать нажав на само сообщение (т.к. теперь оно кликабельно), а можно нажать "отметить как прочитанное" и не читать. Когда приходит служебное сообщение, оно становится прочитанным после перезагрузки страницы (как раньше вобщем). Шаблон делал под себя, лучше сами переделаете как вам нужно.
Я не знаю насколько правильно все сделано, но у меня все работает-это факт!
Пробуем! С наступающим! Удачи всем!
P.S. удобнее сделать все через чекбоксы, но это как-нибудь в другой раз.

Не забывайте делать бэкапы

align=
0
Anubis Anubis 12 лет назад #
Good job! Если сообщение прочитано, то "отметить как прочитанное" остается, верно?
0
PrazdNik PrazdNik 12 лет назад #
верно, остается
+3
Pantsakov Pantsakov 12 лет назад #
Убираем надпись "Отметить как прочитанное" для сообщений, которые уже прочитаны:

Ищем в файле шаблон/components/com_users_messages.tpl строку

Код PHP:
<td class="usr_msg_title" align="center"><a class="msg_reply" href="/users/{$record.from_id}/read{$record.id}.html">отметить как прочитанное</a></td>
и заменяем ее на эту:

Код PHP:
{if $record.is_new}<td class="usr_msg_title" align="center"><a class="msg_reply" href="/users/{$record.from_id}/read{$record.id}.html">отметить как прочитанное</a></td>{/if}
+1
PrazdNik PrazdNik 12 лет назад #
+1
0
Tarhun Tarhun 12 лет назад #
Есть баг, если удалить сообщение не прочитав, остается висеть в "меню пользователя" непрочитанное сообщение и никак его не убрать...
0
Tarhun Tarhun 12 лет назад #
Может кто решил эту проблему?
0
PrazdNik PrazdNik 12 лет назад #
проверил на двух сайтах, такой проблемы не обнаружено. удалял сообщения не прочитав его, из меню все убирается.

Еще от автора

Слайдер новых объектов InstantMaps
Приветствую, друзья! Хочу поделиться простеньким слайдером для вывода новых объектов мапса.
Универсальный шаблон для InstantCMS v1.10 (платный)
Приветствую, друзья! Представляю вашему вниманию универсальный шаблон для InstantCMS v1.10. Подойдет для сайта почти любой тематики.
Ограничение количества символов со счетчиком при вводе текста.
Приветствую всех! Понадобилось на одном проекте ограничить количество вводимых символов в текстовом поле и вывести счетчик оставшихся букв.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.