Тема: "Суперкатегории"
Была такая тема: Поиск не только в топиках.
Из нее у меня естественным образом родилась идея "суперкатегорий" - группировка форумов по доп. признаку.
Допустим мы хотим чтобы на нашем сайте главное меню выглядело так:
<Домой> <Форум> <Статьи> <Галерея> <Пользователи>
При этом "Статьи" и "Галерея" разумно делать как разновидность все тех же топиков -- чтобы не создавать новый поиск и раздачу вправ.
Если сама "статья" -- это первый пост темы, а коментарии к статье - это ответы - все сильно упрощается. С галереей та же история.
Остается реализовать механизм фильтрации форумов, чтобы выводились либо только разделы со статьями, либо только галереи и т.д.
1. в таблицу forums добавляем новую целочисленную колонку kind.
Предположим значение 0 в ней будет означать "обычный форум", 1 - "статьи", 2 - "галереи", 3 - "новости на главную страницу"
alter table forums add ( kind tinyint(2) default 0)1a. В файл common.php прописываем константы для наглядного представления. Хорошее место для них - сразу после строки
define('PUN_MEMBER', 4);
// Define kind of forum
define('PUN_KIND_COMMON', 0);
define('PUN_KIND_ARTICLE', 1);
define('PUN_KIND_GALLERY', 2);
define('PUN_KIND_NEWS', 3);
$valid_kinds = array(PUN_KIND_COMMON, PUN_KIND_NEWS, PUN_KIND_ARTICLE, PUN_KIND_GALLERY);2. изменяем скрипт index.php (или forum.php если вы сделали некий Miniportal):
ищем строку
require PUN_ROOT.'header.php';сразу за ней вставляем:
$kind_filter = (isset($_GET['kind']))?intval($_GET['kind']):0;пора уже заняться собственно фильтрацией. ищем такое
// Print the categories and forums
$result = $db->query('SELECT c.id AS cid, c.cat_name, f.id AS fid, f.forum_name, f.forum_desc, f.redirect_url, f.moderators, f.num_topics, f.num_posts, f.last_post, f.last_post_id, f.last_poster FROM '.$db->prefix.'categories AS c INNER JOIN '.$db->prefix.'forums AS f ON c.id=f.cat_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE fp.read_forum IS NULL OR fp.read_forum=1 ORDER BY c.disp_position, c.id, f.disp_position', true) or error('Unable to fetch category/forum list', __FILE__, __LINE__, $db->error());заменяем на
// Print the categories and forums
$result = $db->query('SELECT c.id AS cid, c.cat_name, f.id AS fid, f.forum_name, f.forum_desc, f.redirect_url, f.moderators, f.num_topics, f.num_posts, f.last_post, f.last_post_id, f.last_poster FROM '.$db->prefix.'categories AS c INNER JOIN '.$db->prefix.'forums AS f ON c.id=f.cat_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE f.kind='.$kind_filter.' AND (fp.read_forum IS NULL OR fp.read_forum=1) ORDER BY c.disp_position, c.id, f.disp_position', true) or error('Unable to fetch category/forum list', __FILE__, __LINE__, $db->error());обратили внимание на [mono]WHERE f.kind='.$kind_filter.' AND ([/mono]???
Суперкатегории есть! На этом этапе надо сделать проверку.
По-умолчанию все форумы остались просто форумами, т.к. KIND по-умолчанию == 0.
Если все сделали правильно - то форум продолжает работать как и прежде, а если вызвать такой УРЛ: [mono]index.php?kind=1[/mono] (вместо index.php может быть forum.php) -- то получим пустой пока список "статей".
3. Нашему Админу нужен инструмент для описания типа форума (forum.kind):
Открываем файл admin_forums.php. Здесь больше всего поправочек! В каждой замене есть слово KIND ![]()
ищем
$sort_by = intval($_POST['sort_by']);вставляем после него
$kind = intval($_POST['kind']);ищем
$db->query('UPDATE '.$db->prefix.'forums SET forum_name=\''.$db->escape($forum_name).'\', forum_desc='.$forum_desc.', redirect_url='.$redirect_url.', sort_by='.$sort_by.', cat_id='.$cat_id.' WHERE id='.$forum_id) or error('Unable to update forum', __FILE__, __LINE__, $db->error());заменяем на
$db->query('UPDATE '.$db->prefix.'forums SET forum_name=\''.$db->escape($forum_name).'\', forum_desc='.$forum_desc.', redirect_url='.$redirect_url.', sort_by='.$sort_by.', kind='.$kind.', cat_id='.$cat_id.' WHERE id='.$forum_id) or error('Unable to update forum', __FILE__, __LINE__, $db->error());ищем
$result = $db->query('SELECT id, forum_name, forum_desc, redirect_url, num_topics, sort_by, cat_id FROM '.$db->prefix.'forums WHERE id='.$forum_id) or error('Unable to fetch forum info', __FILE__, __LINE__, $db->error());заменяем на
$result = $db->query('SELECT id, forum_name, forum_desc, redirect_url, num_topics, sort_by, cat_id, kind FROM '.$db->prefix.'forums WHERE id='.$forum_id) or error('Unable to fetch forum info', __FILE__, __LINE__, $db->error());ищем
<tr>
<th scope="row">Sort topics by</th>вставляем ПЕРЕД ним
<tr>
<th scope="row">Kind</th>
<td>
<select name="kind" tabindex="4">
<?php
foreach($valid_kinds as $kind) {
$selected = ($kind == $cur_forum['kind']) ? ' selected="selected"' : '';
echo "\t\t\t\t\t\t\t\t\t\t\t".'<option value="'.$kind.'"'.$selected.'>'.pun_htmlspecialchars($lang_common['Forum kind '.$kind]).'</option>'."\n";
}
?>
</select>
</td>
</tr>вот где нам пригодился массив [mono]$valid_kinds[/mono] из common.php!
4. Все готово, кроме готовых ссылок на суперкатегории. Открываем functions.php, ищем функцию generate_navlinks()
где-то в первых строчках добавляете свои:
$links[] = '<li id="navarticle"><a href="forum.php?kind='.PUN_KIND_ARTICLE.'">'.$lang_common['Articles'].'</a>';
$links[] = '<li id="navgallery"><a href="forum.php?kind='.PUN_KIND_GALLERY.'">'.$lang_common['Galleries'].'</a>';оппа! у нас не описаны локализационные строчки [mono]$lang_common['Articles'][/mono] и [mono]$lang_common['Galleries'][/mono]
срочно исправляем:
5. В каждом языковом файле common.php добавляем описания. я приведу только для русского. Открываем файл lang/Russian/common.php
в любом понравившемся месте вставляем такие строки:
'Forums' => 'Форумы',
'Articles' => 'Статьи',
'Galleries' => 'Галереи',
'News' => 'Новости'конец! как я настраиваю свои "Статьи" и "Галереи" я расскажу в другой раз


