Русское сообщество fluxbb

Быстрый лёгкий надёжный форумный движок

Вы не вошли.

Объявление

Вы можете внести свой вклад в содержание сайта. Жертвователи попадут в почетную группу "Спонсоры". Поддержать сайт.

#1 2016-10-15 09:58:15

wcw2007
Участник
Зарегистрирован: 2011-08-22
Сообщений: 27

Как создать топ тем отдельный блок

Добрый день!

Подскажите хочу создать отдельный блок с топ темами (самыми популярными) и рядом колонка с новыми темами, которые должны быть доступны на каждой станице.

Спасибо за ответ.

Offline

#2 2016-10-15 13:22:27

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: Как создать топ тем отдельный блок

@wcw2007, а что такое "самыми популярными"?  smile Как их вычислить эти популярные темы?

Offline

#3 2016-10-16 10:24:08

wcw2007
Участник
Зарегистрирован: 2011-08-22
Сообщений: 27

Re: Как создать топ тем отдельный блок

Visman пишет:

@wcw2007, а что такое "самыми популярными"?  smile Как их вычислить эти популярные темы?

Ну самые просматриваемые или где больше всего сообщений

Offline

#4 2016-10-16 13:25:19

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: Как создать топ тем отдельный блок

А я думаю, что популярными можно назвать те темы в которых больше всего новых сообщений за какой-то определенный период (час, день, неделя).
С просматриваемыми конечно тоже можно согласится, но число просмотров неуклонно растет от возраста темы и количества страниц в ней. Новые темы ни когда не попадут в популярные.

Offline

#5 2016-10-17 09:32:13

artoodetoo
Admin by chance
Зарегистрирован: 2008-09-09
Сообщений: 887
Сайт

Re: Как создать топ тем отдельный блок

+1 к Visman


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Offline

#6 2016-10-17 10:33:23

artoodetoo
Admin by chance
Зарегистрирован: 2008-09-09
Сообщений: 887
Сайт

Re: Как создать топ тем отдельный блок

псевдокод top 100 популярных тем:

SELECT topic_id, COUNT(*) AS num
FROM posts
WHERE (... topic is available for guests ...) AND (... post date-time is not older then 1 month ...)
GROUP BY topic_id
ORDER BY 2 DESC
LIMIT 100

ну и конечно кешировать это, например, на 5 минут, а не вызывать при каждом показе страницы.


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Offline

#7 2016-10-17 14:02:15

wcw2007
Участник
Зарегистрирован: 2011-08-22
Сообщений: 27

Re: Как создать топ тем отдельный блок

Вот пример как на этом сайте справа блоки
http://panbb.ru/forum/f-4.html

Offline

#8 2016-10-17 15:59:36

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: Как создать топ тем отдельный блок

@wcw2007, дополнение в файл extern.php код вставлять перед

// If we end up here, the script was called with some wacky parameters
exit($lang_common['Bad request']);

Сам код:

else if ($action == 'popular')
{
	$show = isset($_GET['show']) ? intval($_GET['show']) : 5;
	if ($show < 1 || $show > 20)
		$show = 5;

	$result = $db->query('SELECT t.id, t.subject, t.num_views FROM '.$db->prefix.'topics AS t LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=t.forum_id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.moved_to IS NULL ORDER BY t.num_views DESC LIMIT '.$show) or error('Unable to fetch topic info', __FILE__, __LINE__, $db->error());


	// Send the Content-type header in case the web server is setup to send something else
	header('Content-type: text/html; charset=utf-8');
	header('Expires: '.gmdate('D, d M Y H:i:s').' GMT');
	header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
	header('Pragma: public');

	while ($cur_topic = $db->fetch_assoc($result))
	{
		$title = pun_htmlspecialchars($cur_topic['subject']);
		echo '<li><a href="'.get_base_url(true).'/viewtopic.php?id='.$cur_topic['id'].'" title="'.$title.'">'.$title.'</a>&#160;('.$cur_topic['num_views'].')</li>'."\n";
	}

	exit;
}

Вызывать по сслыке /extern.php?action=popular&show=7, где show от 1 до 20 (по умолчанию 5).

Как пользоваться можно глянуть тут https://fluxbb.qb7.ru/forum/viewtopic.php?id=3970 или поиск по слову extern.php на сайте.

Offline

#9 2016-10-18 11:26:07

wcw2007
Участник
Зарегистрирован: 2011-08-22
Сообщений: 27

Re: Как создать топ тем отдельный блок

Огромное спасибо поставил, а этот модуль выводит какие новости? (новые, популярные )

Offline

#10 2016-10-18 12:32:36

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: Как создать топ тем отдельный блок

@wcw2007, новые (это стандартный функционал движка), популярные (то что вы захотели с наибольшим числом просмотров за все время).

То что я предлагал с наибольшим числом сообщений за последнее время - нет.

Offline

#11 2017-11-03 14:26:20

JohnDDD
Новичок
Зарегистрирован: 2017-11-03
Сообщений: 1

Re: Как создать топ тем отдельный блок

Visman пишет:

@wcw2007, дополнение в файл extern.php код вставлять перед

// If we end up here, the script was called with some wacky parameters
exit($lang_common['Bad request']);

Сам код:

else if ($action == 'popular')
{
	$show = isset($_GET['show']) ? intval($_GET['show']) : 5;
	if ($show < 1 || $show > 20)
		$show = 5;

	$result = $db->query('SELECT t.id, t.subject, t.num_views FROM '.$db->prefix.'topics AS t LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=t.forum_id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.moved_to IS NULL ORDER BY t.num_views DESC LIMIT '.$show) or error('Unable to fetch topic info', __FILE__, __LINE__, $db->error());


	// Send the Content-type header in case the web server is setup to send something else
	header('Content-type: text/html; charset=utf-8');
	header('Expires: '.gmdate('D, d M Y H:i:s').' GMT');
	header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
	header('Pragma: public');

	while ($cur_topic = $db->fetch_assoc($result))
	{
		$title = pun_htmlspecialchars($cur_topic['subject']);
		echo '<li><a href="'.get_base_url(true).'/viewtopic.php?id='.$cur_topic['id'].'" title="'.$title.'">'.$title.'</a>&#160;('.$cur_topic['num_views'].')</li>'."\n";
	}

	exit;
}

Спасибо за рабочий пример.

Но мне никак не сделать, чтобы рядом с  последними сообщениями с форума выводило еще и кол-во просмотров темы.

Мой код из extern.php, в моем случаи переменная '.$cur_topic['num_views'].' не работает  sad

function output_html($feed)
{

	// Send the Content-type header in case the web server is setup to send something else
	#header('Content-type: text/html; charset=utf-8');
	#header('Expires: '.gmdate('D, d M Y H:i:s').' GMT');
	#header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
	#header('Pragma: public');
	


	foreach ($feed['items'] as $item)
	{
		
			$subject_truncated = pun_htmlspecialchars($item['title']);
		

		echo iconv("utf-8", "windows-1251", '<div class="comment"><div class="comment-thumbnail">
<div class="avatar"><img src="img/user-24x23.svg" alt="'.escape_cdata($item['author']['name']).'"></div></div><div class="comment-body">
<span class="views">([b]'.$cur_topic['num_views'].'[/b])</span><span class="date">'.strftime('%e %B %G, %k:%M', $item['pubdate']).'</span><p><a href="'.pun_htmlspecialchars($item['link']).'" title="'.pun_htmlspecialchars($item['title']).'">'.$subject_truncated.'</a></p></div></div>');
	}
	
		echo "</div></div></div>";
include ('../2017/foot.php');
	
}


Может кто поможет советом, как добавить еще и кол-во просмотров тем?

Редактировался JohnDDD (2017-11-03 14:27:43)

Offline

#12 2017-11-03 18:17:12

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: Как создать топ тем отдельный блок

@JohnDDD, почему она должна работать, если я не вижу у вас запроса к базе и перебора строк результата?

В моем примере запрос к базе

$result = $db->query('SELECT t.id, t.subject, t.num_views FROM '.$db->prefix.'topics AS t LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=t.forum_id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.moved_to IS NULL ORDER BY t.num_views DESC LIMIT '.$show) or error('Unable to fetch topic info', __FILE__, __LINE__, $db->error());

и перебор строк результата с выводом в браузер

	while ($cur_topic = $db->fetch_assoc($result))
	{
		$title = pun_htmlspecialchars($cur_topic['subject']);
		echo '<li><a href="'.get_base_url(true).'/viewtopic.php?id='.$cur_topic['id'].'" title="'.$title.'">'.$title.'</a>&#160;('.$cur_topic['num_views'].')</li>'."\n";
	}

У вас же цикл идет по массиву $feed['items']. Смотрите его содержимое. И если там нет количества просмотров, то следует при его (массива) создании дополнить этим элементом из базы.

Offline

Подвал доски

Под управлением FluxBB. Хостинг Hostens