News:

SMF 2.1.4 has been released! Take it for a spin! Read more.

Main Menu

Displaying only one Category

Started by RicochetPeter, January 14, 2005, 06:26:12 AM

Previous topic - Next topic

RicochetPeter

Please Note this has been converted into a similar mod:
Mod: View Single Category

Original Post as follows


Hi all,

first of all I'd like to thank the developers for their fantastic work, this is really a superb forum software :)

My question: is there a way to display only one category of a forum, and I don't mean the others collapsed or sp, but really only that category and its subforums?


How to do it:
Check reply#8 or a better one in reply#14

A.M.A

Through permission you can disable viewing some boards for guests or member groups .. if that what you meant!
Really sorry .. real life is demanding my full attention .. will be back soon hopefully :)

RicochetPeter

Hmmm, no, that's not what I meant. Sorry if I have to draw the comparison: IPB looks like this when clicking on a category:
http://www.hydrogenaudio.org/forums/index.php?showforum=64
All you see is that very section of the forum and the forums in there, nothing else... See what I mean?

RicochetPeter

To make it a bit clearer using this very forum (  :) ):

I'd like f.e. to be able to view the Section 'SMF Development' on its own, without seeing the other sections.
The link http://www.simplemachines.org/community/index.php#11 gives me that section on top, but I still see all the others...

RicochetPeter

Oh dear, did I step on someone's foot or is it just not possible?

[Unknown]

Why would you want to remove view of the other boards?  To save like a kilobyte of bandwidth?

-[Unknown]

RicochetPeter

Em, no, but to have the possibility to give away an URL that will show only that very section; to get the impression there were no other sections.

Trekkie101

But then clicking home would display it?

You could make the other boards private to stop just anyone getting in and they wouldnt see it until they are premoted.

A.M.A

In BoardIndex.template.php look for:
foreach ($context['categories'] as $category)
{
echo '
<div class="tborder"><table border="0" width="100%" cellspacing="1" cellpadding="5">
replace with:
foreach ($context['categories'] as $category)
{

     // if category's link is clicked, display that category only!
if (isset($_REQUEST['catogid']))
{
        if ($_REQUEST['catogid'] == $category['id'])
           echo '<div class="tborder">';
        elseif ($_REQUEST['catogid'] != $category['id'])
           echo '<div style="display:none;">';
}
else
{
        echo '<div class="tborder">';
}

echo '
<table border="0" width="100%" cellspacing="1" cellpadding="5">


look for:
', $category['link'], 'replace with:
<a href="' . $scripturl . '?catogid=', $category['id'], '">', $category['name'], '</a>

This will enable you to display only one category by clicking on any category or typing its URL. This will only hide the unwanted categories. I made this quick, and did not test for errors proof!
Really sorry .. real life is demanding my full attention .. will be back soon hopefully :)

RicochetPeter

A.M.A, you rock soooo bad! Thanx very much for that hack. Looks absolutely...great. thanx.

PS: this could even go into the main dev tree, methinks.

Oldiesmann

Nice. Never thought about doing it that way :)
Michael Eshom
Christian Metal Fans

RicochetPeter

I looked at 'function theme_linktree()' in index.template.php and I don't see an easy way to do what you did in BoardIndex.template.php.
The line in question is prolly 409:
echo '<b>', $settings['linktree_link'] && isset($tree['url']) ? '<a href="' . $tree['url'] . '" class="nav">' .
   $tree['name'] . '</a>' : $tree['name'], '</b>';

after the question mark

The URL that's being linked comes from a variable, $tree['url'], which again comes from $context['linktree']. The <a href="' . $tree['url'] . '" would need to be replaced by the catogid link you used before, but it must come from $context['category']. I don't know how to do that...

A.M.A

Please make a backup first.

in /Soucres/Load.php look for:
'url' => $scripturl . '#' . $board_info['cat']['id'],
replace with:
'url' => $scripturl . '?catogid=' . $board_info['cat']['id'],
Really sorry .. real life is demanding my full attention .. will be back soon hopefully :)

RicochetPeter


mytreo

Great thread, I needed to do the same and after reading this and messing aorund I have found a way to improve it so I'll share it here with you :)

This new method doesn't just hide the layer it actually changes the database query to only select the category that you want.

Pros:

1) the db query size is only as big as it needs to be, above you are still building ALL the categories into the array, then just hideing them from view
2) works in all browsers
3) the hidden categories disappear completely and no white space remains
4) you don't need to edit the template file

Cons:

1) Not really a con, but you need to edit the boardindex.php file NOT the template file.

How to do it:

Open BoardIndex.php and find the query at the top:

// Find all boards and categories, as well as related information.
$result_boards = db_query("
SELECT
c.name AS catName, c.ID_CAT, b.ID_BOARD, b.name AS boardName, b.description,
b.numPosts, b.numTopics, b.ID_PARENT,
IFNULL(mem.memberName, m.posterName) AS posterName, m.posterTime, m.subject, m.ID_TOPIC,
IFNULL(mem.realName, m.posterName) AS realName," . (!$user_info['is_guest'] ? "
(IFNULL(lb.logTime, 0) >= b.lastUpdated) AS isRead, c.canCollapse,
IFNULL(cc.ID_MEMBER, 0) AS isCollapsed" : ' 1 AS isRead') . ",
IFNULL(mem.ID_MEMBER, 0) AS ID_MEMBER, m.ID_MSG,
IFNULL(mem2.ID_MEMBER, 0) AS ID_MODERATOR, mem2.realName AS modRealName
FROM {$db_prefix}categories AS c, {$db_prefix}boards AS b
LEFT JOIN {$db_prefix}messages AS m ON (m.ID_MSG = b.ID_LAST_MSG)
LEFT JOIN {$db_prefix}members AS mem ON (mem.ID_MEMBER = m.ID_MEMBER)" . (!$user_info['is_guest'] ? "
LEFT JOIN {$db_prefix}log_boards AS lb ON (lb.ID_BOARD = b.ID_BOARD AND lb.ID_MEMBER = $ID_MEMBER)
LEFT JOIN {$db_prefix}collapsed_categories AS cc ON (cc.ID_CAT = c.ID_CAT AND cc.ID_MEMBER = $ID_MEMBER)" : '') . "
LEFT JOIN {$db_prefix}moderators AS mods ON (mods.ID_BOARD = b.ID_BOARD)
LEFT JOIN {$db_prefix}members AS mem2 ON (mem2.ID_MEMBER = mods.ID_MEMBER)
WHERE $user_info[query_see_board]
AND b.ID_CAT = c.ID_CAT
AND b.childLevel <= 1
ORDER BY c.catOrder, b.childLevel, b.boardOrder", __FILE__, __LINE__);


replace with our new query:

// Find all boards and categories, as well as related information.
$result_boards = db_query("
SELECT
c.name AS catName, c.ID_CAT, b.ID_BOARD, b.name AS boardName, b.description,
b.numPosts, b.numTopics, b.ID_PARENT,
IFNULL(mem.memberName, m.posterName) AS posterName, m.posterTime, m.subject, m.ID_TOPIC,
IFNULL(mem.realName, m.posterName) AS realName," . (!$user_info['is_guest'] ? "
(IFNULL(lb.logTime, 0) >= b.lastUpdated) AS isRead, c.canCollapse,
IFNULL(cc.ID_MEMBER, 0) AS isCollapsed" : ' 1 AS isRead') . ",
IFNULL(mem.ID_MEMBER, 0) AS ID_MEMBER, m.ID_MSG,
IFNULL(mem2.ID_MEMBER, 0) AS ID_MODERATOR, mem2.realName AS modRealName
FROM {$db_prefix}categories AS c, {$db_prefix}boards AS b
LEFT JOIN {$db_prefix}messages AS m ON (m.ID_MSG = b.ID_LAST_MSG)
LEFT JOIN {$db_prefix}members AS mem ON (mem.ID_MEMBER = m.ID_MEMBER)" . (!$user_info['is_guest'] ? "
LEFT JOIN {$db_prefix}log_boards AS lb ON (lb.ID_BOARD = b.ID_BOARD AND lb.ID_MEMBER = $ID_MEMBER)
LEFT JOIN {$db_prefix}collapsed_categories AS cc ON (cc.ID_CAT = c.ID_CAT AND cc.ID_MEMBER = $ID_MEMBER)" : '') . "
LEFT JOIN {$db_prefix}moderators AS mods ON (mods.ID_BOARD = b.ID_BOARD)
LEFT JOIN {$db_prefix}members AS mem2 ON (mem2.ID_MEMBER = mods.ID_MEMBER)
WHERE $user_info[query_see_board]
" . (isset($_REQUEST['catogid']) ? "
AND c.ID_CAT = {$_REQUEST['catogid']}" : '') . "
AND b.ID_CAT = c.ID_CAT
AND b.childLevel <= 1
ORDER BY c.catOrder, b.childLevel, b.boardOrder", __FILE__, __LINE__);


That's all!!  Just point at index.php?catogid=X where X is the category you wish to view :D

Example here: Just see the Star Developer Category at mytreo.net (catogid=4)

You can add links to the pages in the same way as you did above by editing the template file, or also by using that clever trick above in Load.php to change the linktree.

Hope someone else finds this useful. :)

Chris
Treo forum - Powered by SMF, of course
Treo news - powered by MovableType and integrated with SMF
Treo downloads - hacked from phpNuke and integrated with SMF
Treo knowledge base - powered by Wikka and integrated with SMF
Treo 650 | Treo 700w | Treo 700p

A.M.A

Yup yours is much better .. I guess you could use the tree link modification without any problem. Right?
Really sorry .. real life is demanding my full attention .. will be back soon hopefully :)

mytreo

Quote from: A.M.A on January 20, 2005, 04:56:05 PM
Yup yours is much better

Wholly inspired by you though, I wouldn't have known where to start otherwise but as I began messing with your code it all came together. I love SMF :D :D

QuoteI guess you could use the tree link modification without any problem. Right?

Yes right, it works just the same.

Chris
Treo forum - Powered by SMF, of course
Treo news - powered by MovableType and integrated with SMF
Treo downloads - hacked from phpNuke and integrated with SMF
Treo knowledge base - powered by Wikka and integrated with SMF
Treo 650 | Treo 700w | Treo 700p

aaronsnet

Anyone have a hack for the classic "BoardIndex.template.php" instead of the default?

thanks!

A.M.A

please check mytreo's method It does not need any template modifications so it will work with any theme.
Really sorry .. real life is demanding my full attention .. will be back soon hopefully :)

Gobo

Quote from: mytreo on January 20, 2005, 01:38:59 PM
Great thread, I needed to do the same and after reading this and messing aorund I have found a way to improve it so I'll share it here with you :)

This new method doesn't just hide the layer it actually changes the database query to only select the category that you want.

Pros:

1) the db query size is only as big as it needs to be, above you are still building ALL the categories into the array, then just hideing them from view
2) works in all browsers
3) the hidden categories disappear completely and no white space remains
4) you don't need to edit the template file

Cons:

1) Not really a con, but you need to edit the boardindex.php file NOT the template file.

How to do it:

Open BoardIndex.php and find the query at the top:

// Find all boards and categories, as well as related information.
$result_boards = db_query("
SELECT
c.name AS catName, c.ID_CAT, b.ID_BOARD, b.name AS boardName, b.description,
b.numPosts, b.numTopics, b.ID_PARENT,
IFNULL(mem.memberName, m.posterName) AS posterName, m.posterTime, m.subject, m.ID_TOPIC,
IFNULL(mem.realName, m.posterName) AS realName," . (!$user_info['is_guest'] ? "
(IFNULL(lb.logTime, 0) >= b.lastUpdated) AS isRead, c.canCollapse,
IFNULL(cc.ID_MEMBER, 0) AS isCollapsed" : ' 1 AS isRead') . ",
IFNULL(mem.ID_MEMBER, 0) AS ID_MEMBER, m.ID_MSG,
IFNULL(mem2.ID_MEMBER, 0) AS ID_MODERATOR, mem2.realName AS modRealName
FROM {$db_prefix}categories AS c, {$db_prefix}boards AS b
LEFT JOIN {$db_prefix}messages AS m ON (m.ID_MSG = b.ID_LAST_MSG)
LEFT JOIN {$db_prefix}members AS mem ON (mem.ID_MEMBER = m.ID_MEMBER)" . (!$user_info['is_guest'] ? "
LEFT JOIN {$db_prefix}log_boards AS lb ON (lb.ID_BOARD = b.ID_BOARD AND lb.ID_MEMBER = $ID_MEMBER)
LEFT JOIN {$db_prefix}collapsed_categories AS cc ON (cc.ID_CAT = c.ID_CAT AND cc.ID_MEMBER = $ID_MEMBER)" : '') . "
LEFT JOIN {$db_prefix}moderators AS mods ON (mods.ID_BOARD = b.ID_BOARD)
LEFT JOIN {$db_prefix}members AS mem2 ON (mem2.ID_MEMBER = mods.ID_MEMBER)
WHERE $user_info[query_see_board]
AND b.ID_CAT = c.ID_CAT
AND b.childLevel <= 1
ORDER BY c.catOrder, b.childLevel, b.boardOrder", __FILE__, __LINE__);


replace with our new query:

// Find all boards and categories, as well as related information.
$result_boards = db_query("
SELECT
c.name AS catName, c.ID_CAT, b.ID_BOARD, b.name AS boardName, b.description,
b.numPosts, b.numTopics, b.ID_PARENT,
IFNULL(mem.memberName, m.posterName) AS posterName, m.posterTime, m.subject, m.ID_TOPIC,
IFNULL(mem.realName, m.posterName) AS realName," . (!$user_info['is_guest'] ? "
(IFNULL(lb.logTime, 0) >= b.lastUpdated) AS isRead, c.canCollapse,
IFNULL(cc.ID_MEMBER, 0) AS isCollapsed" : ' 1 AS isRead') . ",
IFNULL(mem.ID_MEMBER, 0) AS ID_MEMBER, m.ID_MSG,
IFNULL(mem2.ID_MEMBER, 0) AS ID_MODERATOR, mem2.realName AS modRealName
FROM {$db_prefix}categories AS c, {$db_prefix}boards AS b
LEFT JOIN {$db_prefix}messages AS m ON (m.ID_MSG = b.ID_LAST_MSG)
LEFT JOIN {$db_prefix}members AS mem ON (mem.ID_MEMBER = m.ID_MEMBER)" . (!$user_info['is_guest'] ? "
LEFT JOIN {$db_prefix}log_boards AS lb ON (lb.ID_BOARD = b.ID_BOARD AND lb.ID_MEMBER = $ID_MEMBER)
LEFT JOIN {$db_prefix}collapsed_categories AS cc ON (cc.ID_CAT = c.ID_CAT AND cc.ID_MEMBER = $ID_MEMBER)" : '') . "
LEFT JOIN {$db_prefix}moderators AS mods ON (mods.ID_BOARD = b.ID_BOARD)
LEFT JOIN {$db_prefix}members AS mem2 ON (mem2.ID_MEMBER = mods.ID_MEMBER)
WHERE $user_info[query_see_board]
" . (isset($_REQUEST['catogid']) ? "
AND c.ID_CAT = {$_REQUEST['catogid']}" : '') . "
AND b.ID_CAT = c.ID_CAT
AND b.childLevel <= 1
ORDER BY c.catOrder, b.childLevel, b.boardOrder", __FILE__, __LINE__);


That's all!!  Just point at index.php?catogid=X where X is the category you wish to view :D

Example here: Just see the Star Developer Category at mytreo.net (catogid=4)

You can add links to the pages in the same way as you did above by editing the template file, or also by using that clever trick above in Load.php to change the linktree.

Hope someone else finds this useful. :)

Chris

hi

im getting this error

Unknown column 'lb.logTime' in 'field list'
File: /home/.cash/akulion/path-to-peace.net/forum/Sources/BoardIndex.php
Line: 85

im using smf 1.1rc2 with TP

Advertisement: