Татьяна5, спасибо, но это не то, чего хотелось, поскольку первое сообщение желтеет только через полторы секунды после загрузки и отображения страницы. Это даже меня пугает, а уж пользователей и подавно. Поэтому пришлось покопаться и сделать, чтобы закреплённое сообщение было выделено уже в HTML-тексте страницы.
Очень не хотел лезть в PHP текст
rxu. Для это надо, чтобы во
viewtopic_body.html
были переданы поля из базы данных
_forums.first_post_always_show
,
_topics.topic_first_post_show
, но мне не удалось их там хоть в каком-то виде обнаружить. Аналога переменной postrow для topic и forum тоже не нашёл. Так что,
rxu, извините, пожалуйста, пришлось для себя дополнить Ваш текст PHP.
Итак, я изменил три файла:
1)
/styles/prosilver/theme/colours.css
- находим стиль фона
bg1:
и перед ним добавляем свой новый стиль
bg0, в котором будет указан цвет фона для закреплённого сообщения:
Цвет #EFEED9 я взял из стиля цитаты второго уровня. Он чуть бледнее того, что на hover для списка форумов.
2)
/styles/prosilver/template/viewtopic_body.html
здесь надо добавить условие, при котором сообщение будет иметь цвет фона bg0, если на странице есть закреплённое и оно первое. Для этого находим контекст:
Код: Выделить всё
<!-- IF postrow.S_ROW_COUNT is odd -->bg1<!-- ELSE -->bg2<!-- ENDIF -->
и заменяем его на:
Код: Выделить всё
<!-- IF S_FIRST_POST_SHOW*postrow.S_FIRST_ROW -->bg0<!-- ELSEIF postrow.S_ROW_COUNT is odd -->bg1<!-- ELSE -->bg2<!-- ENDIF -->
После этого в админке форума надо "Очистить кэш", чтобы изменения вступили в силу.
3)
/ext/rxu/FirstPostOnEveryPage/event/listener.php
тут надо добавить переменную, передаваемую в HTML для распознавания, было ли на этой странице закреплено сообщение. Если совсем по минимуму вносить изменения, то достаточно в функцию
modify_viewtopic_post_list
после строки:
добавить строку:
Код: Выделить всё
$this->template->assign_vars(array('S_FIRST_POST_SHOW' => $topic_data['topic_first_post_show'] || $topic_data['first_post_always_show']));
И всё, после этого должно заработать.
Но я там ещё немного поковырялся и нашёл в функции
modify_viewtopic_post_list
, что не все строчки на своих местах, поэтому переписал её для себя иначе. Было:
Код: Выделить всё
public function modify_viewtopic_post_list($event)
{
$post_list = $event['post_list'];
$topic_data = $event['topic_data'];
$sql_ary = $event['sql_ary'];
if (($topic_data['topic_first_post_show'] || $topic_data['first_post_always_show']) && ($post_list[0] != (int) $topic_data['topic_first_post_id']))
{
foreach ($post_list as $key => $value)
{
$post_list[$key+1] = $value;
}
$post_list[0] = (int) $topic_data['topic_first_post_id'];
$this->template->assign_vars(array('S_FIRST_POST_SHOW' => 1));
}
$sql_ary['WHERE'] = $this->db->sql_in_set('p.post_id', $post_list) . ' AND u.user_id = p.poster_id';
$event['post_list'] = $post_list;
$event['sql_ary'] = $sql_ary;
}
стало:
Код: Выделить всё
public function modify_viewtopic_post_list($event)
{
$topic_data = $event['topic_data'];
$topic_first_post_id = (int) $topic_data['topic_first_post_id'];
$first_post_show = $topic_data['topic_first_post_show'] + $topic_data['first_post_always_show'];
$this->template->assign_vars(array('S_FIRST_POST_SHOW' => $first_post_show));
if ($first_post_show * ($event['post_list'][0] - $topic_first_post_id))
{
$post_list[0] = $topic_first_post_id;
foreach ($event['post_list'] as $key => $value) $post_list[++$key] = $value;
$event['post_list'] = $post_list;
$sql_ary = $event['sql_ary'];
$sql_ary['WHERE'] = $this->db->sql_in_set('p.post_id', $post_list) . ' AND u.user_id = p.poster_id';
$event['sql_ary'] = $sql_ary;
}
}
Больше всего хотелось бы заменить конструкцию
foreach
функциями работы с массивами, но эксперименты показали, что существенного уменьшения времени обработки (на 10-20 элементах-то) не наблюдается, так что, оставил то, что очевидней.