Уже несколько раз у меня спрашивали, каким образом показывается список последних сообщений на форуме «Классика». Напишу об этом здесь, чтобы потом не рассказывать каждому заново, а отсылать к этому посту.
У vBulletin, как и у любой хорошей вещи, есть свои недостатки. Я перешел на него с phpBB, для которого есть замечательная приблуда под названием topics_anywhere. Она позволяет не только показывать последние сообщения на главной (или любой другой) странице форума, но и отдает те же последние сообщения в виде RSS, а также дает возможность с помощью простого Java-скрипта демонстрировать апдейты форума вообще на любой веб-странице (кроме, естественно, ЖЖ, где вообще никакие скрипты вставлять в код страницы нельзя). Короче говоря, это совершенно необходимая вещь для любого вменяемого форума на phpBB. Когда я ее активно использовал, я даже делал русский перевод для нее. С переходом на vB я это дело бросил и, судя по сайту, никто мою инициативу не поддержал, хотя дело совершенно плевое. Так там и лежит мой старый перевод. Ну, да ладно.
В случае с vB дело обстоит намного хуже. Отдавать RSS этот движок отдает, но делает это весьма оригинально: он отдает не последние сообщения в темах, а темы, которые были созданы последними, что страшно неудобно. Сколько я помню, на их форуме поддержки эта тема поднималась не раз, но они по каким-то причинам исправить это, или, хотя бы, сделать какой-то свитч для того, чтобы дать возможность пользоваться и так, и так, не хотят. Что позволяет им говорить, что vBulletin является, так сказать, RSS-compatible, хотя никто этой функцией в таком виде, естественно, не пользуется.
Существует, правда, отдельная приблуда для vB, которая называется fps_external (есть две версии — для 3.0.х и для 3.5.х).
Тем не менее, fps_external, хоть и решает проблему с предоставлением RSS-фида, не дает простого способа демонстрровать последние новости на страницах самого форума. Еще со времен phpBB участники моего форума «Классика» привыкли, чтобы им на любой странице показывали 5-7 последних сообщений, размещенных на форуме. Привыкли они к этому настолько, что даже намного более продвинутая функция «Новые сообщения», которая есть в vB, их не устраивает. Когда я переходил на новый движок, грешним делом, думал, что удастся обойтись без кустарных примочек, но народ настаивал.
Первая мысль по этому поводу — надо использовать RSS. Но после того, как я выяснил, как именно vBulletin отдается по RSS, я понял, что это не подходит. Стал искать что-то другое. И нашел.
Во времена vB 3.x удавалось обходиться обычным php include. После перехода на vB 3.5.x это дело работать перестало, в связи с чем пришлось выдумать простенький модуль. Вообще, эта система не блещет изящностью, но зато позволяет быстро и легко развернуть монитор последних сообщений форума практически на любой странице. Рассказываю, каким образом.
Для того, чтобы сделать все, описанное ниже, сначала надо скачать архив с двумя файлами. Весит он два килобайта.
Вариант 1. Последние сообщения на самом форуме.
Пример можно увидеть на форуме «Классика». В верхней части каждой страницы слева — логотип форума, справа — эти самые последние сообщения. Достигнуто это следующим образом.
В скачанном архиве находятся два файла: lastposts3.php (который написал не я, а некто Robin Hood, причем очень давно) и latest_posts.xml. Первый мы кладем в корневую директорию форума (туда же, где, например, лежит index.php), не забыв указать в самом его начале параметры общения с базой mysql. После этого идем в администраторскую панель и находим там пункт «Система модулей» или что-то в этом роде. Нажимаем «Сохранить/Загрузить модуль». Импортируем туда файл xml из скачанного архива. Теперь в списке установленных модулей появился модуль latest_posts. После этого мы идем в раздел «Стили и шаблоны» админской панели и можем использовать переменную $news в любом месте общего шаблона. Конкретно на форуме «Классика» это, например, сделано так:
<!-- рисуем табличку из трех колонок -->
<table border="0" width="$stylevar[outertablewidth]" cellpadding="0" cellspacing="0"align="center">
<tr>
<!-- в первой колонке у нас логотип и ссылка на чат -->
<td width="33%" align="$stylevar[left]" style="border-right-style: solid; border-right-width: 1px">
<p style="text-align: center">
<a href="$vboptions[forumhome].php$session[sessionurl_q]" mce_href="$vboptions[forumhome].php$session[sessionurl_q]"><img
src="$stylevar[titleimage]" mce_src="$stylevar[titleimage]" border="0" alt="$vboptions[bbtitle]" /></a> <br><a href="http://forumklassika.ru/chat/" mce_href="http://forumklassika.ru/chat/"><b><font size="2">Чат</font></b></a>
</p>
</td>
<!— во второй колонке у нас вызов рекламного баннера —>
<td width=»33%» align=»$stylevar[center]»>
<!— start ad class 2 —><p align=»center»>
<!— здесь идет, собственно, код или что угодно, что захочется сюда вставить, либо пустое место —>
</p><!— end ad class 2 —>
</td>
<!— а в третьей колонке у нас, как раз-таки, и показываются новости —>
<td width=»34%» align=»$stylevar[right]»>
$news
</td>
</tr>
</table>
Если вставить такой код в общий шаблон header, то результат будет в точности таким, как на всех страницах форума «Классика». Строго говоря, абсолютно таким же образом можно воткнуть новости в любое место на форуме — для этого надо только поменять в модуле установку «местоположение хака». По умолчанию там стоит global_start, но можно указать все, что угодно, после чего использовать в соответствсующих местах все ту же переменную $news.
Формат вывода новостей и их количество регулируется в самом файле lastposts3.php. Я не стану подробно рассказывать, что там да как — любой человек, который оказался достаточно продвинут для того, чтобы дочитать до этого места, сможет разобраться, как там все сделано. По умолчанию выводится 7 последних сообщений с именами последних ответивших и временем ответа.
Вариант 2. Отображение последних сообщений на страницах, не связанных с форумом.
Как я уже сказал, к сожалению, vBulletin не предоставляет внятных средств для экспорта своих заголовков на другие сайты. В настоящее время я также не нашел и настолько же удобного дополнения, как topics_anywhere. Но в качестве временной (гхм-гхм) меры можно использовать все тот же lastposts3.php. Например, это можно видеть в правой колонке блога, который вы сейчас читаете. Сверху — анонсы хороших концертов, а ниже — «Сейчас на форуме «Классика». Этот список тоже формирует lastposts3.php. Еще одна его копия кладется туда, куда удобно (в данном случае — в корень lifanovsky.com), после чего этот файл с отредактированными под данный конкретный случай настройками вызывается директивой include:
<?php
include(path_to_file/lastposts3.php);
?>
Думаю, что его также можно вставить в страницу и каким-нибудь другим образом, если почему-либо php не подходит. Но вот как это сделать конкретно — я уже не подскажу.
Важный момент заключается в том, что у меня форум и Lifanovsky.com располагаются на одном хостинге и даже на одном аккаунте, соответственно, обращаться к базе я могу сколько угодно. Можно ли сделать так, чтобы брались заголовки с другого хостинга наверняка я не знаю, но думаю, что если там, где расположен форум, разрешено обращаться к базе mysql с удаленного сервера — тогда все будет работать. Если же нет — тогда случай сложный, и чем тут помочь, я не знаю. Думаю, что в этом случае придется дергать более продвинутых разработчиков хаков с vBulletin.Org или же наших соотечественников с vBulletin.com.ru или с vBulletin.net.ru.
Hello! I don’t speak Russian so I have no idea how to find your email address on this website. I was wondering if you offer this website’s theme (the 3-column version) for download somewhere?
Thanks!
Sarit
спасибо, очень хорошо все расписано.
Не за что. 🙂 А у Вас получилось? Нельзя ли ссылку на форум, где еще так сделано? Мне просто было бы интересно посмотреть. Если не жалко, конечно. 😉
А, у меня не вышло. 🙁
Не ставится latest_posts.xml в vBulletin 3.0.1
Выдает ошибку
Invalid or empty style file specified
Посмотрите, что может бить с latest_posts.xml
Очень надо.
Спасибо,
Александр
большое спасяб…
приятно видеть человека, который не жлобится…
при интеграции возникла трабла с тем, что Вобла вещает в Win-1251, а сайт в UTF-8 выводилось не совсем то, что хотелось….
Функция PHP «convert_cyr_string» чавой-то не предусматривает UTF-8 🙁
была нарыта функция Unicode, если у кого проблемы с UTF-8, то в lastposts3.php после
## CUSTOMIZE SETTINGS FOR YOUR SITE ## добавить:
function unicode($str) {
$encode = "";
for ($ii=0;$ii<strlen($str);$ii++) {
$xchr=substr($str,$ii,1);
if (ord($xchr)>191) {
$xchr=ord($xchr)+848;
$xchr="&#" . $xchr . ";";
}
if(ord($xchr) == 168) {
$xchr = "Ё";
}
if(ord($xchr) == 184) {
$xchr = "ё";
}
$encode=$encode . $xchr;
}
return $encode;
}
после строчки: $poster = $thread_get[‘lastposter’];
Добавить: $poster = unicode($poster);
и после: $title = substr($title,0,$txtlimit);
Добавить: $title = unicode($title);
2Boris
можно это и в статью добавить…
причем дописав про convert_cyr_string – там просто.
если че — писАйте на почту…
Александр. На самом деле, я уже забыл. А вообще в версии 3.0.1 сама система плагинов-то уже существует? Или все-таки она появилась только в версии 3.5.
Если так, то я плохо себе представляю, каким образом и куда Вы пытаетесь прикрутить эту xml-ку.
Возможно, я и ошибаюсь. Но если я прав, тогда Вам надо не плагин устанавливать, а руками в админской панели, в том стиле, в котором Вы хотите показывать новости (или во всех), найти в общих шаблонах поле, в которое можно вводить код php. Я бы Вам сказал точно, но я уже не помню сейчас, как это называлось там.
В это поле надо ввести такой код:
ob_start();
require("lastposts3.php");
$news = ob_get_contents();
ob_end_clean();
Кажется, там даже был по умолчанию пример.
То есть не плагин устанавливать, а просто вот такой код ввести, после чего использовать переменную $news так же, как рассказано в моем посте.
А система модулей была как раз введена для того, чтобы облегчить этот процесс, так что на Вашем месте я бы просто проапгрейдил vB до последней версии. Если, конечно, он у Вас не нуленый. 😉
Если совсем ничего выходить не будет — пишите еще, по идее, это все дело двух минут буквально.
Meld, спасибо, тоже приятно слышать. На самом деле я действительно так долго возился с поисками такой штуки, что других людей жалко. 🙂 За дополнение спасибо — добавлю обязательно!
Спасибо за инфу.
Все заработало вроде 🙂
Здравствуйте!
У меня есть проблема 🙁 Каждый день на форуме сбрасывается пароль и приходиться его востонавливать. Как решить проблему?
________
С уважением, Анатолий Сергеев
Анатолий, это неверные настройки cookies, вероятнее всего.
Спасибо, попробую на досуге. Кстати с phpbb на vb не переезжал, а вот опыт переезда на Simple Machines Forum был и он мне понравился едва ли не больше чем все форумы, которые я видел. Рекомендую.