Topic Image phpbb 3
модификация позволяет вывести картинку из первого поста темы в список тем, как картинку самой темы. картинка выбирается при создании темы. имеются настройки в админке. модификация создана ещё для версии 3.0.7, но я её протестировал на 3.0.14 - всё нормально работает.
17 ноября 2022 года в целях проверки установил здесь эту модификацию. её работу вы можете посмотреть в списке тем раздела "Модификации" - эта тема, наведите на значок # (я переделал вывод под себя - чтобы место не занимало на странице).
единственное уточнение: при установке мода много правок изменяют предыдущую конфигурацию файлов и прописано предупреждение об опасности установки на "живой форум", то есть рабочий. после изменений могут нарушится какие-либо функции форума. желательно ставить на "чистый". перед созданием.
я сейчас установил на старый форум со множеством тем. в принципе всё работает. если прописывать правки вручную, не затрагивая изменения, уже сделанные в файлах форума - можно поставить и на рабочий и пользоваться.

сканы модификации:
Если кого заинтересовало - ставим.
не забывайте делать бэкап базы данных и файлов - очень помогает при ошибках.
Скачать модификацию из файлового архива сайта:
Скачать из файлового архива сайта
содержимое папки root необходимо закачать на сервер, в папку сайта, где файл config.php.
Теперь необходимо провести SQL-запрос:
не знаю почему, что все запросы написаны отдельно, а не одной установкой. я их так раздельно и проводил.
Код: Выделить всё
INSERT INTO `phpbb_acl_options` (auth_option, is_global, is_local, founder_only) VALUES ('f_topic_image', 0, 1, 0);
Код: Выделить всё
INSERT INTO `phpbb_config` VALUES ('img_max_topic_image_width', 150, 0);
Код: Выделить всё
INSERT INTO `phpbb_config` VALUES ('img_max_topic_image_height', 100, 0);
Код: Выделить всё
ALTER TABLE `phpbb_attachments` ADD topic_image tinyint(1) UNSIGNED NOT NULL DEFAULT 0;
Код: Выделить всё
ALTER TABLE `phpbb_forums` ADD forum_allow_topic_image TINYINT(1) NOT NULL DEFAULT 0;
Код: Выделить всё
ALTER TABLE `phpbb_topics` ADD topic_image_id MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT 0;
Код: Выделить всё
UPDATE phpbb_attachments SET topic_image = 1 WHERE in_message = 0 AND post_msg_id IN (SELECT topic_first_post_id FROM phpbb_topics WHERE topic_attachment = 1)
установил на сайт генератор SQL запроса и сделал установочный файл (кто не хочет делать запрос вручную или у кого проблемы.
Дальше редактируем файлы:
Код: Выделить всё
<label><input type="radio" class="radio" name="display_recent" value="0"<!-- IF not S_DISPLAY_ACTIVE_TOPICS --> id="display_recent" checked="checked"<!-- ENDIF --> /> {L_NO}</label></dd>
</dl>
Вставить после найденного
Код: Выделить всё
<dl>
<dt><label for="forum_allow_topic_image">{L_ALLOW_TOPICS_IMAGES}:</label><br /><span>{L_ALLOW_TOPICS_IMAGES_EXPLAIN}</span></dt>
<dd><label><input type="radio" class="radio" name="forum_allow_topic_image" value="1"<!-- IF S_ALLOW_TOPICS_IMAGES --> id="forum_allow_topic_image" checked="checked"<!-- ENDIF --> /> {L_YES}</label>
<label><input type="radio" class="radio" name="forum_allow_topic_image" value="0"<!-- IF not S_ALLOW_TOPICS_IMAGES --> id="forum_allow_topic_image" checked="checked"<!-- ENDIF --> /> {L_NO}</label></dd>
</dl>
Код: Выделить всё
$thumbnail = request_var('t', false);
Заменить найденное на
Код: Выделить всё
$thumbnail = request_var('t', 0);
Код: Выделить всё
$sql = 'SELECT attach_id, in_message, post_msg_id, extension, is_orphan, poster_id, filetime
Заменить найденное на
Код: Выделить всё
$sql = 'SELECT attach_id, in_message, post_msg_id, extension, is_orphan, poster_id, mimetype, filetime, topic_image
Код: Выделить всё
if ((!$attachment['in_message'] && !$config['allow_attachments']) || ($attachment['in_message'] && !$config['allow_pm_attach']))
Вставить перед найденным
Код: Выделить всё
if (!($config['img_max_topic_image_width'] > 0 && $config['img_max_topic_image_height'] > 0) || ($thumbnail == 2 && !$attachment['topic_image']))
{
header('HTTP/1.0 403 Forbidden');
trigger_error($user->lang['LINKAGE_FORBIDDEN']);
}
Код: Выделить всё
if ($thumbnail)
Заменить найденное на
Код: Выделить всё
if ($thumbnail == 2)
{
$filename = $phpbb_root_path . $config['upload_path'] . '/topic_image_' . $attachment['physical_filename'];
if (!@file_exists($filename))
{
@include_once($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
if (create_thumbnail($phpbb_root_path . $config['upload_path'] . '/' . $attachment['physical_filename'], $filename, $attachment['mimetype'], true))
{
$attachment['physical_filename'] = 'topic_image_' . $attachment['physical_filename'];
}
}
else
{
$attachment['physical_filename'] = 'topic_image_' . $attachment['physical_filename'];
}
}
elseif ($thumbnail)
Код: Выделить всё
'legend2' => 'POSTING',
Вставить перед найденным
Код: Выделить всё
'img_max_topic_image_width' => array('lang' => 'MAX_TOPIC_IMG_WIDTH', 'validate' => 'int:0', 'type' => 'text:5:4', 'explain' => true, 'append' => ' ' . $user->lang['PIXEL']),
'img_max_topic_image_height' => array('lang' => 'MAX_TOPIC_IMG_HEIGHT', 'validate' => 'int:0', 'type' => 'text:5:4', 'explain' => true, 'append' => ' ' . $user->lang['PIXEL']),
Код: Выделить всё
'forum_password_confirm'=> '',
Вставить после найденного
Код: Выделить всё
'forum_allow_topic_image'=> false,
Код: Выделить всё
'S_ENABLE_QUICK_REPLY' => ($forum_data['forum_flags'] & FORUM_FLAG_QUICK_REPLY) ? true : false,
Вставить после найденного
Код: Выделить всё
'S_ALLOW_TOPICS_IMAGES' => ($forum_data['forum_allow_topic_image']) ? true : false,
Код: Выделить всё
'forum_password_unset' => request_var('forum_password_unset', false),
Вставить после найденного
Код: Выделить всё
'forum_allow_topic_image' => request_var('forum_allow_topic_image', false),
Код: Выделить всё
'user_icon1', 'user_icon2', 'user_icon3', 'user_icon4', 'user_icon5', 'user_icon6', 'user_icon7', 'user_icon8', 'user_icon9', 'user_icon10',
В этой строке после
Код: Выделить всё
'user_icon10',
Вставить
Код: Выделить всё
'topic_image_no_photo',
Код: Выделить всё
$sql = 'SELECT post_msg_id, topic_id, in_message, physical_filename, thumbnail, filesize, is_orphan
Заменить найденное на
Код: Выделить всё
$sql = 'SELECT post_msg_id, topic_id, in_message, physical_filename, thumbnail, filesize, is_orphan, topic_image
Код: Выделить всё
$physical[] = array('filename' => $row['physical_filename'], 'thumbnail' => $row['thumbnail'], 'filesize' => $row['filesize'], 'is_orphan' => $row['is_orphan']);
В данной строке найти
Код: Выделить всё
);
и перед найденным кодом вписать
Код: Выделить всё
, 'topic_image' => $row['topic_image']
Код: Выделить всё
if ($file_ary['thumbnail'])
Вставить перед найденным
Код: Выделить всё
if ($file_ary['topic_image'])
{
phpbb_unlink($file_ary['filename'], 'topic_image', true);
}
Код: Выделить всё
$filename = ($mode == 'thumbnail') ? 'thumb_' . utf8_basename($filename) : utf8_basename($filename);
Заменить найденное на
Код: Выделить всё
switch($mode)
{
case 'thumbnail': $filename = 'thumb_' . utf8_basename($filename); break;
case 'topic_image': $filename = 'topic_image_' . utf8_basename($filename); break;
default: $filename = utf8_basename($filename); break;
}
Код: Выделить всё
function create_thumbnail($source, $destination, $mimetype)
Заменить найденное на
Код: Выделить всё
function create_thumbnail($source, $destination, $mimetype, $for_topic_image = false)
Код: Выделить всё
if (!$img_filesize || $img_filesize <= $min_filesize)
Заменить найденное на
Код: Выделить всё
if (!$for_topic_image && (!$img_filesize || $img_filesize <= $min_filesize))
Код: Выделить всё
list($new_width, $new_height) = get_img_size_format($width, $height);
Заменить найденное на
Код: Выделить всё
list($new_width, $new_height) = ($for_topic_image) ? get_img_size_format_for_topic_image($width, $height) : get_img_size_format($width, $height);
Код: Выделить всё
function get_img_size_format($width, $height)
Вставить перед найденным
Код: Выделить всё
function get_img_size_format_for_topic_image($pw, $ph)
{
global $config;
$nw = ($config['img_max_topic_image_width']) ? $config['img_max_topic_image_width'] : 150;
$nh = ($config['img_max_topic_image_height']) ? $config['img_max_topic_image_height'] : 100;
$wr = $nw/$pw;
$hr = $nh/$ph;
return array(round(min($wr,$hr)*$pw),round(min($wr,$hr)*$ph));
}
Код: Выделить всё
'ASSOC_INDEX' => $count,
Вставить после найденного
Код: Выделить всё
'S_IMAGE' => (strpos($attach_row['mimetype'], 'image') === 0),
Код: Выделить всё
'topic_attachment' => (!empty($data['attachment_data'])) ? 1 : 0,
Вставить после найденного
Код: Выделить всё
'topic_image_id' => $data['topic_image_id'],
Код: Выделить всё
'topic_attachment' => (!empty($data['attachment_data'])) ? 1 : (isset($data['topic_attachment']) ? $data['topic_attachment'] : 0),
Вставить после найденного
Код: Выделить всё
'topic_image_id' => $data['topic_image_id'],
Код: Выделить всё
function parse_attachments($form_name, $mode, $forum_id, $submit, $preview, $refresh, $is_message = false)
Заменить найденное на
Код: Выделить всё
function parse_attachments($form_name, $mode, $forum_id, $submit, $preview, $refresh, $is_message = false, $allow_topic_image = false)
Код: Выделить всё
'poster_id' => $user->data['user_id'],
Вставить после найденного
Код: Выделить всё
'topic_image' => ($allow_topic_image && (strpos($filedata['mimetype'], 'image') === 0)) ? 1 : 0,
Код: Выделить всё
$sql = 'SELECT attach_id, physical_filename, thumbnail
Заменить найденное на
Код: Выделить всё
$sql = 'SELECT attach_id, physical_filename, thumbnail, topic_image
Код: Выделить всё
phpbb_unlink($row['physical_filename'], 'file');
Вставить после найденного
Код: Выделить всё
if ($row['topic_image'])
{
phpbb_unlink($row['physical_filename'], 'topic_image');
}
Код: Выделить всё
'poster_id' => $user->data['user_id'],
Вставить после найденного
Код: Выделить всё
'topic_image' => ($allow_topic_image && (strpos($filedata['mimetype'], 'image') === 0)) ? 1 : 0,
Код: Выделить всё
'real_filename' => $filedata['real_filename'],
Вставить после найденного
Код: Выделить всё
'mimetype' => $filedata['mimetype'],
Код: Выделить всё
'real_filename' => $filedata['real_filename'],
Вставить после найденного
Код: Выделить всё
'mimetype' => $filedata['mimetype'],
Код: Выделить всё
// Get the attachment data, based on the poster id...
$sql = 'SELECT attach_id, is_orphan, real_filename, attach_comment
Заменить найденное на
Код: Выделить всё
// Get the attachment data, based on the poster id...
$sql = 'SELECT attach_id, is_orphan, real_filename, attach_comment, mimetype
Код: Выделить всё
{
$sql = 'SELECT attach_id, is_orphan, real_filename, attach_comment
Заменить найденное на
Код: Выделить всё
{
$sql = 'SELECT attach_id, is_orphan, real_filename, attach_comment, mimetype
Код: Выделить всё
// Do not change to SELECT *
$sql = 'SELECT attach_id, is_orphan, attach_comment, real_filename
Заменить найденное на
Код: Выделить всё
// Do not change to SELECT *
$sql = 'SELECT attach_id, is_orphan, attach_comment, real_filename, mimetype
Код: Выделить всё
'topic_time_limit' => 0,
Вставить после найденного
Код: Выделить всё
'topic_image_id' => 0,
Код: Выделить всё
$post_data['topic_time_limit'] = request_var('topic_time_limit', (($mode != 'post') ? (int) $post_data['topic_time_limit'] : 0));
Вставить после найденного
Код: Выделить всё
if (($config['img_max_topic_image_width'] > 0 && $config['img_max_topic_image_height'] > 0) && ($post_data['forum_allow_topic_image'] == 1 && $auth->acl_get('f_topic_image', $forum_id)) && ($mode == 'post' || ($mode == 'edit' && $post_id == $post_data['topic_first_post_id'])))
{
$topic_image_id_default = ($mode != 'post') ? (int) $post_data['topic_image_id'] : 0;
$topic_image_id = request_var('topic_image_id', $topic_image_id_default);
if ($topic_image_id)
{
$post_data['topic_image_id'] = $topic_image_id_default;
foreach($message_parser->attachment_data as $att_arr)
{
if (($att_arr['attach_id'] == $topic_image_id) && (strpos($att_arr['mimetype'], 'image') === 0)) $post_data['topic_image_id'] = $topic_image_id;
}
}
else
{
$post_data['topic_image_id'] = 0;
}
}
Код: Выделить всё
$message_parser->parse_attachments('fileupload', $mode, $forum_id, $submit, $preview, $refresh);
Заменить найденное на
Код: Выделить всё
$message_parser->parse_attachments('fileupload', $mode, $forum_id, $submit, $preview, $refresh, false , true);
Код: Выделить всё
'topic_time_limit' => (int) $post_data['topic_time_limit'],
Вставить после найденного
Код: Выделить всё
'topic_image_id' => (int) $post_data['topic_image_id'],
Код: Выделить всё
'S_FORM_ENCTYPE' => $form_enctype,
Вставить после найденного
Код: Выделить всё
'S_ALLOW_TOPICS_IMAGES' => ($config['img_max_topic_image_width'] > 0 && $config['img_max_topic_image_height'] > 0) && ($post_data['forum_allow_topic_image'] == 1 && $auth->acl_get('f_topic_image', $forum_id)) && ($mode == 'post' || ($mode == 'edit' && $post_id == $post_data['topic_first_post_id'])),
'U_PREVIEW_TOPIC_IMAGE' => "{$phpbb_root_path}download/file.$phpEx?t=2&id=",
'S_TOPIC_IMAGE_MW' => ($config['img_max_topic_image_width']) ? $config['img_max_topic_image_width'] : 150,
'S_TOPIC_IMAGE_MH' => ($config['img_max_topic_image_height']) ? $config['img_max_topic_image_height'] : 100,
'S_TOPIC_IMAGE_ID' => $post_data['topic_image_id'],
Код: Выделить всё
$sql_approved = ($auth->acl_get('m_approve', $forum_id)) ? '' : 'AND t.topic_approved = 1';
Вставить перед найденнным
Код: Выделить всё
if ($config['allow_attachments'] && $auth->acl_get('f_download', $forum_id))
{
$sql_array['LEFT_JOIN'][] = array('FROM' => array(ATTACHMENTS_TABLE => 'a'), 'ON' => 'a.attach_id = t.topic_image_id AND a.topic_id = t.topic_id');
$sql_array['SELECT'] .= ', a.topic_image';
}
Код: Выделить всё
'S_VIEWFORUM' => true,
Вставить после найденного
Код: Выделить всё
'S_ALLOW_TOPICS_IMAGES' => ($config['img_max_topic_image_width'] > 0 && $config['img_max_topic_image_height'] > 0) && $forum_data['forum_allow_topic_image'] == 1,
'S_TOPIC_IMAGE_MW' => (($config['img_max_topic_image_width']) ? $config['img_max_topic_image_width'] : 150) + 8,
Код: Выделить всё
$s_type_switch = 0;
Заменить найденное на
Код: Выделить всё
$s_type_switch = $ti_cnt = 0;
Код: Выделить всё
// Send vars to template
$template->assign_block_vars('topicrow', array(
Вставить перед найденным
Код: Выделить всё
if ($row['topic_image_id'] && $row['topic_image']) $ti_cnt++;
Код: Выделить всё
'TOPIC_TYPE' => $topic_type,
Вставить после найденного
Код: Выделить всё
'TOPIC_IMAGE_LINK' => ($row['topic_image_id'] && $row['topic_image']) ? "{$phpbb_root_path}download/file.$phpEx?t=2&id={$row['topic_image_id']}" : '',
Код: Выделить всё
unset($rowset[$topic_id]);
}
Вставить после найденного
Код: Выделить всё
$template->assign_vars(array(
'S_TOPICS_WITH_IMAGES' => $ti_cnt,
));
Всё. теперь необходимо очистить кэши (тем, шаблонов, изображений). установка завершена.
мод имеет выбор прав доступа. то есть в админке можно указать какая именно группа может пользоваться этой функцией. в начале страницы на сканах это показано. путь установки прав: Права доступа - Форумные права групп - Группа - Форум - Расширенные права - Может назначать изображения темам.
так же мод имеет настройки вывода. вкл/выкл применения в определённых форумах и настройки миниатюры изображения в списке тем.
это настраивается в аминке по пути:
Форумы - определённый форум - настройки - изображения тем (включить). по умолчанию выключено.
Размещение сообщений - Максимальная высота/ширина изображения темы. (по умолчанию стоит 100/150)
сканы настройки прилагаются в начале страницы.
удачного применения.
p.s. если ставить строго по инструкции - багов быть не должно. запускается сразу.
если кого заинтересовало как сделан вывод модификации здесь в списке тем, то вот так (я сделал для стиля subsilver2, но, думаю, работать будет и на prosilver):
ещё немного дополнений. как я заметил в ходе эксплуатации мода - он в файле редактирования/создания темы (posting) выводит выбранное для темы сайта изображение в большом виде (видимо от настроек изображения всплывашки), что, бывает, "ломает" страницу вывода редактирования темы.
если у кого такая же проблема - её можно очень легко решить, введя жёсткие размеры в код вывода изображения.
Открыть posting_attach_body.html
В строку
Код: Выделить всё
obj2.innerHTML = '<img src="'+_topic_image_preview+n+'" />
добавить размер ширины, например так
Код: Выделить всё
obj2.innerHTML = '<img src="'+_topic_image_preview+n+'" width="100" />
то есть ширина выводимого изображения будет 100px, в не зависимости от того, что прописано в настройках.