19 мая 2010 в 11:47

MODx & Vbulletin 3.8.x — последние сообщения с форума

MODX*
Недавно я писал, как сделать слияние пользователей vbulletin и MODx, но какой прок от этого, если связь между форумом и сайтом только в пользователях? Хочется какого-нибудь практического применения этого слияния, и для разминки сделаем вывод последних N сообщений с форума на сайте.

Проще простого


Сразу хочу сказать, что это можно реализовать в любой момент времени, и данная статья никак не зависит от предыдущей.

Для начала, нам нужно определиться как сообщения будут выглядеть на сайте — в виде таблицы? Как правило это последовательные строки записей с указанием даты и времени, автора, топика и раздела. Еще как вариант первые 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`!] на сайте мы получим список последних свежих тем на форуме!

К слову: Запрос к форуму выбирает все ОТКРЫТЫЕ для анонимусов топики и ни одного закрытого. Честно говоря это и недоработка, и пятое колесо, ведь если есть слияние с форумом и пользователь залогинен мы запросто можем узнать к каким топикам он имеет доступ, а к каким нет и выбрать их. Но надо ли такие телодвижения совершать, если проще зайти на форуме в личный кабинет и посмотреть подписки на любимые темы?
Александр @AIien
карма
7,0
рейтинг 0,0
Похожие публикации
Самое читаемое Разработка

Комментарии (4)

  • 0
    а у vbulletin нет какого-нибудь api для выборки топиков и сообщений на манер modx->getDocumentChildren? так было бы вообще здорово.
    • 0
      Я думаю, что вам поможет официальная документация, созданная с помощью PHP Documentor, members.vbulletin.com/api/

      Эта документация создана для vB 4, у меня на винте лежит для 3.6.х, ее можно найти на сатах поддержки (типа vbsupport.org).
  • 0
    Сегодня проверил. Все работает.
    Только в блоке:
    $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_prefix.'forumpermission`
    )
    ORDER BY t.lastpost DESC
    LIMIT '.$count.';';
    $res = $modx->db->query($sql);

    Допущена ошибка.
    А именно тут:
    FROM `'.$forum_prefix.'forumpermission`


    Должно быть
    FROM `'.$forum_base.'`.`'.$forum_prefix.'forumpermission`


    Версия MODx 1.0.4, Версия Vb 3.8.6

    К тому же, юзер на БД должен быть такой же как на сайте.
    • 0
      Да, спасибо за замеченную неточность — поправил. Что касается пользователя БД, то достаточно дать прав на выборку из используемых таблиц форумной базы пользователю MODx.

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.