Полезная информация


----

Начать новую тему Ответить на тему
АвторСообщение

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

Аватар пользователя

Хочу описать простой мод, выводящий активные темы (т.е. темы, в которых появились последние сообщения). Можете глянуть на
Пожалуйста Зарегистрируйтесь чтобы увидеть ссылку
("ПОСЛЕДНЯЯ АКТИВНОСТЬ НА ФОРУМЕ") чтоб лицезреть как сия краса выглядит. Клик по теме перекидывает на её первое непрочитанное сообщение (ну, а незарегистрированных юзеров - на начало темы) в новой вкладке браузера. Мод напоминает известный "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'] . '&amp;t=' . $row['topic_id'] . '&amp;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 - когда юзер создаёт тему или ответ.

**********************************


Этот мод был взят мною здесь
Пожалуйста Зарегистрируйтесь чтобы увидеть ссылку
и немного доработан - добавлено время последнего постинга и немного изменена косметика (т.е. как темы выводятся визуально).



Информация о редактировании
Последний раз редактировалось ursego 28 фев 2014, 19:37, всего редактировалось 1 раз.
          Вернуться наверх  
 

#2 

Аватар пользователя

Спасибо! Будем разбираться.

Есть пара замечаний:
1. У вас везде стоит невалидный target="_blank". Лучше поставить onclick="return !window.open(this.href)
2.
ursego писал(а):

Как видите, вывод блока взят под условие - на некоторых страницах его не надо показывать - например, на главной, где он и так есть, на search - это когда юзер открыл страницу "Непрочитанное" (чтоб не показывать то-же самое дважды) и на posting - когда юзер создаёт тему или ответ.

Не проще ли вставить этот код только в нужных шаблонах, например, вьютопике, а не глобально в футере, а потом закрывать условиями?


_________________
Подпись:
Я уже прошел тот период когда можно было забывать про очистку кеша ©salexcorp
          Вернуться наверх  
 

#3 

Аватар пользователя

Lorem Ipsum писал(а):

У вас везде стоит невалидный target="_blank". Лучше поставить onclick="return !window.open(this.href)
Ха-ха, о какой валидности вообще можно говорить в phpBB? Горбатого могила исправит! Так что грешком больше, грешком меньше...

Lorem Ipsum писал(а):

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



Информация о редактировании
Последний раз редактировалось ursego 28 фев 2014, 19:43, всего редактировалось 3 раз(а).
          Вернуться наверх  
 

#4 

Аватар пользователя

Обсуждение этого мода на


          Вернуться наверх  
 

#5 

Аватар пользователя

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


          Вернуться наверх  
 

#6 

Аватар пользователя

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


          Вернуться наверх  
 

#7 

Аватар пользователя

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


          Вернуться наверх  
 

#8 

Аватар пользователя

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


          Вернуться наверх  
 

#9 

Аватар пользователя

а, точно, может быть...


          Вернуться наверх  
 


Аватар пользователя

tanyxa писал(а):

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

Пожалуйста Зарегистрируйтесь чтобы увидеть ссылку

viewtopic.php?f=150&t=1605#p16295


_________________
Подпись:
Я уже прошел тот период когда можно было забывать про очистку кеша ©salexcorp
          Вернуться наверх  
 


Аватар пользователя

спасибо большое!!!!! То что надо!!!!


          Вернуться наверх  
 


Аватар пользователя

ursego писал(а):

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

Немного изменил у себя вывод активных тем: убрал количество ответов и сделал разделительную пунктирную линию между разными темами.

Пожалуйста Зарегистрируйтесь чтобы увидеть ссылку


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

Пожалуйста Зарегистрируйтесь чтобы увидеть ссылку


          Вернуться наверх  
 


Случайный аватар. Пользователю рекомендуется загрузить свой аватар в Настройках профиля

Делаю все по Вашей инструкции и ничего не выводится на сайте.Хотел вывести активные темы форума на сайт


          Вернуться наверх  
 


Аватар пользователя

Версия форума, какой движок сайта?


_________________
Подпись:
-_- -_-
На вопросы, связанные с phpBB, по ЛС не отвечаю !!!
          Вернуться наверх  
 


Аватар пользователя

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


          Вернуться наверх  
 


Аватар пользователя

Первый пост, шаг 1, строки
 $cfg_ignore_forums = '24,47';  
$cfg_only_forums = ''; 
 

Первая строка исключает выбранные подфорумы, вторая - тут указываются айди подфорумов из которых нужно вывод делать


_________________
Подпись:
-_- -_-
На вопросы, связанные с phpBB, по ЛС не отвечаю !!!
          Вернуться наверх  
 
 
Начать новую тему Ответить на тему


Дополнительные возможности

  Похожие темы  Автор  Ответов  Просмотров  Последнее сообщение 
Аватар пользователя Мобильная версия phpbb3
Мобильная версия phpbb3 - отличный мод для phpbb3, позволяющий добавить мобильную версию на форум

DeaDRoMeO

368

14737

Аватар пользователя

17 июл 2017, 22:40

madam-ka

Оставить свой комментарий

Поделиться темой с помощью

Ссылки на тему

Прямая ссылка:
BB-код для форумов, сайтов, блогов:
HTML ссылка:
 


Самая неформальная поддержка phpBB :P