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

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

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

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

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

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

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

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

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

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

Для решения задачи нужно написать всего 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"
);?>

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

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

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

Итог

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

2 комментария

Евгений

Красота какая! Нам бы такое на сайт, давно просят пользователи А подскажите, при обновлении Битрикс, все затрется?

Ответить

Murzix

Не затрётся если выделить код в компонент и вставлять внизу перед футером или с помощью js в нужное место.

Этот код я писал когда только осваивал битрикс :)

Ответить

Ваш отзыв

logo