function IndexForumUserTopics() { global $forum_lang; $forums_tree = ForumTree::Instance(); // Проверка данных if (isset($_GET['user'])) { $user_id = SafeEnv($_GET['user'], 11, int); $user = GetUserInfo($user_id); if ($user === false) { // Пользователь не найден System::site()->AddTextBox($forum_lang['error'], $forum_lang['error_no_user']); return; } } else { System::site()->AddTextBox($forum_lang['error'], $forum_lang['error_no_data']); // Нет параметра return; } // Параметры постраничной навигации if (isset($_GET['page'])) { $page = SafeEnv($_GET['page'], 11, int); } else { $page = 1; } $topics_on_page = System::config('forum/topics_on_page'); // Устанавливаем заголовок страницы $function_title = $forum_lang['allusertopics'] . ' "' . $user['name'] . '"'; System::site()->SetTitle(SafeDB($function_title, 255, str) . ' - ' . ($page > 1 ? $forum_lang['page'] . $page . ' - ' : '') . $forum_lang['forum']); $forum_nav_url = Ufu('index.php?name=forum&op=usertopics&user='******'forum/usertopics/{user}-{page}/', true); //$forum_url = Ufu('index.php?name=forum&op=usertopics&user='******'forum/usertopics/{user}/'); // Объекты статистики и онлайн $statistics = ForumStatistics::Instance(); $online = ForumOnline::Instance('0', '0', true); // Обновляем статус онлайн // Инициализируем статистику $statistics->Initialize($forum_lang['statistics_cat']); // Хлебные крошки System::site()->BreadCrumbAdd($function_title); $auth = System::user()->Auth; $is_admin = System::user()->isAdmin(); $current_user_id = System::user()->Get('u_id'); // Загружаем данные корзины для видимых топиков $basket = ForumBasketGetData('forum_basket_topics'); // Загружаем информацию по топикам в $topics_data и считаем статистику (кэшировать статистику) $topics_data = ForumCacheGetTopics(); // Запрашиваем данные тем (агрегированы по форумам) $topics = array(); // Сюда будем добавлять топики для вывода $resolve_cats = $forums_tree->GetAllAccessForumId(0); // Считаем только в открытых для доступа форумах foreach ($resolve_cats as $resolve_cat) { if (!isset($topics_data[$resolve_cat])) { continue; } foreach ($topics_data[$resolve_cat] as $topic) { // Отсеиваем if ($topic['starter_id'] == $user_id) { // Добавляем данные из корзины, если топик удалён в корзину $topic['status'] = ''; $topic['show_delete'] = $is_admin; if ($topic['delete'] && isset($basket[$topic['id']]) && $auth && ($is_admin || $topic['starter_id'] == $current_user_id)) { // Добавляем сообщение - "Удалено в корзину" $topic['status'] = ForumBasketRender($topic['id'], $topic['title'], $basket, false); $topic['show_delete'] = false; } elseif ($topic['delete']) { continue; // Удалён топик и корзина не показывается для этого пользователя } $statistics->hits += $topic['hits']; $statistics->AddTopicAuthor($topic['starter_id'], $topic['starter_name']); $statistics->topics_count += 1; $statistics->reply_count += $topic['posts']; $topics[] = $topic; } } } unset($topics_data); // Заголовки (Темы, Ответов, Просмотры) System::site()->AddBlock('statistik', true, false, 'stat'); System::site()->SetVars('statistik', array('count_read' => '')); // Отключаем некоторые блоки System::site()->AddBlock('topic_form', false, false, 'form'); System::site()->AddBlock('topic_right', false, false, 'topic'); System::site()->AddBlock('forum', false); System::site()->AddBlock('forum_guest_message', false); // Блоки шаблона // Ссылки, Отметить все как прочитанные и показать все не прочитанные темы. $vars_is_forum_member = array(); $vars_is_forum_member['url'] = '<a href="' . Ufu('index.php?name=forum&op=markread', 'forum/markread/') . '">' . $forum_lang['mark_all_read'] . '</a>'; $vars_is_forum_member['viewnoreadurl'] = '<a href="' . Ufu('index.php?name=forum&op=viewnoread', 'forum/viewnoread/') . '">' . $forum_lang['viewnoread'] . '</a>'; $vars_is_forum_member['forum_id'] = '0'; if (!System::site()->HasBlock('is_forum_member')) { System::site()->AddBlock('is_forum_member', AccessIsResolved(2), false, 'mark'); } System::site()->SetVars('is_forum_member', $vars_is_forum_member); // Последние темы форума System::site()->AddBlock('old', true, false, 'mark'); $vars_old = array(); $vars_old['lasttopics'] = '<a href="' . Ufu('index.php?name=forum&op=lasttopics', 'forum/lasttopics/') . '">' . $forum_lang['lasttopics'] . '</a>'; System::site()->SetVars('old', $vars_old); // Блок списка топиков System::site()->AddBlock('topics', true, true, 'topic'); // Инициализируем постраничную навигацию $navigation = new Navigation($page); $navigation->FrendlyUrl = System::config('general/ufu'); // Выводим топики в шаблон if (count($topics) == 0) { // В этом форуме пока нет ни одной темы System::site()->AddBlock('no_topics', true); $navigation->DisableNavigation(); } else { // Вывод постраничной навигации $navigation->GenNavigationMenu($topics, $topics_on_page, $forum_nav_url); // Загружаем данные о прочтении тем $read_data = Forum_Marker_GetReadData(); $visable_topics = false; // Вывод тем из этой категории с постраничной навигацией foreach ($topics as $topic) { $forum_config = $forums_tree->GetForumConfigRecursive($topic['forum_id']); // Конфигурация просматриваемого форума // Статус прочитано $read = true; // прочитано if ($auth && (!isset($read_data[$topic['id']]) || $topic['last_post'] > $read_data[$topic['id']]['date'])) { $read = false; } $topic = ForumTopicFilterData($topic); // Фильтрация данных топика $topic['on'] = !$read; $topic['off'] = $read; if (!$topic['close']) { $topic['close'] = $forum_config['close']; $topic['begin'] = !$forum_config['close']; } $topic['page'] = $page; $visable_topics = true; System::site()->AddSubBlock('topics', true, $topic); } System::site()->AddBlock('no_topics', !$visable_topics); } // Блоки модерации ModerationForumTopicsBlocks(); // Подключаем шаблон System::site()->AddTemplatedBox('', 'module/forum_topics.html'); // Выводм блок онлайн $online->Render('0', '0', $forum_lang['all_online'], 'forum_topics_online'); // Выводим статистику $statistics->Render('forum_topics_statistics'); // Выбор периода и быстрый переход ForumQuickTransitionBox(0, $forum_lang['quick_transition']); }
/** * Рекурсивно проверяет ограничения доступа у всех родителей объекта и возвращает наименьшие права, а так-же ищет последнее сообщение * в ветке форума и подсчитывает общее количество тем и сообщений. * @param type $CatId * @param null $UserLevel * @param null $RankMin * @return array [no_link_guest, new_message_email, access, add_topic, add_post, close, access_reason, add_topic_reason, add_post_reason, ...] */ public function GetForumConfigRecursive($CatId, $UserLevel = null, $RankMin = null) { $config = array('no_link_guest' => '0', 'new_message_email' => '1', 'admin_theme_add' => '0', 'rang_access' => '0', 'rang_message' => '0', 'rang_add_theme' => '0', 'close_topic' => '0', 'view' => '4', 'status' => '1'); $result = array('no_link_guest' => false, 'new_message_email' => true, 'access' => true, 'add_topic' => true, 'add_post' => true, 'close' => false, 'access_reason' => '', 'add_topic_reason' => '', 'add_post_reason' => '', 'topics' => 0, 'posts' => 0, 'last_post' => 0, 'last_poster_id' => 0, 'last_poster_name' => '', 'last_title' => '', 'last_id' => 0); // Подсчитываем наименьшие права $parents = $this->GetAllParent($CatId); // У всех родителей и у себя foreach ($parents as &$parent) { if ($parent['no_link_guest'] == '1') { $config['no_link_guest'] = '1'; } if ($parent['new_message_email'] == '0') { $config['new_message_email'] = '0'; } if ($parent['admin_theme_add'] == '1') { $config['admin_theme_add'] = '1'; } if ($parent['rang_access'] != '0' && $config['rang_access'] == '0') { $config['rang_access'] = $parent['rang_access']; } elseif ($parent['rang_access'] != '0' && $config['rang_access'] != '0' && GetRankInfo($parent['rang_access'], 'min') > GetRankInfo($config['rang_access'], 'min')) { $config['rang_access'] = $parent['rang_access']; } if ($parent['rang_message'] != '0' && $config['rang_message'] == '0') { $config['rang_message'] = $parent['rang_message']; } elseif ($parent['rang_message'] != '0' && $config['rang_message'] != '0' && GetRankInfo($parent['rang_message'], 'min') > GetRankInfo($config['rang_message'], 'min')) { $config['rang_message'] = $parent['rang_message']; } if ($parent['rang_add_theme'] != '0' && $config['rang_add_theme'] == '0') { $config['rang_add_theme'] = $parent['rang_add_theme']; } elseif ($parent['rang_add_theme'] != '0' && $config['rang_add_theme'] != '0' && GetRankInfo($parent['rang_add_theme'], 'min') > GetRankInfo($config['rang_add_theme'], 'min')) { $config['rang_add_theme'] = $parent['rang_add_theme']; } if ($parent['close_topic'] == '1') { $config['close_topic'] = '1'; } if ($parent['view'] < $config['view']) { $config['view'] = $parent['view']; } if ($parent['status'] == '0') { $config['status'] = '0'; } } $user_rank = array(); if (isset($UserLevel)) { $user_level = $UserLevel; if (isset($RankMin)) { $user_rank['min'] = $RankMin; } else { $user_rank['min'] = 0; } } else { $user_level = System::user()->AccessLevel(); if ($user_level == ACCESS_MEMBER) { // Пользователь $user_rank = GetUserRankInfo(); // Ранг текущего пользователя } } $result['no_link_guest'] = $user_level == ACCESS_GUEST && $config['no_link_guest'] == '1'; // Только для гостей $result['new_message_email'] = $user_level < ACCESS_MEMBER && $config['new_message_email'] == '1'; // Только для пользователй // Доступ if (!AccessIsResolved($config['view'])) { // Проверяем доступ по view $result['access'] = false; $result['access_reason'] = 'Доступ в этот раздел ограничен.'; } elseif ($config['status'] == '0') { $result['access'] = false; $result['access_reason'] = 'Раздел отключён.'; } elseif ($user_level != ACCESS_ADMIN && $config['rang_access'] != '0') { if ($user_level > ACCESS_MEMBER) { // Гость $result['access'] = false; $result['access_reason'] = 'Доступ в этот раздел ограничен для гостей.'; } elseif ($user_level == ACCESS_MEMBER && GetRankInfo($config['rang_access'], 'min') > $user_rank['min']) { // Пользователь $result['access'] = false; $result['access_reason'] = 'Доступ в этот раздел разрешен только пользователям с рангом "' . SafeDB(GetRankInfo($config['rang_access'], 'title'), 255, str) . '" и выше.'; } } // Добавление тем if (!$result['access']) { $result['add_topic'] = false; $result['add_topic_reason'] = $result['access_reason']; } elseif ($user_level != ACCESS_ADMIN) { if ($user_level > ACCESS_MEMBER) { $result['add_topic'] = false; $result['add_topic_reason'] = 'Гости не могут создавать темы.'; } elseif ($config['close_topic'] == '1') { $result['add_topic'] = false; $result['add_topic_reason'] = 'Форум закрыт для обсуждения.'; } elseif ($config['admin_theme_add'] == '1') { $result['add_topic'] = false; $result['add_topic_reason'] = 'Создавать новые темы могут только администраторы.'; } elseif ($config['rang_add_theme'] != '0') { if ($user_level == ACCESS_MEMBER && GetRankInfo($config['rang_add_theme'], 'min') > $user_rank['min']) { // Пользователь $result['add_topic'] = false; $result['add_topic_reason'] = 'Создание тем разрешено только пользователям с рангом "' . SafeDB(GetRankInfo($config['rang_add_theme'], 'title'), 255, str) . '" и выше.'; } } } // Добавление сообщений if (!$result['access']) { $result['add_post'] = false; $result['add_post_reason'] = $result['access_reason']; } elseif ($user_level != ACCESS_ADMIN) { if ($user_level > ACCESS_MEMBER) { $result['add_post'] = false; $result['add_post_reason'] = 'Гости не могут добавлять сообщения.'; } elseif ($config['close_topic'] == '1') { $result['add_post'] = false; $result['add_post_reason'] = 'Форум закрыт для обсуждения.'; } elseif ($config['rang_add_theme'] != '0') { if ($user_level == ACCESS_MEMBER && GetRankInfo($config['rang_message'], 'min') > $user_rank['min']) { // Пользователь $result['add_post'] = false; $result['add_post_reason'] = 'Добавление сообщений разрешено только пользователям с рангом "' . SafeDB(GetRankInfo($config['rang_message'], 'title'), 255, str) . '" и выше.'; } } } // Форум закрыт $result['close'] = $config['close_topic'] == '1'; // Ищем данные о последнем посте, подсчитываем общее количество тем и сообщений $childs = $this->GetAllChildId($CatId); foreach ($childs as $child) { $child = $this->IdCats[$child]; $result['topics'] += $child['topics']; $result['posts'] += $child['posts']; if ($result['last_post'] < $child['last_post']) { $result['last_post'] = $child['last_post']; $result['last_poster_id'] = $child['last_poster_id']; $result['last_poster_name'] = $child['last_poster_name']; $result['last_title'] = $child['last_title']; $result['last_id'] = $child['last_id']; } } return $result; }
/** * Главная страница форума, список форумов в категории или подфорумов в форуме. * @param int $cat_id Идентификатор просматриваемого каталога * @global type $forum_lang * @return type */ function IndexForumMain($cat_id = null, &$topics_data = null) { global $forum_lang; $forums_tree = ForumTree::Instance(); if (isset($cat_id)) { $parent = $forums_tree->IdCats[$cat_id]['parent_id']; // Чтобы сделать просмотр категории нужно её выводить как подкатегорию родительской категории $cat = $parent == 0; // Просмотр категории или главной страницы форума $main = false; // Не главная страница (просмотр категории или форума) } else { $cat = true; // Однозначно просматриваем категрию или главную страницу форума (выводим блоки онлайн и статистики) $cat_id = 0; $parent = 0; // Корневой раздел в качестве родительской категории $main = true; // Главная страница } // Нет категорий, выводим сообщение if (!isset($forums_tree->Cats[$parent]) && $cat) { System::site()->AddTextBox($forum_lang['forum'], $forum_lang['no_category']); return; } if ($cat) { // Выводим категорию или главная страница форума (без топиков) // Устанавливаем заголовок страницы if (!$main) { System::site()->SetTitle(SafeDB($forums_tree->IdCats[$cat_id]['title'], 255, str) . ' - ' . $forum_lang['forum']); } // Объекты статистини и онлайн $statistics = ForumStatistics::Instance(); $online = ForumOnline::Instance($cat_id, '0', true); // Инициализируем статистику $statistics->Initialize($forum_lang['statistics']); // Загружаем информацию по топикам в $topics_data и считаем статистику (кэшировать статистику) $topics_data = ForumCacheGetTopics(); // Запрашиваем данные тем (агрегированы по форумам) $resolve_cats = array_keys($topics_data); foreach ($resolve_cats as $resolve_cat) { if (!isset($topics_data[$resolve_cat])) { continue; } foreach ($topics_data[$resolve_cat] as $topic) { $statistics->hits += $topic['hits']; $statistics->AddTopicAuthor($topic['starter_id'], $topic['starter_name']); } } // Подсчитываем количество тем и постов $counters = $forums_tree->GetCountersRecursive($cat_id); $statistics->topics_count = $counters['files']; $statistics->reply_count = $counters['cats']; // Выводим хлебные крошки $forums_tree->BreadCrumbsF($cat_id); System::site()->BreadCrumbsLastUrl = true; // Ссылки, Отметить все как прочитанные и показать все не прочитанные темы. System::site()->AddBlock('is_forum_member', AccessIsResolved(2), false, 'mark'); $vars_is_forum_member = array(); $vars_is_forum_member['url'] = '<a href="' . Ufu('index.php?name=forum&op=markread', 'forum/markread/') . '">' . $forum_lang['mark_all_read'] . '</a>'; $vars_is_forum_member['viewnoreadurl'] = '<a href="' . Ufu('index.php?name=forum&op=viewnoread', 'forum/viewnoread/') . '">' . $forum_lang['viewnoread'] . '</a>'; System::site()->Blocks['is_forum_member']['vars'] = $vars_is_forum_member; // Последние темы форума System::site()->AddBlock('old', true, false, 'mark'); $vars_old = array(); $vars_old['lasttopics'] = '<a href="' . Ufu('index.php?name=forum&op=lasttopics', 'forum/lasttopics/') . '">' . $forum_lang['lasttopics'] . '</a>'; System::site()->Blocks['old']['vars'] = $vars_old; } // Загружаем данные о прочтении тем $read_data = Forum_Marker_GetReadData(); $auth = System::user()->Auth; // Блоки форума System::site()->AddBlock('forums', true, true, 'forum'); System::site()->AddBlock('is_no_sub_forum', $cat, false); // Блок со статистикой и онлайн (отключается в категории) $visable_cats = false; // Выведена хотябы одна категория с форумом - если нет то показываем ошибку foreach ($forums_tree->Cats[$parent] as $category) { // Категории if (!$main && ($category['id'] != $cat_id || !isset($forums_tree->Cats[$category['id']]))) { // Если просматриваем только одну категорию continue; } // Рекурсивно определяем настройки $forum_config = $forums_tree->GetForumConfigRecursive($category['id']); // Нет доступа или форум не виден или отключён if (!$forum_config['access']) { continue; } $visable_cats = true; $category = IndexForumDataFilter($category, $forum_config); // Выводим категорию IndexForumCatOpen($category); IndexForumRender($category); // Выводим форумы foreach ($forums_tree->Cats[$category['id']] as $forum) { $forum_id = $forum['id']; $forum_config = $forums_tree->GetForumConfigRecursive($forum_id); // Нет доступа или форум не виден или отключён if (!$forum_config['access']) { continue; } $forum = IndexForumDataFilter($forum, $forum_config); // Обрабатываем подфорумы $subforums = array(); if (isset($forums_tree->Cats[$forum_id])) { foreach ($forums_tree->Cats[$forum_id] as $sforum) { // Подфорумы, нужно добавить только пометку о прочтении и обработать $read = true; // прочитан if ($auth) { $childs_forums = $forums_tree->GetAllChildId($sforum['id']); foreach ($childs_forums as $child_forum_id) { if (!isset($topics_data[$child_forum_id])) { continue; } foreach ($topics_data[$child_forum_id] as $topic) { if (!isset($read_data[$topic['id']]) || $topic['last_post'] > $read_data[$topic['id']]['date']) { $read = false; // не прочитан break; } } if (!$read) { break; } } } $sforum = IndexForumDataFilter($sforum); $sforum['read'] = $read; $subforums[] = $sforum; } } // Определяем статус "прочинано" для форума $read = true; // прочитан if ($auth) { $childs_forums = $forums_tree->GetAllChildId($forum_id); foreach ($childs_forums as $child_forum_id) { if (!isset($topics_data[$child_forum_id])) { continue; } foreach ($topics_data[$child_forum_id] as $topic) { if (!isset($read_data[$topic['id']]) || $topic['last_post'] > $read_data[$topic['id']]['date']) { $read = false; // не прочитан break; } } if (!$read) { break; } } } // Вывод форума в шаблон IndexForumRender($forum, false, $read, $subforums); } // Закрываем категорию IndexForumCatClose($category); } if ($visable_cats) { // Шаблон форума (полезно подключать шаблоны вконце, там может быть PHP код) System::site()->AddTemplatedBox('', 'module/forums.html'); } if ($cat) { // Не при просмотре форума (субфорумы + топики) if (!$visable_cats) { System::site()->AddTextBox($forum_lang['forum'], $forum_lang['no_category']); return; } // Выводим блок онлайн $online->Render($cat_id, '0', $cat_id == 0 ? $forum_lang['all_online'] : $forum_lang['current_category']); // Выводим статистику $statistics->Render(); // Быстрый переход if (!$cat) { ForumQuickTransitionBox($cat_id, $forum_lang['quick_transition']); } } }
exit; } System::site()->SetTitle('Страницы'); // Удаляем хлебную крошку с именем модуля unset(System::site()->BreadCrumbs[count(System::site()->BreadCrumbs) - 1]); if (isset($_GET['file']) && $_GET['file'] != '') { $link = SafeEnv(Utf8ToCp1251(rawurldecode($_GET['file'])), 255, str); } else { $link = System::config('pages/default_page'); } System::database()->Select('pages', "`link`='{$link}' and `enabled`='1' and `type`='page'"); if (System::database()->NumRows() > 0) { $page = System::database()->FetchRow(); $hits = SafeEnv($page['hits'], 11, int) + 1; System::database()->Update('pages', "`hits`='{$hits}'", "`link`='{$link}'"); if (AccessIsResolved($page['view'])) { System::site()->SetTitle(SafeDB($page['title'], 255, str)); System::site()->Seo(SafeDB($page['seo_title'], 255, str), SafeDB($page['seo_keywords'], 255, str), SafeDB($page['seo_description'], 255, str)); System::site()->AddTemplatedBox('', 'module/page.html'); System::site()->AddBlock('page'); $vars = array(); ErrorsOff(); $vars['show_title'] = $page['info_showmode'][0] == '1'; $vars['show_copy'] = $page['info_showmode'][1] == '1'; $vars['show_public'] = $page['info_showmode'][2] == '1'; $vars['show_modified'] = $page['info_showmode'][3] == '1'; $vars['show_hits'] = $page['info_showmode'][4] == '1'; $vars['show_info'] = $vars['show_copy'] || $vars['show_public'] || $vars['show_modified'] || $vars['show_hits']; ErrorsOn(); $vars['title'] = SafeDB($page['title'], 255, str); if ($page['auto_br'] == '1') {
function IndexForumShowTopic($one_post = false) { global $forum_lang; $forums_tree = ForumTree::Instance(); // Вспомогательные переменные $user_auth = System::user()->Auth; $user_id = System::user()->Get('u_id'); $user_admin = System::user()->isAdmin(); $time = time(); $max_word_length = System::config('forum/max_word_length'); if (isset($_GET['topic'])) { $topic_id = SafeEnv($_GET['topic'], 11, int); } else { System::site()->AddTextBox($forum_lang['error'], $forum_lang['error_no_topic']); return; } // Берём тему и проверяем на доступ System::database()->Select('forum_topics', "`id`='" . $topic_id . "'"); if (System::database()->NumRows() == 0) { System::site()->AddTextBox($forum_lang['error'], $forum_lang['error_no_topic']); return; } $topic = System::database()->FetchRow(); if (!$user_admin && $topic['starter_id'] == $user_id && $topic['delete'] == '1') { // Тема удалена в корзину (только админы видят корзину и автор темы) System::site()->AddTextBox($forum_lang['topic_basket_current_post'], '<p align="center">' . $forum_lang['topic_basket_post'] . '.<br><input type="button" value="' . $forum_lang['back'] . '"onclick="history.back();"></p>'); return; } // Проверяем доступ к форуму $forum_id = SafeEnv($topic['forum_id'], 11, int); $forum_config = $forums_tree->GetForumConfigRecursive($forum_id); // Параметры доступа на форум if (!$forum_config['access']) { System::site()->AddTextBox($forum_lang['error'], $forum_config['access_reason']); // Нет доступа в этот форум return; } // $forum_config['add_post'] - право добавлять сообщения // $forum_config['add_post_reason'] - причина запрета добавления сообщений // $forum_config['no_link_guest'] - скрывать ссылки от гостей // $forum_config['new_message_email'] - разрешить подписку на новые сообщения // Определяем следующую и предыдущую темы $topics_data = ForumCacheGetTopics(); $topics_data = $topics_data[$forum_id]; $prev_topic = null; $next_topic = null; $find = false; foreach ($topics_data as $topic_row) { if ($topic_row['id'] == $topic_id) { $find = true; continue; } if ($find) { $next_topic = $topic_row; break; } $prev_topic = $topic_row; } // Параметры постраничной навигации if (isset($_GET['page'])) { $page = SafeEnv($_GET['page'], 11, int); } else { $page = 1; } if (isset($_GET['view']) && $_GET['view'] == 'lastpost') { $lastpost = true; } else { $lastpost = false; } $posts_on_page = System::config('forum/posts_on_page'); // Обновляем метку о прочтении темы, если пользователь авторизован if ($user_auth) { System::database()->Delete('forum_topics_read', "`tid`='{$topic_id}' and `mid`='{$user_id}'"); System::database()->Insert('forum_topics_read', "'{$user_id}','{$topic_id}','{$time}'"); } // Объект онлайн $online = ForumOnline::Instance($forum_id, $topic_id); // Устанавливаем заголовок страницы $topic_title = SafeDB($topic['title'], 255, str); System::site()->SetTitle($topic_title . ($page > 1 ? ' - Страница ' . $page : '')); // Хлебные крошки $forums_tree->BreadCrumbsF($forum_id); System::site()->BreadCrumbAdd(SafeDB($topic['title'], 255, str)); // Добавляем корзину (если тема удалена в корзину) if ($topic['delete'] == '1') { $basket_topics = ForumBasketGetData('forum_basket_topics'); if (isset($basket_topics[$topic['id']])) { System::site()->AddTextBox($forum_lang['topic_basket_red'], ForumBasketRender($topic['id'], $topic['title'], $basket_topics, true)); } } // Увеличиваем счётчик просмотров System::database()->Update('forum_topics', "`hits`='" . (SafeDB($topic['hits'], 11, int) + 1) . "'", "`id`='" . $topic_id . "'"); // Инициализируем постраничную навигацию $navigation = new Navigation($page); $navigation->FrendlyUrl = System::config('general/ufu'); // Загружаем сообщения из базы данных $basket_where = ''; // Администратор (подготавливаем запрос выборки т.к. нужно знать сколько всего сообщений для постр. навигации) if ($user_auth) { if (!$user_admin) { $basket_where = " and (`delete`='0' or `user_id`='{$user_id}')"; // Пользователь } } else { $basket_where = " and `delete`='0'"; // Гость } $posts = System::database()->Select('forum_posts', ($one_post !== false ? "`id`='{$one_post}'" : "`object`='{$topic_id}'") . $basket_where); SortArray($posts, 'public', false); //Сортируем по дате // Вывод постраничной навигации if (count($posts) > $posts_on_page) { if ($lastpost) { $page = ceil(count($posts) / $posts_on_page); } $navigation->GenNavigationMenu($posts, $posts_on_page, Ufu('index.php?name=forum&op=showtopic&topic=' . $topic_id, 'forum/topic' . $topic_id . '-{page}.html', true), $page); } else { $navigation->DisableNavigation(); } // Загружаем корзину для сообщений $basket = ForumBasketGetData('forum_basket_post'); // Блок с информацией о теме System::site()->AddBlock('topic', true, false); System::site()->SetVars('topic', ForumTopicFilterData($topic)); // Блок шаблонизатора для вывода сообщений System::site()->AddBlock('forum_posts', true, true, 'post'); $is_forum_member = AccessIsResolved(2); // Для определения первого и последнего сообщения $i = 1; // Выводим сообщения в шаблонизатор foreach ($posts as $post) { $post_user_id = SafeDB($post['user_id'], 11, int); if ($post_user_id == 0) { continue; } $vars = array(); // Обрабатываем текст сообщения if ($post['delete'] == '1') { // Сообщение удалено в корзину $vars['text'] = ForumBasketRender($post['id'], $post['message'], $basket); } else { $vars['text'] = HtmlChars($post['message']); if ($forum_config['no_link_guest']) { // Скрываем ссылки от гостей $replace = '<p class="notice">' . $forum_lang['hide_links_for_guests'] . '</p>'; $vars['text'] = preg_replace('/\\<a[^\\>]*?(http|https|ftp|www)(.*?)\\<\\/a\\>/is', $replace, $vars['text']); $vars['text'] = preg_replace('/(http:\\/\\/|https:\\/\\/|ftp:\\/\\/|www\\.)?([a-zA-Z0-9]+)\\.(ru|su|com|org|net|info|name|ws|cc|tv|tel|kz|biz|mobi|asia|me|tw|ua)+([а-яА-Яa-zA-Z0-9\'~;,@#%&_\\!\\$\\^\\*\\(\\)\\-\\=\\+\\?\\.\\:\\/\\\\]*)?/is', $replace, $vars['text']); } SmiliesReplace($vars['text']); $vars['text'] = nl2br($vars['text']); $vars['text'] = BbCodePrepare($vars['text']); if ($max_word_length > 0) { $vars['text'] = word_wrapped_string($vars['text'], $max_word_length); } } // Обрабатываем данные сообщения // Пользователь $user_info = GetUserInfo($post_user_id); $vars['usertopics'] = '<a href="' . Ufu('index.php?name=forum&op=usertopics&user='******'forum/usertopics/{user}/') . '">' . $forum_lang['allusertopics'] . '</a>'; if ($user_info['rank_name'] != '') { $vars['author'] = '<a href="' . Ufu('index.php?name=user&op=userinfo&user='******'user/{user}/info/') . '">' . $user_info['name'] . '</a>'; $vars['author_name'] = $user_info['name']; } else { $vars['author'] = $post['name']; $vars['author_name'] = $post['name']; } if ($user_info['hideemail'] == '0') { $vars['email'] = AntispamEmail($user_info['email']); } else { $vars['email'] = ' '; } if ($user_info['url'] != '') { $vars['homepage'] = '<a href="http://' . $user_info['url'] . '" target="_blank">' . $user_info['url'] . '</a>'; } else { $vars['homepage'] = ' '; } $vars['icq'] = $user_info['icq']; if ($user_info['online']) { $vars['status'] = $forum_lang['user_online']; } else { $vars['status'] = ''; } $vars['rank_image'] = $user_info['rank_image'] != '' ? $user_info['rank_image'] : ''; $vars['rank_name'] = $user_info['rank_name'] != '' ? $user_info['rank_name'] : ''; $vars['avatar'] = $user_info['avatar_file'] != '' ? $user_info['avatar_file'] : GetPersonalAvatar(0); $vars['regdate'] = TimeRender($user_info['regdate'], false, true); if (isset($user_info['data']['forum_counters'])) { $vars['user_posts_count'] = $user_info['data']['forum_counters']['posts']; $vars['user_topics_count'] = $user_info['data']['forum_counters']['topics']; } else { $vars['user_posts_count'] = '0'; $vars['user_topics_count'] = '0'; } // Сообщение $vars['public'] = $forum_lang['added'] . TimeRender($post['public']); $vars['public_date'] = TimeRender($post['public']); $vars['ip'] = SafeDB($post['user_ip'], 19, str); $vars['topic_id'] = $topic_id; $vars['id'] = SafeDB($post['id'], 11, int); $vars['nodelete'] = SafeDB($post['delete'], 1, int) == 1 ? false : true; $vars['is_admin_and_nodelete'] = $vars['nodelete'] && $user_admin; $vars['page'] = $page; // is_current_user Пользователь является владельцем сообщения (кнопки редактировать и удалить) if ($post['delete'] == '0') { $vars['is_current_user'] = $user_id == $post['user_id'] && $topic['close_topics'] == '0' || $user_admin; } else { $vars['is_current_user'] = false; } if ($one_post === false) { $vars['num'] = $page > 1 ? $page * $posts_on_page - $posts_on_page + $i : $i; $vars['url'] = "javascript:link_post('" . GetSiteUrl() . Ufu("index.php?name=forum&op=post&topic=" . $topic_id . "&post=" . $post['id'], 'forum/t{topic}/post{post}.html') . "')"; } else { $vars['num'] = ''; $vars['url'] = 'javascript:history.go(-1)'; } $vars['is_forum_member'] = $is_forum_member; System::site()->AddSubBlock('forum_posts', true, $vars, array(), 'module/forum_post.html'); $i++; } // Форма добавления сообщений System::site()->AddBlock('post_form', $forum_config['add_post'], false); ForumRenderPostForm(false, $forum_id, $topic_id, 0, '', '', $is_forum_member); // Подписка на тему System::site()->AddBlock('subscription', $forum_config['new_message_email'], false, 'subs'); $vars_subs = array(); $vars_subs['topic'] = $topic_id; $vars_subs['sub_status'] = Forum_Subscription_Status($topic_id); $vars_subs['status'] = $vars_subs['sub_status'] ? 'Отписаться от этой темы' : 'Подписаться на эту тему'; System::site()->SetVars('subscription', $vars_subs); System::site()->AddBlock('is_forum_member', $is_forum_member, false, 'marker'); System::site()->SetVars('is_forum_member', array('id' => $topic_id)); // Подключаем шаблон System::site()->AddTemplatedBox('', 'module/forum_showtopic.html'); // Выводим блок онлайн $online->Render($forum_id, $topic_id, $forum_lang['current_online'], 'forum_online'); // Предыдущая и следующая тема System::site()->AddBlock('forum_prev_topic', isset($prev_topic), false, 'topic'); if (isset($prev_topic)) { System::site()->SetVars('forum_prev_topic', array('url' => Ufu('index.php?name=forum&op=showtopic&topic=' . SafeDB($prev_topic['id'], 11, int), 'forum/topic{topic}.html'), 'title' => SafeDB($prev_topic['title'], 255, str), 'lang_prev_topic' => $forum_lang['prev_topic'])); } System::site()->AddBlock('forum_next_topic', isset($next_topic), false, 'topic'); if (isset($next_topic)) { System::site()->SetVars('forum_next_topic', array('url' => Ufu('index.php?name=forum&op=showtopic&topic=' . SafeDB($next_topic['id'], 11, int), 'forum/topic{topic}.html'), 'title' => SafeDB($next_topic['title'], 255, str), 'lang_next_topic' => $forum_lang['next_topic'])); } // Быстрый переход по форумам ForumQuickTransitionBox($forum_id, $forum_lang['quick_transition']); }
function IndexForumShowForum() { global $forum_lang; $forums_tree = ForumTree::Instance(); // Параметры просмотра из GET // $forum_id // $forum // $forum_config if (isset($_GET['forum'])) { $forum_id = SafeEnv($_GET['forum'], 11, int); if (isset($forums_tree->IdCats[$forum_id])) { // Проверяем идентификатор форума и загружаем его данные $forum = $forums_tree->IdCats[$forum_id]; // Форум $forum_config = $forums_tree->GetForumConfigRecursive($forum_id); // Конфигурация просматриваемого форума } else { System::site()->AddTextBox($forum_lang['error'], $forum_lang['error_no_forum']); // Форум не найден return; } } else { System::site()->AddTextBox($forum_lang['error'], $forum_lang['error_no_forum']); // Нет параметра return; } // Проверяем доступ if (!$forum_config['access']) { System::site()->AddTextBox($forum_lang['error'], $forum_config['access_reason']); // Нет доступа в этот форум return; } // Параметры постраничной навигации if (isset($_GET['page'])) { $page = SafeEnv($_GET['page'], 11, int); } else { $page = 1; } $topics_on_page = System::config('forum/topics_on_page'); // Устанавливаем заголовок страницы System::site()->SetTitle(SafeDB($forum['title'], 255, str) . ' - ' . ($page > 1 ? $forum_lang['page'] . $page . ' - ' : '') . $forum_lang['forum']); // Объекты статистики и онлайн $statistics = ForumStatistics::Instance(); $online = ForumOnline::Instance($forum_id); // Инициализируем статистику $statistics->Initialize($forum_lang['statistics_cat']); // Загружаем информацию по топикам в $topics_data и считаем статистику (кэшировать статистику) $topics_data = ForumCacheGetTopics(); // Запрашиваем данные тем (агрегированы по форумам) $resolve_cats = $forums_tree->GetAllChildId($forum_id); // Считаем только в текущем форуме и всех подфорумах foreach ($resolve_cats as $resolve_cat) { if (!isset($topics_data[$resolve_cat])) { continue; } foreach ($topics_data[$resolve_cat] as $topic) { $statistics->hits += $topic['hits']; $statistics->AddTopicAuthor($topic['starter_id'], $topic['starter_name']); } } // Подсчитываем количество тем и постов $counters = $forums_tree->GetCountersRecursive($forum_id); $statistics->topics_count = $counters['files']; $statistics->reply_count = $counters['cats']; // Выводим подфорумы с помощью функции main (если есть) if (isset($forums_tree->Cats[$forum_id]) && count($forums_tree->Cats[$forum_id]) > 0) { ForumLoadFunction('main'); IndexForumMain($forum_id, $topics_data); // <-- IndexForumMain // Если просматриваем категорию, то топики не выводим if ($forum['parent_id'] == 0) { return; } } // Выводим хлебные крошки (нужно после IndexForumMain чтобы не выводились два раза при просмотре категории) $forums_tree->BreadCrumbsF($forum_id); // Блоки шаблона // Ссылки, Отметить все как прочитанные и показать все не прочитанные темы. $vars_is_forum_member = array(); $vars_is_forum_member['url'] = '<a href="' . Ufu('index.php?name=forum&op=markread' . ($forum_id > 0 ? '&forum=' . $forum_id : ''), 'forum/markread/' . ($forum_id > 0 ? '{forum}/' : '')) . '">' . $forum_lang['mark_all_read'] . '</a>'; $vars_is_forum_member['viewnoreadurl'] = '<a href="' . Ufu('index.php?name=forum&op=viewnoread' . ($forum_id > 0 ? '&forum=' . $forum_id : ''), 'forum/viewnoread/' . ($forum_id > 0 ? '{forum}/' : '')) . '">' . $forum_lang['viewnoread'] . '</a>'; $vars_is_forum_member['forum_id'] = $forum_id; if (!System::site()->HasBlock('is_forum_member')) { System::site()->AddBlock('is_forum_member', AccessIsResolved(2), false, 'mark'); } System::site()->SetVars('is_forum_member', $vars_is_forum_member); // Последние темы форума System::site()->AddBlock('old', true, false, 'mark'); $vars_old = array(); $vars_old['lasttopics'] = '<a href="' . Ufu('index.php?name=forum&op=lasttopics&forum=' . $forum_id, 'forum/lasttopics/{forum}/') . '">' . $forum_lang['lasttopics'] . '</a>'; System::site()->SetVars('old', $vars_old); // Заголовки (Темы, Ответов, Просмотры) System::site()->AddBlock('statistik', true, false, 'stat'); $vars_stat = array(); $vars_stat['count_read'] = ''; $cat_users_count = $online->GetCatOnlineCount($forum_id); if ($cat_users_count > 0) { $vars_stat['count_read'] = $cat_users_count > 0 ? '<small> (' . $forum_lang['online'] . ': ' . $cat_users_count . ')</small>' : ''; } System::site()->SetVars('statistik', $vars_stat); // Блок с информацией о форуме System::site()->AddBlock('forum', true, false); System::site()->SetVars('forum', IndexForumDataFilter($forum, $forum_config)); System::site()->AddBlock('forum_guest_message', true); // Блок списка топиков System::site()->AddBlock('topics', true, true, 'topic'); // Инициализируем постраничную навигацию $navigation = new Navigation($page); $navigation->FrendlyUrl = System::config('general/ufu'); // Есть ли видимые для пользователя топики $visable_topics = false; $auth = System::user()->Auth; $user_id = System::user()->Get('u_id'); $is_admin = System::user()->isAdmin(); if (!isset($topics_data[$forum_id]) || count($topics_data[$forum_id]) == 0) { // В этом форуме пока нет ни одной темы System::site()->AddBlock('no_topics', true); $navigation->DisableNavigation(); } else { // Загружаем данные корзины для видимых топиков $basket = ForumBasketGetData('forum_basket_topics'); // Загружаем данные о прочтении тем $read_data = Forum_Marker_GetReadData(); // Фильтруем топики $topics_data = $topics_data[$forum_id]; // Топики в этом форуме $topics = array(); foreach ($topics_data as $topic) { // Добавляем данные из корзины, если топик удалён в корзину (корзину тем видят только админы и пользователи-стартеры удалённых тем) $topic['status'] = ''; $topic['show_delete'] = $is_admin; if ($topic['delete'] && isset($basket[$topic['id']]) && $auth && ($is_admin || $topic['starter_id'] == $user_id)) { // Добавляем сообщение - "Удалено в корзину" $topic['status'] = ForumBasketRender($topic['id'], $topic['title'], $basket, false); $topic['show_delete'] = false; } elseif ($topic['delete']) { continue; // Удалён топик и корзина не показывается для этого пользователя } $topics[] = $topic; } unset($topics_data); // Вывод постраничной навигации $navigation->GenNavigationMenu($topics, $topics_on_page, Ufu('index.php?name=forum&op=showforum&forum=' . $forum_id, 'forum/{forum}-{page}/', true)); // Вывод тем из этой категории с постраничной навигацией foreach ($topics as $topic) { $close = false; if ($forum_config['close']) { $close = true; } // Статус прочитано $read = true; // прочитано if ($auth && (!isset($read_data[$topic['id']]) || $topic['last_post'] > $read_data[$topic['id']]['date'])) { $read = false; } $topic = ForumTopicFilterData($topic); // Фильтрация данных топика $topic['on'] = !$read; $topic['off'] = $read; // Закрытие топиков в форуме if (!$topic['close']) { $topic['close'] = $forum_config['close']; $topic['begin'] = !$forum_config['close']; } $topic['page'] = $page; $visable_topics = true; System::site()->AddSubBlock('topics', true, $topic); } System::site()->AddBlock('no_topics', !$visable_topics); } // Форма добавления топиков $show_form = $forum_config['add_topic'] && $auth; System::site()->AddBlock('topic_form', $show_form, false, 'form'); if ($show_form) { System::site()->SetVar('topic_form', 'url', Ufu('index.php?name=forum&op=addtopic&forum=' . $forum_id, 'forum/addtopic/{forum}/')); ForumSmiliesRender(); // Подключаем BBCode редактор IncludePluginsGroup('bbcode_editors'); } // Блок "Права на форуме" System::site()->AddBlock('topic_right', true, false, 'topic', 'module/forum_right.html'); $right_text = ''; if ($forum_config['add_topic']) { $right_text .= $forum_lang['create_new_topics'] . '<br />'; } else { $right_text .= $forum_lang['no_create_new_topics'] . '<br />'; $right_text .= '(' . $forum_config['add_topic_reason'] . ')<br />'; } if ($forum_config['add_post']) { $right_text .= $forum_lang['create_new_message_in_topics'] . '<br />'; } else { $right_text .= $forum_lang['no_create_new_message_in_topics'] . '<br />'; $right_text .= '(' . $forum_config['add_post_reason'] . ')<br />'; } System::site()->SetVars('topic_right', array('right' => $right_text)); // Блоки модерации ModerationForumTopicsBlocks(); // Подключаем шаблон System::site()->AddTemplatedBox('', 'module/forum_topics.html'); // Выводм блок онлайн $online->Render($forum_id, '0', $forum_lang['current_category'], 'forum_topics_online'); // Выводим статистику $statistics->Render('forum_topics_statistics'); // Быстрый переход по форумам ForumQuickTransitionBox($forum_id, $forum_lang['quick_transition']); }
// Позже это будет вынесено в настройки сайта System::site()->SetVar('template', 'text', 'Технические работы.'); System::site()->TEcho(); exit; } // Вспомогательные константы define('MOD_DIR', System::config('mod_dir') . $ModuleName . '/'); define('MOD_FILE', MOD_DIR . 'index.php'); define('MOD_INIT', MOD_DIR . 'init.php'); define('MOD_ICON', is_file(MOD_DIR . 'icon.png') ? MOD_DIR . 'icon.png' : 'images/application.png'); $module = System::database()->SelectOne('modules', "`enabled`='1' and `folder`='" . SafeEnv($ModuleName, 255, str) . "'"); if ($module === false) { Error404(); } // Проверка на доступ if (!AccessIsResolved($module['view'], System::user()->AccessLevel()) || $module['system'] == '1' && !System::user()->isSuperUser()) { Header('HTTP/1.1 403 Forbidden'); System::site()->InitPage(); System::site()->AddTextBox('Ошибка', '<p align="center">Доступ запрещен.</p>'); System::site()->TEcho(); exit; } define('MOD_NAME', SafeDB($module['folder'], 255, str)); define('MOD_TITLE', SafeDB($module['name'], 255, str)); define('MOD_THEME', RealPath2(SafeDB($module['theme'], 255, str))); // Инициализация модуля $valid_init = file_exists(MOD_INIT); if ($valid_init) { include MOD_INIT; if (function_exists('mod_initialization')) { mod_initialization();
function AddDetailDownload(&$down) { $id = SafeDB($down['id'], 11, int); $cat_id = SafeDB($down['category'], 11, int); $func = IndexDownloadsFunc($id); $vars = array(); $vars['category_url'] = Ufu("index.php?name=downloads&cat={$cat_id}", 'downloads/{cat}/'); $vars['category_title'] = IndexDownloadsGetTree()->IdCats[$down['category']]['title']; $vars['category'] = '<a href="' . $vars['category_url'] . '">' . $vars['category_title'] . '</a>'; $vars['file_link'] = "index.php?name=downloads&op=download&file={$id}"; // Если сделать ЧПУ ссылку, то появляется проблема с относительным адресом файла if (AccessIsResolved($down['view'])) { $vars['access'] = true; $url = '<a href="' . $vars['file_link'] . '" target="_blank">Скачать файл</a>'; } else { $vars['access'] = false; $url = 'Файл только для зарегистрированных пользователей.'; } $vars['not_access'] = !$vars['access']; $vars['url'] = $url; $vars['file_title'] = SafeDB($down['title'], 255, str) . (System::user()->isAdmin() ? $func : ''); $vars['description'] = SafeDB($down['description'], 0, str, false, false); $vars['author'] = SafeDB($down['author'], 200, str); $vars['homepage'] = SafeDB($down['author_site'], 250, str); $vars['homepage_url'] = UrlRender(SafeDB($down['author_site'], 250, str)); $vars['mail'] = SafeDB($down['author_email'], 50, str); $vars['date'] = TimeRender($down['public']); $vars['hits'] = SafeDB($down['hits'], 11, int); $vars['version'] = SafeDB($down['file_version'], 250, str); $vars['size'] = FormatFileSize(SafeDB($down['size'], 11, real), SafeDB($down['size_type'], 1, str)); $vars['filetype'] = IndexDownloadsGetFileType(SafeDB($down['url'], 250, str)); $vars['addvote_url'] = "index.php?name=downloads&op=addvote&file={$id}"; System::site()->DataAdd($vdata, '0', 'Ваша оценка'); System::site()->DataAdd($vdata, '1', 'Очень плохо'); System::site()->DataAdd($vdata, '2', 'Плохо'); System::site()->DataAdd($vdata, '3', 'Средне'); System::site()->DataAdd($vdata, '4', 'Хорошо'); System::site()->DataAdd($vdata, '5', 'Отлично'); $vars['votes'] = System::site()->Select('vote', $vdata); $vars['addvotesubm'] = System::site()->Submit('Оценить файл'); $vars['allow_votes'] = SafeDB($down['allow_votes'], 1, bool); if ($down['image'] != '') { $vars['image'] = RealPath2(System::config('downloads/images_dir') . SafeDB($down['image'], 255, str)); $vars['thumb_image'] = RealPath2(System::config('downloads/images_dir') . 'thumbs/' . SafeDB($down['image'], 255, str)); } else { $vars['image'] = false; } //Выводим rating $vars['rating_num_votes'] = SafeDB($down['votes_amount'], 11, int); $vars['rating_image'] = GetRatingImage(SafeDB($down['votes_amount'], 11, int), SafeDB($down['votes'], 11, int)); $rating = $vars['rating_image']; if ($rating == '' && SafeDB($down['allow_votes'], 1, bool)) { // allow_rating $rating = 'Нет оценки'; } elseif (SafeDB($down['allow_votes'], 1, bool)) { $rating = '<img src="' . $rating . '" /> (Оценок: ' . SafeDB($down['votes_amount'], 11, int) . ')'; } else { $rating = ' - '; } $vars['rating'] = $rating; // if (!SafeDB($down['allow_comments'], 1, bool)) { // allow coments $vars['comments'] = ' - '; } else { $vars['comments'] = SafeDB($down['comments_counter'], 11, int); } System::site()->AddBlock('download', true, false, 'dl'); System::site()->Blocks['download']['vars'] = $vars; }