Затащить работников организации на рабочий форум задача не простая. В связи с этим очень важно учитывать пожелания по необходимому функционалу и оформлению.
Наши работники захотели получить список последних сообщений на форуме, т.к. с помощью этого списка легко можно попасть в активное обсуждение, не прибегая к поиску.
Постановка задачи
Вывести список последних сообщений в «подвале» форума. Задача несложная и решается в несколько строчек. Её можно использовать в качестве учебного примера.
Поиск решения
Если посмотреть на форумы, где этот функционал реализован, то несложно заметить что список последних сообщений выводится редко. Оно и понятно, одно активное обсуждение в популярной теме быстро заполнит весь список, вытеснив оттуда другие темы.
Делаем вывод — нам нужен не список последних сообщений, а список обсуждаемых тем, отсортированный по дате последнего обновления.
Написание компонента
Чтобы не добавлять лишнюю логику в оформление форума мы напишем свой маленький компонентик, который будет выводить нужную нам информацию, а потом подключим его туда, где мы хотим видеть эту информацию. Если вы еще ни разу не писали компоненты, то стоит почитать вот это руководство
Для решения задачи нужно написать всего 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"
);?>
Добавив этот код в указанный выше файл мы получаем вот такой список:
Итог
В результате пользователи довольны, а мы потратили минимальное количество времени.
Не затрётся если выделить код в компонент и вставлять внизу перед футером или с помощью js в нужное место.
Этот код я писал когда только осваивал битрикс :)
Ответить