First post on every pageмод позволяет "закреплять" первое сообщение в теме на всех её страницах.
(Переводить тему в режим "закрепления первого сообщения темы" может тот, кто имеет право её редактировать, то есть сам автор и админ (модераторы - если имеют такое право)).
Никаких файлов копировать на сервер не надо - только редактировать и сделать SQL-запрос для создания таблиц в базе данных.
Сделать SQL-запрос:
Код: Выделить всё
ALTER TABLE phpbb_topics ADD topic_first_post_show TINYINT(1) UNSIGNED DEFAULT '0' NOT NULL;Для тех, кто "не сильно дружит" с запросами к базе, возможен иной вариант:
Скачать установщик:
Вложение:
db_update.rar [1.26 КБ]
Скачиваний: 1
распаковать и файл
db_update.php закачать в корень сайта (где файл congig.php),
после этого запустить скрипт через браузер по адресу
после отработки скрипта удалить его с сервера.
Теперь редактируем файлы форума:
Открыть
posting.phpНайти
Вставить после найденного
Код: Выделить всё
$post_data['topic_first_post_show'] = (isset($post_data['topic_first_post_show'])) ? $post_data['topic_first_post_show'] : 0;Найти
Код: Выделить всё
$poll_delete = (isset($_POST['poll_delete'])) ? true : false;Вставить после найденного
Код: Выделить всё
$topic_first_post_show = (isset($_POST['topic_first_post_show'])) ? true : false;Найти
Код: Выделить всё
// Check the permissions for post approval. Moderators are not affected.Вставить перед найденным
Код: Выделить всё
// Show/Unshow first post on every page
if(($mode == 'edit' && $post_id == $post_data['topic_first_post_id']) || $mode == 'post')
{
if($mode == 'post')
{
$topic_id = $data['topic_id'];
}
$perm_show_unshow = ($auth->acl_get('m_lock', $forum_id) || ($auth->acl_get('f_user_lock', $forum_id) && $user->data['is_registered'] && !empty($post_data['topic_poster']) && $user->data['user_id'] == $post_data['topic_poster'])) ? true : false;
if($post_data['topic_first_post_show'] != $topic_first_post_show && $perm_show_unshow)
{
$sql = 'UPDATE ' . TOPICS_TABLE . '
SET topic_first_post_show = ' . (($topic_first_post_show) ? 1 : 0) . "
WHERE topic_id = $topic_id";
$db->sql_query($sql);
}
}
Найти
Вставить перед найденным
Код: Выделить всё
// Do show show first post on every page checkbox only in first post
$first_post_show_allowed = false;
if(($mode == 'edit' && $post_id == $post_data['topic_first_post_id']) || $mode == 'post')
{
$first_post_show_allowed = true;
}
Найти
Код: Выделить всё
$lock_post_checked = (isset($post_lock)) ? $post_lock : $post_data['post_edit_locked'];Вставить после найденного
Код: Выделить всё
$first_post_show_checked = (isset($post_data['topic_first_post_show'])) ? $post_data['topic_first_post_show'] : 0;Найти
Вставить после найденного
Код: Выделить всё
'S_FIRST_POST_SHOW_ALLOWED' => ($first_post_show_allowed && ($auth->acl_get('m_lock', $forum_id) || ($auth->acl_get('f_user_lock', $forum_id) && $user->data['is_registered'] && !empty($post_data['topic_poster']) && $user->data['user_id'] == $post_data['topic_poster']))) ? true : false,
'S_FIRST_POST_SHOW_CHECKED' => ($first_post_show_checked) ? ' checked="checked"' : '',Открыть
viewtopic.phpНайти
Код: Выделить всё
$i = ($store_reverse) ? $sql_limit - 1 : 0;Вставить после найденного
Код: Выделить всё
// First post on every page
// Show first post on every page if needed
// For the case the user is trying to reach the first half of the topic
if ($topic_data['topic_first_post_show'] && ($start != 0))
{
if (!$store_reverse)
{
$post_list[$i] = (int) $topic_data['topic_first_post_id'];
}
$i++;
}Найти
Код: Выделить всё
($store_reverse) ? $i-- : $i++;
}
$db->sql_freeresult($result);Вставить после найденного
Код: Выделить всё
// First post on every page
// Show first post on every page if needed
// For the case the user is trying to reach the second half of the topic
if ($topic_data['topic_first_post_show'] && ($start != 0) && $store_reverse)
{
$post_list[$i] = (int) $topic_data['topic_first_post_id'];
}

EN языковые правки
Открыть
language/en/common.phpНайти
Вставить после найденного
Код: Выделить всё
'FIRST_POST_SHOW' => 'Show on top of every page',

RU языковые правки
Открыть
language/ru/common.phpНайти
Вставить перед найденным
Код: Выделить всё
'FIRST_POST_SHOW' => 'Первое сообщение на каждой странице темы',

для стилей на основе prosilver
Открыть
styles/prosilver/template/posting_editor.htmlНайти
Код: Выделить всё
<!-- IF S_LOCK_POST_ALLOWED -->
<div><label for="lock_post"><input type="checkbox" name="lock_post" id="lock_post"{S_LOCK_POST_CHECKED} /> {L_LOCK_POST} [{L_LOCK_POST_EXPLAIN}]</label></div>
<!-- ENDIF -->Вставить после найденного
Код: Выделить всё
<!-- IF S_FIRST_POST_SHOW_ALLOWED -->
<div><label for="topic_first_post_show"><input type="checkbox" name="topic_first_post_show" id="topic_first_post_show"{S_FIRST_POST_SHOW_CHECKED} /> {L_FIRST_POST_SHOW} </label></div>
<!-- ENDIF -->

для стилей на основе subsilver2
Открыть
styles/subsilver2/template/posting_body.htmlНайти
Код: Выделить всё
<!-- IF S_LOCK_POST_ALLOWED -->
<tr>
<td><input type="checkbox" class="radio" name="lock_post"{S_LOCK_POST_CHECKED} /></td>
<td class="gen">{L_LOCK_POST} [{L_LOCK_POST_EXPLAIN}]</td>
</tr>
<!-- ENDIF -->Вставить после найденного
Код: Выделить всё
<!-- IF S_FIRST_POST_SHOW_ALLOWED -->
<tr>
<td><input type="checkbox" class="radio" name="topic_first_post_show"{S_FIRST_POST_SHOW_CHECKED} /></td>
<td class="gen">{L_FIRST_POST_SHOW}</td>
</tr>
<!-- ENDIF -->

небольшой мод для изменения внешнего вида закреплённого сообщения
Открыть
viewtopic.phpНайти
Код: Выделить всё
'U_TOPIC' => "{$server_path}viewtopic.$phpEx?f=$forum_id&t=$topic_id",Вставить после найденного
Код: Выделить всё
'S_TOPIC_FIRST_POST_SHOW' => ($topic_data['topic_first_post_show'] == 1) ? true : false, для стилей на основе prosilver:
Открыть
styles/prosilver/template/viewtopic_body.htmlНайти (может быть приведена только часть строки)
Часть строки
Заменить часть строки на
Код: Выделить всё
<!-- IF S_TOPIC_FIRST_POST_SHOW and postrow.S_ROW_COUNT eq 0 -->bg3<!-- ELSEIF postrow.S_ROW_COUNT is odd -->Найти
Вставить после найденного
Код: Выделить всё
<!-- IF S_TOPIC_FIRST_POST_SHOW and postrow.S_ROW_COUNT eq 0 --><br /><br /><!-- ENDIF --> для стилей на основе subsilver2:
Открыть
styles/subsilver2/template/viewtopic_body.htmlНайти
Код: Выделить всё
<!-- IF postrow.S_ROW_COUNT is even --><tr class="row1"><!-- ELSE --><tr class="row2"><!-- ENDIF -->Заменить найденное на
Код: Выделить всё
<!-- IF S_TOPIC_FIRST_POST_SHOW and postrow.S_ROW_COUNT eq 0 --><tr class="row3"><!-- ELSEIF postrow.S_ROW_COUNT is even --><tr class="row1"><!-- ELSE --><tr class="row2"><!-- ENDIF -->Найти
Код: Выделить всё
<!-- IF postrow.S_ROW_COUNT is even --><tr class="row1"><!-- ELSE --><tr class="row2"><!-- ENDIF -->Заменить найденное на
Код: Выделить всё
<!-- IF S_TOPIC_FIRST_POST_SHOW and postrow.S_ROW_COUNT eq 0 --><tr class="row3"><!-- ELSEIF postrow.S_ROW_COUNT is even --><tr class="row1"><!-- ELSE --><tr class="row2"><!-- ENDIF -->Найти
Код: Выделить всё
<!-- IF postrow.S_ROW_COUNT is even --><tr class="row1"><!-- ELSE --><tr class="row2"><!-- ENDIF -->Заменить найденное на
Код: Выделить всё
<!-- IF S_TOPIC_FIRST_POST_SHOW and postrow.S_ROW_COUNT eq 0 --><tr class="row3"><!-- ELSEIF postrow.S_ROW_COUNT is even --><tr class="row1"><!-- ELSE --><tr class="row2"><!-- ENDIF -->Найти
Вставить перед найденным
Код: Выделить всё
<!-- IF S_TOPIC_FIRST_POST_SHOW and postrow.S_ROW_COUNT eq 0 --><br /><br /><!-- ENDIF -->За оформление "закреплённого блока" будут отвечать классы
для prosilver:
bg3для subsilver:
row3Если у вас такие уже используются - поставьте другие и пропишите в стилевом файле (css).
Завершение установки:
Почистите кэш и всё. Тема закрепляется путём установки "галочки" при создании темы в поле
Первое сообщение на каждой странице темы (под полем ввода).
Само собой, мод для "красивости" оформления можно и не ставить.