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

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

Вы не вошли.

Объявление

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

#1 2009-03-06 16:05:24

Visman
Гость

И снова "Все/All" в навигации 1.2.хх

Как данная вещь сделана у меня.
Замечание: Ссылка "Все/All" в темах у меня появляется только если число сообщений в теме не больше 300 (не чего сервер грузить и открывать длинные темы разом wink ).

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 ? '' : '&amp;p='.($cur_page-1)).'"><strong>&laquo;</strong></a>';
//            $pages[] = '<a href="'.$link_to.'&amp;p='.($cur_page-1).'"><strong>&laquo;</strong></a>';

        if ($cur_page > 3)
        {
//            $pages[] = '<a href="'.$link_to.'&amp;p=1">1</a>';
            $pages[] = '<a href="'.$link_to.'">1</a>';
            if ($cur_page != 4)
                $pages[] = '&hellip;';
        }

        // 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.'&amp;p='.$current.'">'.$current.'</a>';
                $pages[] = '<a href="'.$link_to.($current == 1 ? '' : '&amp;p='.$current).'">'.$current.'</a>';
            else
                $pages[] = '<strong>'.$current.'</strong>';
        }

        if ($cur_page <= ($num_pages-3))
        {
            if ($cur_page != ($num_pages-3))
                $pages[] = '&hellip;';

            $pages[] = '<a href="'.$link_to.'&amp;p='.$num_pages.'">'.$num_pages.'</a>';
        }
        if (!$link_to_all && $cur_page < $num_pages)
            $pages[] = '<a href="'.$link_to.'&amp;p='.($cur_page+1).'"><strong>&raquo;</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.'&amp;action=all>'.$lang_common['All'].'</a>';
/// MOD VIEW ALL PAGES IN ONE END
    }

    return implode('&nbsp;', $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 smile (изменения вносим в файл userlist.php).
Перед этим

// Generate paging links
$paging_links = $lang_common['Pages'].': '.paginate($num_pages, $p, 'userlist.php?username='.urlencode($username).'&amp;show_group='.$show_group.'&amp;sort_by='.$sort_by.'&amp;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'].'&amp;p='.$p.'&amp;box='.(int)$box.'">'.pun_htmlspecialchars($cur_mess['subject']).'</a>';

заменяем на этот

        $subject = '<a href="message_list.php?id='.$cur_mess['id'].'&amp;'.($action=='all' ? 'action=all' : 'p='.$p).'&amp;box='.(int)$box.'">'.pun_htmlspecialchars($cur_mess['subject']).'</a>';

Это

    $cols = isset($_GET['action']) ? '4' : '3';

заменяем на это

    $cols = isset($action) ? '4' : '3';

На этом кажется все.
З.Ы. Как все работает можно увидеть на моем форуме tongue

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)

#2 2009-03-10 17:53:20

NewUser21031972
Гость

Re: И снова "Все/All" в навигации 1.2.хх

Есть несколько вопросов:

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']);

Что в этом случае делать?

#3 2009-03-10 19:10:38

Visman
Гость

Re: И снова "Все/All" в навигации 1.2.хх

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;

}

#4 2009-03-10 21:18:41

NewUser21031972
Гость

Re: И снова "Все/All" в навигации 1.2.хх

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 ссылка "Все" так и не работает. Может там аналогичная проблема?

#5 2009-03-11 01:56:51

NewUser21031972
Гость

Re: И снова "Все/All" в навигации 1.2.хх

А ещё нужно внести изменения в search.php - там тоже может появиться ссылка "Все".

У меня, кстати, не работает как и в userlist.php

#6 2009-03-11 13:45:53

Visman
Гость

Re: И снова "Все/All" в навигации 1.2.хх

NewUser21031972 пишет:

Однако в userlist.php ссылка "Все" так и не работает. Может там аналогичная проблема?

В первом сообщении я написал, что в юзерах ссылка ВСЕ принудительно отключена из-за возможного большого числа юзеров.

UP
В первом сообщении дописал изменения для поиска.

Редактировался Visman (2009-03-11 13:53:03)

#7 2009-03-11 17:44:55

NewUser21031972
Гость

Re: И снова "Все/All" в навигации 1.2.хх

Visman пишет:

В первом сообщении я написал, что в юзерах ссылка ВСЕ принудительно отключена из-за возможного большого числа юзеров.

Я пока ещё вообще ничего не менял в userlist.php

Там просто отсутствует обработчик запроса 'all' . Что именно нужно добавить я пока не разобрался.

#8 2009-03-12 15:52:47

Visman
Гость

Re: И снова "Все/All" в навигации 1.2.хх

Для 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 юзверов smile

Редактировался Visman (2009-03-12 15:57:19)

#9 2009-03-13 13:48:40

NewUser21031972
Гость

Re: И снова "Все/All" в навигации 1.2.хх

Отлично!
smile

#10 2009-03-19 15:54:53

Visman
Гость

Re: И снова "Все/All" в навигации 1.2.хх

Добавил в первый пост ВСЕ для плагина репутации.

Подвал доски

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