Страница 1 из 1

Вывод последних активных тем (компактная версия)

Добавлено: 21 янв 2014, 02:15
ursego
Хочу описать простой мод, выводящий активные темы (т.е. темы, в которых появились последние сообщения). Можете глянуть на морду моего форума ("ПОСЛЕДНЯЯ АКТИВНОСТЬ НА ФОРУМЕ") чтоб лицезреть как сия краса выглядит. Клик по теме перекидывает на её первое непрочитанное сообщение (ну, а незарегистрированных юзеров - на начало темы) в новой вкладке браузера. Мод напоминает известный "Top Five", но имеет некоторые отличия.

Преимущества по сравнению с "Top Five":

1. Блок очень компактен и его не жалко запихнуть на видное место - он может занимать мало места по горизонтали (а "Top Five" крадёт всё пространство - если его сжать, то его содержимое превратится в бардак). В нём дана ТОЛЬКО сама необходимая инфа - название темы, к-во сообщений и время последнего сообщения (причём независимо от дефолтного формата даты/времени будет выводиться в формате "3 минуты назад", что позволяет показать случайномуи посетителю, что форум активен - конечно, если он активен; в моде "Top Five" эта архиважная информация похоронена среди кучи не нужной).

2. Это джаваскрипт, который может быть вписан в HTML любого сайта - даже не связанного с форумом физически. Вот как это выглядит на моём стареньком персональном сайтике ("Последние активные темы на форуме").

3. Можно высвечивать начало первого сообщения темы (лично мне это не надо, но, может, кому-то понравится).

Недостатки по сравнению с "Top Five":

1. Скрипт игнорирует права доступа и тупо высвечивает топики из тех подфорумов, которые ему указали (или игнорирует те, что приказано игнорировать).

2. Это джаваскрипт, что в принципе не есть хорошо (хотя больше теоретически, чем на практике).

3. Невозможно установить мод всплывающей подсказки (mouse hoover).

Но я охотно хаваю все эти недостатки из-за одного первого преимущества.

Итак, что надо сделать.

ШАГ 1 - создать в корневой папке форума файл с именем recent.php и следующим текстом:

Код: Выделить всё

<?php
/** 
*
* @package phpBB3
* @version $Id: recent.php,v 1.1.2 2007/08/21 23:21:39 rxu Exp $
* @copyright (c) 2005 phpBB Group 
* @license http://opensource.org/licenses/gpl-license.php GNU Public License 
*
*/

/**
* Page of the MOD: http://bb3x.ru/mods/info/40
*/

/* Config section */
$cfg_ignore_forums = '24,47';		// forums to ignore: 24=Zhenskij Salon, 47=Korzina
$cfg_only_forums = ''; 			// ids of forums you only want to display, separated by commas or empty
$cfg_nm_topics = 18;			// number of topics to output
$cfg_max_topic_length = 120; 	// max topic length, if more, title will be shortened
$cfg_show_replies = true; 		// show number of replies to topics
$cfg_show_first_post = false;	// show first posts of the recent topics
$cfg_show_attachments = false;	// show attachments in the first posts of recent topics
/* End of config */

define('IN_PHPBB', true);
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
include($phpbb_root_path . 'common.' . $phpEx);
include($phpbb_root_path . 'includes/bbcode.' . $phpEx);

//
// Let's prevent caching
//
if (!empty($_SERVER['SERVER_SOFTWARE']) && strstr($_SERVER['SERVER_SOFTWARE'], 'Apache/2'))
{
	header ('Cache-Control: no-cache, pre-check=0, post-check=0');
}
else
{
	header ('Cache-Control: private, pre-check=0, post-check=0, max-age=0');
}
header('Content-type: text/html; charset=UTF-8');
header('Expires: 0');
header('Pragma: no-cache');

// Start session management
$user->session_begin();
$auth->acl($user->data);
$user->setup('common');

//
// Building URL
//
$board_path = generate_board_url();
$viewtopic_url = $board_path . '/viewtopic.' . $phpEx;

// Fetching forums that should not be displayed
$forums = implode(',', array_keys($auth->acl_getf('!f_read', true)));
$cfg_ignore_forums = (!empty($cfg_ignore_forums) && !empty($forums)) ? $cfg_ignore_forums . ',' . $forums : ((!empty($forums)) ? $forums : ((!empty($cfg_ignore_forums)) ? $cfg_ignore_forums : ''));

// Building sql for forums that should not be displayed
$sql_ignore_forums = (!empty($cfg_ignore_forums)) ? ' AND t.forum_id NOT IN(' . $cfg_ignore_forums .') ' : '';

// Building sql for forums that should only be displayed
$sql_only_forums = (!empty($cfg_only_forums)) ? ' AND t.forum_id IN(' . $cfg_only_forums .') ' : '';

// Fetching topics of public forums
$sql = 'SELECT t.topic_id, t.forum_id, t.topic_title, t.topic_last_post_id, t.topic_first_post_id, t.topic_replies, t.topic_replies_real, p.post_id, p.post_text, p.bbcode_uid, p.bbcode_bitfield, p.post_attachment, p.post_approved, t.topic_last_post_time
	FROM ' . TOPICS_TABLE . ' AS t, ' . POSTS_TABLE . ' AS p, ' . FORUMS_TABLE . " AS f
	WHERE t.forum_id = f.forum_id
		$sql_ignore_forums
		$sql_only_forums 
		AND p.post_id = t.topic_first_post_id
		AND t.topic_moved_id = 0
	ORDER BY t.topic_last_post_id DESC LIMIT $cfg_nm_topics";

$result = $db->sql_query($sql);

$recent_topics = $db->sql_fetchrowset($result);

//
// BEGIN ATTACHMENT DATA
//
if($cfg_show_first_post && $cfg_show_attachments)
{
	$attach_list = $update_count = array();
	foreach ($recent_topics as $post_attachment)
	{
		if ($post_attachment['post_attachment'] && $config['allow_attachments'])
		{
			$attach_list[] = $post_attachment['post_id'];

			if ($post_attachment['post_approved'])
			{
				$has_attachments = true;
			}
		}
	}

	// Pull attachment data
	if (sizeof($attach_list))
	{
		if ($auth->acl_get('u_download') )
		{
			$sql_attach = 'SELECT *
				FROM ' . ATTACHMENTS_TABLE . '
				WHERE ' . $db->sql_in_set('post_msg_id', $attach_list) . '
					AND in_message = 0
				ORDER BY filetime DESC, post_msg_id ASC';
			$result_attach = $db->sql_query($sql_attach);

			while ($row_attach = $db->sql_fetchrow($result_attach))
			{
				$attachments[$row_attach['post_msg_id']][] = $row_attach;
			}
			$db->sql_freeresult($result_attach);
		}
		else
		{
			$display_notice = true;
		}
	}
}
//
// END ATTACHMENT DATA
//

foreach ( $recent_topics as $row )
{
	$topic_title = censor_text($row['topic_title']);
	$topic_title = (utf8_strlen($topic_title) > $cfg_max_topic_length) ? utf8_substr($topic_title, 0, $cfg_max_topic_length) . '&hellip;' : $topic_title;
	$topic_title = str_replace(array("\r\n", "\r", "\n"), '<br />', $topic_title);
	$topic_title = addslashes($topic_title);
	
	// Replies
	$replies = ($auth->acl_get('m_approve', $row['forum_id'])) ? $row['topic_replies_real'] : $row['topic_replies'];

	// Instantiate BBCode if need be
	if ($row['bbcode_bitfield'] !== '')
	{
		$bbcode = new bbcode(base64_encode($row['bbcode_bitfield']));
	}

	$message = $row['post_text'];

	// Parse the message
	$message = censor_text($message);

	// Second parse bbcode here
	if ($row['bbcode_bitfield'])
	{
		$bbcode->bbcode_second_pass($message, $row['bbcode_uid'], $row['bbcode_bitfield']);
	}

	$message = str_replace("\n", '<br />', $message);

	// Always process smilies after parsing bbcodes
	$message = smiley_text($message);
	
	// Parse attachments
	if ($cfg_show_first_post && $cfg_show_attachments && !empty($attachments[$row['post_id']]))
	{
		parse_attachments($row['forum_id'], $message, $attachments[$row['post_id']], $update_count);
	}
	
	$message = str_replace(array("\r\n", "\r", "\n"), '<br />', $message);
	$message = addslashes($message);
	$message = str_replace('./', $board_path . '/', $message);
	$tags = array('dl', 'dt', 'dd');
	$message = strip_selected_tags($message, $tags);
	
	$template->assign_block_vars('topicrow', array(
		'U_TOPIC' 		=> $viewtopic_url . '?f=' . $row['forum_id'] . '&t=' . $row['topic_id'] . '&view=unread#unread',
		'TOPIC_TITLE' 	=> $topic_title,
		'TOPIC_REPLIES'	=> ($cfg_show_replies) ? '[' . $replies . '] ' : '',
		'LAST_POST_TIME' 		=> $user->format_date($row['topic_last_post_time'], '|d M Y| H:i'), /* Ursego */
		'S_HAS_ATTACHMENTS'		=> ($cfg_show_first_post && $cfg_show_attachments && !empty($attachments[$row['post_id']])) ? true : false,
	));

	if ($cfg_show_first_post)
	{
		$template->assign_block_vars('topicrow.first_post_text', array(
			'TOPIC_FIRST_POST_TEXT' => ($cfg_show_first_post) ? $message : ''
		));
	}

	// Display not already displayed Attachments for this post, we already parsed them. ;)
	if ($cfg_show_first_post && $cfg_show_attachments && !empty($attachments[$row['post_id']]))
	{
		foreach ($attachments[$row['post_id']] as $attachment)
		{
			$attachment = str_replace(array("\r\n", "\r", "\n"), '<br />', $attachment);
			$attachment = str_replace('"./', '"' . $board_path . '/', $attachment);
			$tags = array('span', 'dt', 'dd');
			$attachment = strip_selected_tags($attachment, $tags);

			$template->assign_block_vars('topicrow.first_post_text.attachment', array(
				'DISPLAY_ATTACHMENT'	=>  $attachment)
			);
		}
	}

}
$db->sql_freeresult($result);
		
//
// Load template
//
$template->set_filenames(array(
	'body' => 'recent_body.html')
);

//
// Output
//
$template->display('body');

/**
* Works like PHP function strip_tags, but it only removes selected tags.
* Example: * strip_selected_tags('<b>Person:</b> <strong>Larcher</strong>', 'strong') => <b>Person:</b> Larcher
* by Matthieu Larcher 
* http://ru2.php.net/manual/en/function.strip-tags.php#76045
*/
function strip_selected_tags($text, $tags = array())
{
	$args = func_get_args();
	$text = array_shift($args);
	$tags = (func_num_args() > 2) ? array_diff($args,array($text)) : (array)$tags;
	foreach ($tags as $tag)
	{
		while(preg_match('/<'.$tag.'(|\W[^>]*)>(.*)<\/'. $tag .'>/iusU', $text, $found))
		{
			$text = str_replace($found[0],$found[2],$text);
		}
	}

	return preg_replace('/(<('.join('|',$tags).')(|\W.*)\/>)/iusU', '', $text);
}
?>
Переменная $cfg_ignore_forums заполняется перечисленными через запятую номерами подфорумов, котрые НЕ НАДО выводить в список (у меня это закрытый женский подфорум, а также "Корзина", темы из которой просто неинтересны) - замените на свои если есть (а если нет - присвойте переменной пустую строку).

Переменная $cfg_nm_topics хранит число выводимых тем (у меня это 18 - замените если хотите на своё).

ШАГ 2 - создать в папке styles\<ваш стиль>\template\ файл с именем recent_body.html и следующим текстом:

Код: Выделить всё

<!-- BEGIN topicrow -->
document.writeln('&bull; <a href="{topicrow.U_TOPIC}" target="_blank"><strong>{topicrow.TOPIC_TITLE}</strong></a> <font color="grey">{topicrow.TOPIC_REPLIES}</font>{topicrow.LAST_POST_TIME}<br />\n');
	<!-- BEGIN first_post_text -->
	document.writeln('{topicrow.first_post_text.TOPIC_FIRST_POST_TEXT}<br />\n');
		<!-- BEGIN attachment -->
		document.writeln('{topicrow.first_post_text.attachment.DISPLAY_ATTACHMENT}<br />\n');
		<!-- END attachment -->
	document.writeln('<br />\n');
	<!-- END first_post_text -->
<!-- END topicrow -->
В recent_body.html вы можете изменить внешний вид выводимых строк согласно своему вкусу или стилю форума.

ШАГ 3 - разместить следующий фрагмент в том месте файла styles\<ваш стиль>\template\index_body.html, где хотите выводить последние темы:

Код: Выделить всё

<!-- IF not S_IS_BOT --><script language='JavaScript' type='text/javascript' src='/recent.php'></script><!-- ENDIF -->
Если хотите разместить этот фрагмент на стороннем сайте (не связанном с форумом физически), то не забудьте указать полный путь к файлу! Например, вот как это выглядит у меня:

Код: Выделить всё

<noindex><script language='JavaScript' type='text/javascript' src='http://forum.north-ameri.ca/recent.php'></script></noindex>
**********************************
В дополнение к главной странице (index_body.html) этот блок можно разместить и внизу каждой страницы форума, тобто в overall_footer.html (я был вынужден это сделать - форумчане потребовали). Вот фрагмент, который надо вставить в "подвал":

Код: Выделить всё

<!-- IF SCRIPT_NAME neq 'index' and SCRIPT_NAME neq 'search' and SCRIPT_NAME neq 'mcp' and SCRIPT_NAME neq 'ucp' and SCRIPT_NAME neq 'posting' and not S_IS_BOT --><script language='JavaScript' type='text/javascript' src='/recent.php'></script><!-- ENDIF -->
Как видите, вывод блока взят под условие - на некоторых страницах его не надо показывать - например, на главной, где он и так есть, на search - это когда юзер открыл страницу "Непрочитанное" (чтоб не показывать то-же самое дважды) и на posting - когда юзер создаёт тему или ответ.
**********************************
Этот мод был взят мною здесь http://bb3x.ru/mods/info/40 и немного доработан - добавлено время последнего постинга и немного изменена косметика (т.е. как темы выводятся визуально).

Вывод последних активных тем (компактная версия)

Добавлено: 21 янв 2014, 04:07
Lorem Ipsum
Спасибо! Будем разбираться.

Есть пара замечаний:
1. У вас везде стоит невалидный target="_blank". Лучше поставить onclick="return !window.open(this.href)
2.
ursego писал(а):Как видите, вывод блока взят под условие - на некоторых страницах его не надо показывать - например, на главной, где он и так есть, на search - это когда юзер открыл страницу "Непрочитанное" (чтоб не показывать то-же самое дважды) и на posting - когда юзер создаёт тему или ответ.
Не проще ли вставить этот код только в нужных шаблонах, например, вьютопике, а не глобально в футере, а потом закрывать условиями?

Вывод последних активных тем (компактная версия)

Добавлено: 21 янв 2014, 06:02
ursego
Lorem Ipsum писал(а):У вас везде стоит невалидный target="_blank". Лучше поставить onclick="return !window.open(this.href)
Ха-ха, о какой валидности вообще можно говорить в phpBB? Горбатого могила исправит! Так что грешком больше, грешком меньше...
Lorem Ipsum писал(а):Не проще ли вставить этот код только в нужных шаблонах, например, вьютопике, а не глобально в футере, а потом закрывать условиями?
Дело в том, что он нужен почти везде. А не нужен список всего на нескольких страницах - их перечисление занимает всего одну строку кода. Т.е. (другими словами) всё, что касается менеджмента где показывать, а где нет, находится в одном месте (в хорошем смысле этого выражения) - сразу знаешь куды бечь чуть что.

Вывод последних активных тем (компактная версия)

Добавлено: 21 янв 2014, 10:53
maco8024
Обсуждение этого мода на

Вывод последних активных тем (компактная версия)

Добавлено: 21 янв 2014, 19:31
Alexander
А я этот блок приспособил справа в сайдбаре на страницах просмотра темы. Вроде и нравится и не нравится в тоже время. Мне кажется чего-то не хватает. Может я просто критично смотрю. Оцените со стороны, пожалуйста.

Вывод последних активных тем (компактная версия)

Добавлено: 21 янв 2014, 19:44
ursego
По-моему, очень хорошо. Выделять место специально под этот блок было бы жалко, а если правая колонка и так существует, то почему бы и нет?

Вывод последних активных тем (компактная версия)

Добавлено: 22 янв 2014, 09:15
tanyxa
Друзья, вот видела на одном форуме, последние, активные темы, если навести на них стрелку, прокручиваются... Не кто не знает, как бы это сделать...

Вывод последних активных тем (компактная версия)

Добавлено: 22 янв 2014, 20:11
ursego
Может, просто прокручивать блок, выводимый вышеописанным способом, с помощью <marquee direction="up">...</marquee>?

Вывод последних активных тем (компактная версия)

Добавлено: 22 янв 2014, 21:31
tanyxa
а, точно, может быть...

Вывод последних активных тем (компактная версия)

Добавлено: 23 янв 2014, 19:34
Lorem Ipsum
tanyxa писал(а):Друзья, вот видела на одном форуме, последние, активные темы, если навести на них стрелку, прокручиваются... Не кто не знает, как бы это сделать...
http://www.phpbb3bbcodes.com/viewtopic.php?f=49&t=1351
http://hello-vitebsk.ru/viewtopic.php?f ... 605#p16295

Вывод последних активных тем (компактная версия)

Добавлено: 23 янв 2014, 19:58
tanyxa
спасибо большое!!!!! То что надо!!!!

Вывод последних активных тем (компактная версия)

Добавлено: 27 янв 2014, 16:21
Alexander
ursego писал(а):По-моему, очень хорошо. Выделять место специально под этот блок было бы жалко, а если правая колонка и так существует, то почему бы и нет?
Немного изменил у себя вывод активных тем: убрал количество ответов и сделал разделительную пунктирную линию между разными темами.



А вообще в будущем планирую сделать с картинками (миниатюры к каждой теме, которые автоматически преобразуются из первой вложенной картинки темы). Вот посмотрите в сайдбаре справа (блок "Активные темы") на картинке, которую я в графическом редакторе изобразил. Случайно не выглядит как тизерная реклама (а то, по-моему, она уже всем изрядно надоели)? Или нормально?


Вывод последних активных тем (компактная версия)

Добавлено: 28 фев 2015, 13:51
vovchik261
Делаю все по Вашей инструкции и ничего не выводится на сайте.Хотел вывести активные темы форума на сайт

Вывод последних активных тем (компактная версия)

Добавлено: 01 мар 2015, 08:51
DeaDRoMeO
Версия форума, какой движок сайта?

Вывод последних активных тем (компактная версия)

Добавлено: 07 мар 2017, 01:07
laminatlublino
Здравствуйте! Как в этом блоке можно сделать так, чтобы выводились последние сообщения только нескольких разделов, а не всех?

Вывод последних активных тем (компактная версия)

Добавлено: 07 мар 2017, 13:00
DeaDRoMeO
Первый пост, шаг 1, строки

Код: Выделить всё

 $cfg_ignore_forums = '24,47';  
$cfg_only_forums = '';  
Первая строка исключает выбранные подфорумы, вторая - тут указываются айди подфорумов из которых нужно вывод делать