×

Битрикс: список активных тем форума

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

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

Постановка задачи

Вывести список последних сообщений в «подвале» форума. Задача несложная и решается в несколько строчек. Её можно использовать в качестве учебного примера.

Поиск решения

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

Делаем вывод — нам нужен не список последних сообщений, а список обсуждаемых тем, отсортированный по дате последнего обновления.

Написание компонента

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

Для решения задачи нужно написать всего 3 файлика. Логику в component.php и оформление в виде стандартного шаблона .default содержащего файлы template.php и style.css. Как назвать компонент – дело ваше. На работу это не влияет (т.е. в файле .description.php пишите то, что вам нужно)

Логика (файл component.php)

Получаем список свежеизменённых тем форума отсортировав их по времени последнего изменения и ограничив их количество 15ю.

<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die(); CModule::IncludeModule("forum"); //количество возвращаемых тем форума $arResult["numOfTopics"] = 15; //запрашиваем темы $db_res = CForumTopic::GetListEx(   array(     "LAST_POST_DATE" => "DESC"   ),   array(   ),   false,   $arResult["numOfTopics"]   ); while($ar_res = $db_res->Fetch()){   //если пользователь имеет право доступа к форуму   if(ForumCurrUserPermissions($ar_res["FORUM_ID"]) != "A"){     //записываем в итоговый массив     $arResult["Topics"][] = $ar_res;   } } $this->IncludeComponentTemplate();?>

Можно было бы сделать количество отображаемых тем параметром, и получать его в файле .parameters.php, но я посчитал это лишним.

Оформление, html (файл templates/.default/template.php)

У нас на форуме используется почти стандартный шаблон форума с минимальными косметическими изменениями. В этой ситуации логично использовать стандартные CSS классы оформления, чтобы при изменении общего оформления не пришлось бы менять оформление компонента.

<div class="forum-info-box lastPostBox">   <div class="lastPostTitle">     Последние сообщения на форуме   </div>   <?//если в списке есть темы   if(count($arResult["Topics"]) > 0){     //обходим массив с темами и выводим ссылки     foreach($arResult["Topics"] as $topic){?>       <div class="forum-statistics-users">         <a href="/forum/forum<?=$topic["FORUM_ID"]?>/"><?=substr($topic["FORUM_NAME"], 0, 40)?></a> > <a href="/forum/messages/forum<?=$topic["FORUM_ID"]?>/topic<?=$topic["ID"]?>/message<?=$topic["LAST_MESSAGE_ID"]?>/#message<?=$topic["LAST_MESSAGE_ID"]?>"><?=substr($topic["TITLE"], 0, 40)?></a><em class="change">автор:</em> <?=$topic["LAST_POSTER_NAME"]?>       </div>       <div class="forum-statistics-topics">         <span class="change-date"><?=$topic["LAST_POST_DATE"]?></span>       </div>     <?}   }else{?>     Свежих сообщений нет.   <?}?> </div>

Ссылки я вывожу обычным образом без всякого ЧПУ, но в таком виде, как будто ЧПУ использовался =)

Оформление, css (файл templates/.default/style.css)

Изменения в оформлении минимальны, чуть больше междустрочный интервал, для большей читабельности и выделение жирным заголовка. Для более удобного просмотра списка при наведении курсора строка затеняется.

.lastPostTitle{   font-weight:bold;   padding-bottom: 5px; } .change,.forum-statistics-topics span.change-date{   color:gray;   font-weight: normal;   padding-left:1em;   line-height: 2.3em; } .lastPostBox .forum-statistics-topics:hover{   background-color: #eeeded; }

Вывод компонента

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

В стандартном комплексном компоненте битрикса этот функционал содержится в компоненте forum.statistic, следовательно, в шаблон именно этого компонента нужно добавлять код вызова нашего компонента. Для этого нужно отредактировать файл /bitrix/templates/название шаблона сайта/components/bitrix/forum/название шаблона форума/bitrix/forum.statistic/.default/template.php

Я назвал компонент forum.messages.last и разместил его в пространстве имён custom, поэтому у меня получился вот такой код вызова:

<?$APPLICATION->IncludeComponent(   "custom:forum.messages.last",   ".default" );?>

Добавив этот код в указанный выше файл мы получаем вот такой список:

Список последних обновлений на форуме

Список последних обновлений на форуме

Итог

В результате пользователи довольны, а мы потратили минимальное количество времени.

logo