Непрочитанные сообщения с фильтром по иконке. SSI

Автор deadbead, 13 октября 2009, 21:33:19

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

deadbead

Задача: Показать пользователю важные темы, которые он не читал.


Решение: Вопрос решился с помощью SSI. Взяв зв основу функцию ssi_recentTopics изменив запрос и добавив в нее дополнительный параметр $icon_filter получил функцию выводящую список непрочитанных сообщений с указанной иконкой.

Решение актуально для 1.х линейки!


// No read posts list:   [board] Subject by Poster
	
Date
function ssi_noreadPosts($num_recent = 8, $exclude_boards = null, $output_method = 'echo', $icon_filter = null){
	
global
$context, $settings, $scripturl, $txt, $db_prefix, $ID_MEMBER;
	
global
$user_info, $modSettings, $func;
	
if (
$exclude_boards === null && !empty($modSettings['recycle_enable']) && $modSettings['recycle_board'] > 0)
	
	
$exclude_boards = array($modSettings['recycle_board']);
	
else
	
	
$exclude_boards = empty($exclude_boards) ? array() : $exclude_boards;
	
$stable_icons = array('xx', 'thumbup', 'thumbdown', 'exclamation', 'question', 'lamp', 'smiley', 'angry', 'cheesy', 'grin', 'sad', 'wink', 'moved', 'recycled', 'wireless');
	
$icon_sources = array();
	
foreach (
$stable_icons as $icon)
	
	
$icon_sources[$icon] = 'images_url';
	
// Find all the posts in distinct topics.  Newer ones will have higher IDs.
	
$request = db_query("
	
	
SELECT
	
	
	
m.posterTime, m.subject, m.ID_TOPIC, m.ID_MEMBER, m.ID_MSG, b.ID_BOARD, b.name AS bName,
	
	
	
IFNULL(mem.realName, m.posterName) AS posterName, "
. ($user_info['is_guest'] ? '1 AS isRead, 0 AS new_from' : '
	
	
	
IFNULL(lt.ID_MSG, IFNULL(lmr.ID_MSG, 0)) >= t.ID_LAST_MSG AS isRead,
	
	
	
IFNULL(lt.ID_MSG, IFNULL(lmr.ID_MSG, -1)) + 1 AS new_from'
) . ", LEFT(m.body, 384) AS body, m.smileysEnabled, m.icon
	
	
FROM
{$db_prefix}messages AS m
	
	
	
LEFT JOIN
{$db_prefix}members AS mem ON (mem.ID_MEMBER = m.ID_MEMBER)
	
	
	
LEFT JOIN
{$db_prefix}boards AS b ON ( b.ID_BOARD = m.ID_BOARD)
	
	
	
LEFT JOIN
{$db_prefix}topics AS t ON ( t.ID_TOPIC = m.ID_TOPIC)" . (!$user_info['is_guest'] ? "
	
	
	
LEFT JOIN
{$db_prefix}log_topics AS lt ON (lt.ID_TOPIC = t.ID_TOPIC AND lt.ID_MEMBER = $ID_MEMBER)
	
	
	
LEFT JOIN
{$db_prefix}log_mark_read AS lmr ON (lmr.ID_BOARD = b.ID_BOARD AND lmr.ID_MEMBER = $ID_MEMBER)" : '') . "
	
	
WHERE m.ID_MSG > IFNULL( lt.ID_MSG, IFNULL( lmr.ID_MSG, 0 ) )
	
	
	
AND b.ID_BOARD = t.ID_BOARD"
. (empty($exclude_boards) ? '' : "
	
	
	
AND b.ID_BOARD NOT IN ("
. implode(', ', $exclude_boards) . ")") . "
	
	
	
AND
$user_info[query_see_board]" . (empty($icon_filter) ? '' : "
	
	
	
AND m.icon = '
{$icon_filter}'") . "
	
	
ORDER BY m.ID_MSG DESC
	
	
LIMIT
$num_recent", __FILE__, __LINE__);
	
$posts = array();
	
while (
$row = mysql_fetch_assoc($request))
	
{
	
	
$row['body'] = strip_tags(strtr(parse_bbc($row['body'], $row['smileysEnabled'], $row['ID_MSG']), array('<br />' => '&#10;')));
	
	
if (
$func['strlen']($row['body']) > 128)
	
	
	
$row['body'] = $func['substr']($row['body'], 0, 128) . '...';
	
	
// Censor the subject.
	
	
censorText($row['subject']);
	
	
censorText($row['body']);
	
	
if (empty(
$modSettings['messageIconChecks_disable']) && !isset($icon_sources[$row['icon']]))
	
	
	
$icon_sources[$row['icon']] = file_exists($settings['theme_dir'] . '/images/post/' . $row['icon'] . '.gif') ? 'images_url' : 'default_images_url';
	
	
// Build the array.
	
	
$posts[] = array(
	
	
	
'board' => array(
	
	
	
	
'id' => $row['ID_BOARD'],
	
	
	
	
'name' => $row['bName'],
	
	
	
	
'href' => $scripturl . '?board=' . $row['ID_BOARD'] . '.0',
	
	
	
	
'link' => '<a href="' . $scripturl . '?board=' . $row['ID_BOARD'] . '.0">' . $row['bName'] . '</a>'
	
	
	
),
	
	
	
'topic' => $row['ID_TOPIC'],
	
	
	
'poster' => array(
	
	
	
	
'id' => $row['ID_MEMBER'],
	
	
	
	
'name' => $row['posterName'],
	
	
	
	
'href' => empty($row['ID_MEMBER']) ? '' : $scripturl . '?action=profile;u=' . $row['ID_MEMBER'],
	
	
	
	
'link' => empty($row['ID_MEMBER']) ? $row['posterName'] : '<a href="' . $scripturl . '?action=profile;u=' . $row['ID_MEMBER'] . '">' . $row['posterName'] . '</a>'
	
	
	
),
	
	
	
'subject' => $row['subject'],
	
	
	
'short_subject' => shorten_subject($row['subject'], 25),
	
	
	
'preview' => $row['body'],
	
	
	
'time' => timeformat($row['posterTime']),
	
	
	
'timestamp' => forum_time(true, $row['posterTime']),
	
	
	
'href' => $scripturl . '?topic=' . $row['ID_TOPIC'] . '.msg' . $row['ID_MSG'] . ';topicseen#new',
	
	
	
'link' => '<a href="' . $scripturl . '?topic=' . $row['ID_TOPIC'] . '.msg' . $row['ID_MSG'] . '#new">' . $row['subject'] . '</a>',
	
	
	
'new' => !empty($row['isRead']),
	
	
	
'new_from' => $row['new_from'],
	
	
	
'icon' => '<img src="' . $settings[$icon_sources[$row['icon']]] . '/post/' . $row['icon'] . '.gif" align="middle" alt="' . $row['icon'] . '" border="0" />',
	
	
);
	
}
	
mysql_free_result($request);
	
// Just return it.
	
if (
$output_method != 'echo' || empty($posts))
	
	
return
$posts;
	
	
echo
'
	
	
<table border="0" class="ssi_table">'
;
	
foreach (
$posts as $post)
	
	
echo
'
	
	
	
<tr>
	
	
	
	
<td align="right" valign="top" nowrap="nowrap">
	
	
	
	
	
['
, $post['board']['link'], ']
	
	
	
	
</td>
	
	
	
	
<td valign="top">
	
	
	
	
	
<a href="'
, $post['href'], '">', $post['subject'], '</a>
	
	
	
	
	
'
, $txt[525], ' ', $post['poster']['link'], '
	
	
	
	
	
'
, $post['new'] ? '' : '<a href="' . $scripturl . '?topic=' . $post['topic'] . '.msg' . $post['new_from'] . ';topicseen#new"><img src="' . $settings['images_url'] . '/' . $context['user']['language'] . '/new.gif" alt="' . $txt[302] . '" border="0" /></a>', '
	
	
	
	
</td>
	
	
	
	
<td align="right" nowrap="nowrap">
	
	
	
	
	
'
, $post['time'], '
	
	
	
	
</td>
	
	
	
</tr>'
;
	
echo
'
	
	
</table>'
;}?>



Применение:

Пример 1:
Пример использования функции.
ssi_noreadPosts($num_recent = 10, $exclude_boards = null, $output_method = 'echo', $icon_filter = 'exclamation');?>

Выведет список непрочитанных сообщений для текущего пользователя помеченных иконкой
В параметре $exclude_boards можно задать ID исключаемых разделов Например: $exclude_boards = array(80, 27, 33)
Параметр $icon_filter соответствует имени файла иконки без расширения. - 'xx', - 'exclamation' и т.д....

Пример 2:
Создаем, например, в TinyPortal центральный блок типа phpbox, выставляем в свойство "не использовать название/фрейм" и вставляем следующий код:

require_once("/home/dib/ws/dun55/__forum/SSI.php");$posts = ssi_noreadPosts($num_recent = 10, $exclude_boards = array(80), $output_method = 'array', $icon_filter = 'exclamation');if (!empty($posts)){echo '<div style="text-align: center; color: rgb(255, 0, 0); padding: 10px; border: 3px dotted red; margin: 10px; background-color: #FFF;"><br /><b><font size="4">Внимание!!!</font><br/>Вы не прочли следующие <u>важные</u> темы и сообщения:</b><br/><br/>
	
<table border="0" class="ssi_table" align="center">'
;foreach ($posts as $post)
	
echo
'
	
	
<tr>
	
	
	
<td align="left" valign="top" nowrap="nowrap">
	
	
	
	
<a href="'
, $post['href'], '">', $post['subject'], '</a>
	
	
	
	
'
, $txt[525], ' ', $post['poster']['link'], '
	
	
	
	
'
, $post['new'] ? '' : '<a href="' . $scripturl . '?topic=' . $post['topic'] . '.msg' . $post['new_from'] . ';topicseen#new"><img src="' . $settings['images_url'] . '/' . $context['user']['language'] . '/new.gif" alt="' . $txt[302] . '" border="0" /></a>', '
	
	
	
</td>
	
	
	
<td align="right" nowrap="nowrap">
	
	
	
	
'
, $post['time'], '
	
	
	
</td>
	
	
	
<td align="left" valign="top">
	
	
	
	
['
, $post['board']['link'], ']
	
	
	
</td>
	
	
</tr>'
;echo '
	
</table><br/><i>Крайне желательно, прочитать все темы этого списка.</i></div>'
;}?>

В этом случае результат будет таким же как представлено на скриншоте. Когда пользователь прочитает все сообщения в блоке - блок перестанет отображаться до появления новых сообщений с указанной иконкой.
Это же самый страшный разум во вселенной. Высылайте беспилотный модуль.