Быстрый лёгкий надёжный форумный движок
Вы не вошли.
Страницы 1
Тема закрыта
Как данная вещь сделана у меня.
Замечание: Ссылка "Все/All" в темах у меня появляется только если число сообщений в теме не больше 300 (не чего сервер грузить и открывать длинные темы разом ).
0. В языковых файлах common.php должен быть добавлен элемент массива 'All'
'All' => 'Все',
'All' => 'All',
1. В файле functions.php ф-ия paginate изменена до вот такого состояния:
//
// Generate a string with numbered links (for multipage scripts)
//
// START http://punbb.ru/viewtopic.php?id=1935
// ADD
function paginate($num_pages, $cur_page, $link_to)
{
/// MOD VIEW ALL PAGES IN ONE BEGIN
global $lang_common, $action, $cur_topic;
$active_all = true;
/// MOD VIEW ALL PAGES IN ONE END
$pages = array();
$link_to_all = false;
// If $cur_page > $num_pages, we show link to all pages
if ($cur_page > $num_pages)
{
$active_all = false;
$link_to_all = true;
$cur_page--;
}
// If $cur_page == -1, we link to all pages (used in viewforum.php)
if ($cur_page == -1)
{
$cur_page = 1;
$link_to_all = true;
}
if ($num_pages <= 1)
if ($action == 'all')
$pages = array('<strong>'.$lang_common['All'].'</strong>');
else
$pages = array('<strong>1</strong>');
else
{
if (!$link_to_all && $cur_page > 1)
$pages[] = '<a href="'.$link_to.($cur_page == 2 ? '' : '&p='.($cur_page-1)).'"><strong>«</strong></a>';
// $pages[] = '<a href="'.$link_to.'&p='.($cur_page-1).'"><strong>«</strong></a>';
if ($cur_page > 3)
{
// $pages[] = '<a href="'.$link_to.'&p=1">1</a>';
$pages[] = '<a href="'.$link_to.'">1</a>';
if ($cur_page != 4)
$pages[] = '…';
}
// Don't ask me how the following works. It just does, OK? :-)
for ($current = $cur_page - 2, $stop = $cur_page + 3; $current < $stop; ++$current)
{
if ($current < 1 || $current > $num_pages)
continue;
else if ($current != $cur_page || $link_to_all)
// $pages[] = '<a href="'.$link_to.'&p='.$current.'">'.$current.'</a>';
$pages[] = '<a href="'.$link_to.($current == 1 ? '' : '&p='.$current).'">'.$current.'</a>';
else
$pages[] = '<strong>'.$current.'</strong>';
}
if ($cur_page <= ($num_pages-3))
{
if ($cur_page != ($num_pages-3))
$pages[] = '…';
$pages[] = '<a href="'.$link_to.'&p='.$num_pages.'">'.$num_pages.'</a>';
}
if (!$link_to_all && $cur_page < $num_pages)
$pages[] = '<a href="'.$link_to.'&p='.($cur_page+1).'"><strong>»</strong></a>';
/// MOD VIEW ALL PAGES IN ONE BEGIN
if (!$active_all) $pages[] = $lang_common['All'];
else if ((isset($cur_topic['num_replies']) && $cur_topic['num_replies'] < 300) || !isset($cur_topic['num_replies']))
$pages[] = '<a href='.$link_to.'&action=all>'.$lang_common['All'].'</a>';
/// MOD VIEW ALL PAGES IN ONE END
}
return implode(' ', $pages);
}
// END http://punbb.ru/viewtopic.php?id=1935
2. В файле viewforum.php после
if ($pun_user['g_read_board'] == '0')
message($lang_common['No view']);
добавляем это
$action = isset($_GET['action']) ? $_GET['action'] : null;
А перед этим
// Determine the topic offset (based on $_GET['p'])
$num_pages = ceil($cur_forum['num_topics'] / $pun_user['disp_topics']);
добавляем это
// All topic in forum
if ($action == 'all')
$pun_user['disp_topics'] = $cur_forum['num_topics'] + 1;
3. В файле viewtopic.php после этого
if ($pun_user['g_read_board'] == '0')
message($lang_common['No view']);
ставим это
$action = isset($_GET['action']) ? $_GET['action'] : null;
А после этого
$cur_topic = $db->fetch_assoc($result);
ставим это
// START Mod title: View All Posts In Topic
// ADD
if ($action == 'all' && $pid == 0 && $cur_topic['num_replies'] < 300) {
$pun_user['disp_posts'] = $cur_topic['num_replies'] + 1;
}
// END Mod title: View All Posts In Topic
4. В юзерлисте ссылка "Все/All" у меня полностью отключена, для этого там принудительно прописано число ответов в теме = 1000 (изменения вносим в файл userlist.php).
Перед этим
// Generate paging links
$paging_links = $lang_common['Pages'].': '.paginate($num_pages, $p, 'userlist.php?username='.urlencode($username).'&show_group='.$show_group.'&sort_by='.$sort_by.'&sort_dir='.strtoupper($sort_dir));
нужно поставить это
// ограничиваем вывод ссылки ALL
$cur_topic['num_replies'] = 1000;
5. В личных сообщениях (файл message_list.php)
Замечание: Речь идет о моде Private Messaging System (PMS) hcs EDITION + редакция trijin (1.2.2 edition 3). На стандартном не пойдет без исправлений наверное, так как в этой редакции (если не ошибаюсь) были введены новые переменные для оптимизации кол-ва запросов к базе.
В начале, перед этим
if ($box!=1 && $box!=2)
$box = 0;
ставим это
$action = isset($_GET['action']) ? $_GET['action'] : null;
Это
else if (isset($_GET['action']) && $_GET['action'] == 'markall')
меняем на это
else if ($action == 'markall')
Перед этим
$num_pages = ceil($num_messages / $pms_mess_per_page);
ставим это
if ($action == 'all')
$pms_mess_per_page = $num_messages + 1;
else
$pms_mess_per_page = $pun_config['o_pms_mess_per_page'];
Этот код
$subject = '<a href="message_list.php?id='.$cur_mess['id'].'&p='.$p.'&box='.(int)$box.'">'.pun_htmlspecialchars($cur_mess['subject']).'</a>';
заменяем на этот
$subject = '<a href="message_list.php?id='.$cur_mess['id'].'&'.($action=='all' ? 'action=all' : 'p='.$p).'&box='.(int)$box.'">'.pun_htmlspecialchars($cur_mess['subject']).'</a>';
Это
$cols = isset($_GET['action']) ? '4' : '3';
заменяем на это
$cols = isset($action) ? '4' : '3';
На этом кажется все.
З.Ы. Как все работает можно увидеть на моем форуме
UP
6. В поиске (файл search.php) нужно внести такие изменения:
После этого кода
// Determine the topic or post offset (based on $_GET['p'])
$per_page = ($show_as == 'posts') ? $pun_user['disp_posts'] : $pun_user['disp_topics'];
ставим этот код
// START Mod title: View All Posts In Topic
if ($action == 'all')
$per_page = $num_hits;
А этот код
if ($num_pages_topic > 1)
$subject_multipage = '[ '.paginate($num_pages_topic, -1, 'viewtopic.php?id='.$search_set[$i]['tid']).' ]';
else
меняем на этот
if ($num_pages_topic > 1) {
// ограничиваем вывод ссылки ALL
$cur_topic['num_replies'] = $search_set[$i]['num_replies'];
$subject_multipage = '[ '.paginate($num_pages_topic, -1, 'viewtopic.php?id='.$search_set[$i]['tid']).' ]';
} else
P.S. Кажется все для поиска.
UP
7. ВСЕ для плагина репутации (файл reputation.php).
Reputation Plugin for PunBB
----------------------------
-- Version 2.2.2
-- (c) Copyright 2006-2007 hcs [email protected]
Ищем код
list($num_rows) = $db->fetch_row($result);
if ($num_rows>0)
{
$num_pages = ceil(($num_rows + 1) / $pun_user['disp_posts']);
и делаем из него такой код
list($num_rows) = $db->fetch_row($result);
if ($num_rows>0)
{
// START Mod title: View All Posts In Topic
$action = isset($_GET['action']) ? $_GET['action'] : null;
$cur_topic['num_replies'] = $num_rows;
if ($action == 'all' && $num_rows < 300)
$pun_user['disp_posts'] = $num_rows + 1;
// END Mod title: View All Posts In Topic
$num_pages = ceil(($num_rows + 1) / $pun_user['disp_posts']);
Редактировался Visman (2009-03-19 15:53:43)
Есть несколько вопросов:
1) У меня сборка этого форума на основе 1.2.15. В ней уже стоит мод просмотра "все" и в просмотре форумов и сообщений вроде работает. Не работает в ЛС и юзерсисте. Если вносить все перечисленные выше изменения, это не будет противоречить тому что уже есть и не нарушит ли логику?
2) Есть некоторые несоответствия текста в файле message_list.php (устанавливал из архива по вашей ссылке ) и в перечисленных строках.
В частности:
отсутствует строка
$num_pages = ceil($num_messages / $pms_mess_per_page);
вместо неё у меня это:
$num_pages = ceil($num_messages / $pun_config['o_pms_mess_per_page']);
Что в этом случае делать?
NewUser21031972
1. Попробуй ни чего не менять в viewforum.php и в viewtopic.php.
2. У меня этот кусок кода выглядит так:
if ($box<2)
{
// Get message count
$result = $db->query('SELECT count(*) FROM '.$db->prefix.'messages WHERE owner='.$pun_user['id'].' AND owner_status=0') or error('Unable to count messages1', __FILE__, __LINE__, $db->error());
list($num_in_messages) = $db->fetch_row($result);
$result = $db->query('SELECT count(*) FROM '.$db->prefix.'messages WHERE sender_id='.$pun_user['id'].' AND sender_status=0') or error('Unable to count messages2', __FILE__, __LINE__, $db->error());
list($num_out_messages) = $db->fetch_row($result);
//list($num_messages) = $db->fetch_row($result);
$num_messages = ( $box==1 ? $num_out_messages : $num_in_messages );
$total_messages=$num_out_messages + $num_in_messages;
//
if ($action == 'all')
$pms_mess_per_page = $num_messages + 1;
else
$pms_mess_per_page = $pun_config['o_pms_mess_per_page'];
//What page are we on?
$num_pages = ceil($num_messages / $pms_mess_per_page);
$p = (!isset($_GET['p']) || $_GET['p'] <= 1 || $_GET['p'] > $num_pages) ? 1 : $_GET['p'];
$start_from = $pms_mess_per_page * ($p - 1);
$limit = $start_from.','.$pms_mess_per_page;
}
1. изменения в viewforum.php и viewtopic.php всё же внес.
Вроде всё работает (оно и раньше работало), но появились такие изменения. Раньше при нажатии "Все" кроме того, что появлялся листинг всех сообщений строка перечня страниц выглядела так: Страниц: 1 … 3 4 5 Все. Сейчас стало Страниц: Все.
2. Сначала я не вносил никаких изменений просто перед этим
$num_pages = ceil($num_messages / $pun_config['o_pms_mess_per_page']);
добавил это (как в инструкции)
if ($action == 'all')
$pms_mess_per_page = $num_messages + 1;
else
$pms_mess_per_page = $pun_config['o_pms_mess_per_page'];
При этом при нажатии на "Все" полный листинг не происходил, а вместо номеров страниц появлялось "Все". Короче, не заработало.
Исходный кусок был такой
if ( $box<2)
{
// Get message count
$result = $db->query('SELECT count(*) FROM '.$db->prefix.'messages WHERE owner='.$pun_user['id'].' AND owner_status=0') or error('Unable to count messages1', __FILE__, __LINE__, $db->error());
list($num_in_messages) = $db->fetch_row($result);
$result = $db->query('SELECT count(*) FROM '.$db->prefix.'messages WHERE sender_id='.$pun_user['id'].' AND sender_status=0') or error('Unable to count messages2', __FILE__, __LINE__, $db->error());
list($num_out_messages) = $db->fetch_row($result);
//list($num_messages) = $db->fetch_row($result);
$num_messages = ( $box==1 ? $num_out_messages : $num_in_messages );
$total_messages=$num_out_messages + $num_in_messages;
//What page are we on?
$num_pages = ceil($num_messages / $pun_config['o_pms_mess_per_page']);
$p = (!isset($_GET['p']) || $_GET['p'] <= 1 || $_GET['p'] > $num_pages) ? 1 : intval($_GET['p']);
$start_from = $pun_config['o_pms_mess_per_page'] * ($p - 1);
$limit = $start_from.','.$pun_config['o_pms_mess_per_page'];
}
Заменил этот кусок на то, что у вас, и всё заработало.
Однако в userlist.php ссылка "Все" так и не работает. Может там аналогичная проблема?
А ещё нужно внести изменения в search.php - там тоже может появиться ссылка "Все".
У меня, кстати, не работает как и в userlist.php
Однако в userlist.php ссылка "Все" так и не работает. Может там аналогичная проблема?
В первом сообщении я написал, что в юзерах ссылка ВСЕ принудительно отключена из-за возможного большого числа юзеров.
UP
В первом сообщении дописал изменения для поиска.
Редактировался Visman (2009-03-11 13:53:03)
В первом сообщении я написал, что в юзерах ссылка ВСЕ принудительно отключена из-за возможного большого числа юзеров.
Я пока ещё вообще ничего не менял в userlist.php
Там просто отсутствует обработчик запроса 'all' . Что именно нужно добавить я пока не разобрался.
Для NewUser21031972 и других людей мечтающих о ВСЕ в userlist.php выполняем следующее (вместо 4 пункта первого сообщения):
Перед этим
/ Determine if we are allowed to view post counts
$show_post_count = ($pun_config['o_show_post_count'] == '1' || $pun_user['g_id'] < PUN_GUEST) ? true : false;
ставим этот код
$action = (isset($_GET['action'])) ? $_GET['action'] : null;
Вместо этого куска
// Determine the user offset (based on $_GET['p'])
$num_pages = ceil($num_users / 50);
$p = (!isset($_GET['p']) || $_GET['p'] <= 1 || $_GET['p'] > $num_pages) ? 1 : $_GET['p'];
$start_from = 50 * ($p - 1);
ставим вот это
$users_on_page = 50;
// ограничиваем вывод ссылки ALL
if ($num_users > 300)
$cur_topic['num_replies'] = 1000;
elseif ($action == 'all')
$users_on_page = $num_users;
// Determine the user offset (based on $_GET['p'])
$num_pages = ceil($num_users / $users_on_page);
$p = (!isset($_GET['p']) || $_GET['p'] <= 1 || $_GET['p'] > $num_pages) ? 1 : $_GET['p'];
$start_from = $users_on_page * ($p - 1);
И вот этот запрос
// Grab the users
$result = $db->query('SELECT u.id, u.username, u.title, u.num_posts, u.registered, g.g_id, g.g_user_title FROM '.$db->prefix.'users AS u LEFT JOIN '.$db->prefix.'groups AS g ON g.g_id=u.group_id WHERE u.id>1'.(!empty($where_sql) ? ' AND '.implode(' AND ', $where_sql) : '').' ORDER BY '.$sort_by.' '.$sort_dir.' LIMIT '.$start_from.', 50') or error('Unable to fetch user list', __FILE__, __LINE__, $db->error());
меняем на этот
// Grab the users
$result = $db->query('SELECT u.id, u.username, u.title, u.num_posts, u.registered, g.g_id, g.g_user_title FROM '.$db->prefix.'users AS u LEFT JOIN '.$db->prefix.'groups AS g ON g.g_id=u.group_id WHERE u.id>1'.(!empty($where_sql) ? ' AND '.implode(' AND ', $where_sql) : '').' ORDER BY '.$sort_by.' '.$sort_dir.' LIMIT '.$start_from.', '.$users_on_page) or error('Unable to fetch user list', __FILE__, __LINE__, $db->error());
А в форму вместо этого
<form id="userlist" method="get" action="userlist.php">
<div class="inform">
ставим это
<form id="userlist" method="get" action="userlist.php">
<?php echo ($action=='all') ? ' <input type="hidden" name="action" value="all" />'."\n" : ''; ?> <div class="inform">
З.Ы. Как обычно ссылка все работает пока у вас не больше 300 юзверов
Редактировался Visman (2009-03-12 15:57:19)
Отлично!
Добавил в первый пост ВСЕ для плагина репутации.
Страницы 1
Тема закрыта