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

    Недавно я писал, как сделать слияние пользователей 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`!] на сайте мы получим список последних свежих тем на форуме!

    К слову: Запрос к форуму выбирает все ОТКРЫТЫЕ для анонимусов топики и ни одного закрытого. Честно говоря это и недоработка, и пятое колесо, ведь если есть слияние с форумом и пользователь залогинен мы запросто можем узнать к каким топикам он имеет доступ, а к каким нет и выбрать их. Но надо ли такие телодвижения совершать, если проще зайти на форуме в личный кабинет и посмотреть подписки на любимые темы?
    Метки:
    Поделиться публикацией
    Похожие публикации
    Комментарии 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.

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