Недавно я писал, как сделать слияние пользователей vbulletin и MODx, но какой прок от этого, если связь между форумом и сайтом только в пользователях? Хочется какого-нибудь практического применения этого слияния, и для разминки сделаем вывод последних N сообщений с форума на сайте.
Сразу хочу сказать, что это можно реализовать в любой момент времени, и данная статья никак не зависит от предыдущей.
Для начала, нам нужно определиться как сообщения будут выглядеть на сайте — в виде таблицы? Как правило это последовательные строки записей с указанием даты и времени, автора, топика и раздела. Еще как вариант первые M символов сообщения, чтобы совсем заинтересовать посетителей.
Поэтому мы создадим чанк forum_last_messages и впишем в него вид для каждой из записей:
Собственно ту мы обозначили див с классом forum_message, чтобы потом его в css стилях сделать красивым и отформатировать текст внутри под свои нужды. Далее мы вставляем ссылку на форум с указанием отображения треда с заданным последним сообщением, его название и кол-во ответов в нем. Так же, при необходимости мы можем украсить и последнего флудера на фоурме.
Далее идет параграф с названием раздела — сделано таким образом, чтобы не ставить тэг
Теперь самое интересное и в то же время простое. Один запрос к форуму, один метод MODx, один цикл и сниппет forum_last_messages готов!
Мне кажется код до безобразия простой и наглядный :)
В цикле-обработчике рядов я не сделал обрезанный текст поста по той простой причине, что в таблице thread не хранится текст последнего сообщения, и для получения ег потребуется дергать еще и таблицу post, что скажется на производительности.
Итак, теперь используя [!forum_last_messages?count=`17`!] на сайте мы получим список последних свежих тем на форуме!
К слову: Запрос к форуму выбирает все ОТКРЫТЫЕ для анонимусов топики и ни одного закрытого. Честно говоря это и недоработка, и пятое колесо, ведь если есть слияние с форумом и пользователь залогинен мы запросто можем узнать к каким топикам он имеет доступ, а к каким нет и выбрать их. Но надо ли такие телодвижения совершать, если проще зайти на форуме в личный кабинет и посмотреть подписки на любимые темы?
Проще простого
Сразу хочу сказать, что это можно реализовать в любой момент времени, и данная статья никак не зависит от предыдущей.
Для начала, нам нужно определиться как сообщения будут выглядеть на сайте — в виде таблицы? Как правило это последовательные строки записей с указанием даты и времени, автора, топика и раздела. Еще как вариант первые M символов сообщения, чтобы совсем заинтересовать посетителей.
Поэтому мы создадим чанк forum_last_messages и впишем в него вид для каждой из записей:
<div id="post_[+postid+]" class="forum_message">
<a href="[+forumlink+]/showthread.php?p=[+postid+]">[+threadtitle+] ([+replycount+])</a> от <span id="user">[+lastposter+] в [+postdate+]</span>
<p>/[+forum+]</p>
[+shortmessage+]
</div>
Собственно ту мы обозначили див с классом forum_message, чтобы потом его в css стилях сделать красивым и отформатировать текст внутри под свои нужды. Далее мы вставляем ссылку на форум с указанием отображения треда с заданным последним сообщением, его название и кол-во ответов в нем. Так же, при необходимости мы можем украсить и последнего флудера на фоурме.
Далее идет параграф с названием раздела — сделано таким образом, чтобы не ставить тэг
<br />
— в тех же css стилях можно отформатировать именно этот параграф с помощью селектора .forum_message p {}
. Ну а далее вставляем плейсхолдер обрезанного форумного сообщения. Лично мне он не нужен был, но я его сделал — шаблонизатор успешно обработает его и заменит пустым местом.Теперь самое интересное и в то же время простое. Один запрос к форуму, один метод MODx, один цикл и сниппет forum_last_messages готов!
<?php
global $modx, $vbulletin;
$forumlink = 'http://URLTOYOUFORUM';
$forum_base = (empty($vbulletin->config['Database']['dbname'])) ? 'FORUMBASE' : $vbulletin->config['Database']['dbname'] ;
//тут надо пояснить: скорее всего база форума и сайта - различные, поэтому нам надо знать имя форумной базы
$forum_prefix = (empty($vbulletin->config['Database']['tableprefix'])) ? 'vb_' : $vbulletin->config['Database']['tableprefix'] ;
$count= (empty($count) || ($count<2)) ? 10 : $count; //кол-во сообщений для вывода, по умолчанию 10
$sql = 'SELECT t.title as topic, t.lastpostid, t.lastpost, t.lastposter, t.forumid, t.replycount, t.dateline, f.title as forum
FROM `'.$forum_base.'`.`'.$forum_prefix.'thread` t, `'.$forum_base.'`.`'.$forum_prefix.'forum` f
WHERE t.`visible` =1
AND t.`open` =1
AND f.forumid = t.forumid
AND t.forumid NOT
IN (
SELECT forumid
FROM `'.$forum_base.'`.`'.$forum_prefix.'forumpermission`
)
ORDER BY t.lastpost DESC
LIMIT '.$count.';';
$res = $modx->db->query($sql);
$txt = '';
while ($f_res = $modx->db->getRow($res, 'assoc')) {
//элементы массива названы вполне себе понятно
$txt .= $modx->parseChunk('forum_last_messages',
array(
'forumlink' => $forumlink,
'postid' => $f_res['lastpostid'],
'threadtitle' => $f_res['topic'],
'replycount' => $f_res['replycount'],
'lastposter' => $f_res['lastposter'],
'forum' => $f_res['forum'],
'postdate' => date("H:i", $f_res['lastpost']) //формат даты
),
'[+',
'+]'
);
}
return $txt;
?>
Мне кажется код до безобразия простой и наглядный :)
В цикле-обработчике рядов я не сделал обрезанный текст поста по той простой причине, что в таблице thread не хранится текст последнего сообщения, и для получения ег потребуется дергать еще и таблицу post, что скажется на производительности.
Итак, теперь используя [!forum_last_messages?count=`17`!] на сайте мы получим список последних свежих тем на форуме!
К слову: Запрос к форуму выбирает все ОТКРЫТЫЕ для анонимусов топики и ни одного закрытого. Честно говоря это и недоработка, и пятое колесо, ведь если есть слияние с форумом и пользователь залогинен мы запросто можем узнать к каким топикам он имеет доступ, а к каким нет и выбрать их. Но надо ли такие телодвижения совершать, если проще зайти на форуме в личный кабинет и посмотреть подписки на любимые темы?