Быстрый лёгкий надёжный форумный движок
Вы не вошли.
Страницы 1
Добрый день!
Подскажите хочу создать отдельный блок с топ темами (самыми популярными) и рядом колонка с новыми темами, которые должны быть доступны на каждой станице.
Спасибо за ответ.
Offline
@wcw2007, а что такое "самыми популярными"? Как их вычислить эти популярные темы?
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
@wcw2007, а что такое "самыми популярными"? Как их вычислить эти популярные темы?
Ну самые просматриваемые или где больше всего сообщений
Offline
А я думаю, что популярными можно назвать те темы в которых больше всего новых сообщений за какой-то определенный период (час, день, неделя).
С просматриваемыми конечно тоже можно согласится, но число просмотров неуклонно растет от возраста темы и количества страниц в ней. Новые темы ни когда не попадут в популярные.
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
+1 к Visman
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Offline
псевдокод 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
Вот пример как на этом сайте справа блоки
http://panbb.ru/forum/f-4.html
Offline
@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> ('.$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 на сайте.
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
Огромное спасибо поставил, а этот модуль выводит какие новости? (новые, популярные )
Offline
@wcw2007, новые (это стандартный функционал движка), популярные (то что вы захотели с наибольшим числом просмотров за все время).
То что я предлагал с наибольшим числом сообщений за последнее время - нет.
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
@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> ('.$cur_topic['num_views'].')</li>'."\n"; } exit; }
Спасибо за рабочий пример.
Но мне никак не сделать, чтобы рядом с последними сообщениями с форума выводило еще и кол-во просмотров темы.
Мой код из extern.php, в моем случаи переменная '.$cur_topic['num_views'].' не работает
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
@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> ('.$cur_topic['num_views'].')</li>'."\n";
}
У вас же цикл идет по массиву $feed['items']. Смотрите его содержимое. И если там нет количества просмотров, то следует при его (массива) создании дополнить этим элементом из базы.
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
Страницы 1