PDA

View Full Version : Need help finishing menu hack


ChurchMedia
12-07-2007, 07:17 PM
I use a CSS menu system. I don't like having to manually modify the code when I add/delete/move forums. I've figured out that the code that generates the archive site map could be modified to work for me, but I'm not completely sure how to pull it off. Thanks for any help anyone could give.

The output code needs to be like this:


<li><a href="http://www.domain.com/forums/showforum.php?f=$forumid">PARENT Forum Name</a>

<ul> <li><a href="http://www.domain.com/forums/showforum.php?f=$forumid">SUB Forum Name</a></li>

</ul></li>


Here is the code that could be modified to make it work:

// ################################################## #######################################
// ###################### ARCHIVE FUNCTIONS ################################################

// function to list forums in their correct order and nesting
function print_archive_forum_list($parentid = -1, $indent = '')
{
global $vbulletin;

$output = '';

if (empty($vbulletin->iforumcache))
{
$forums = $vbulletin->db->query_read_slave("
SELECT forumid, title, link, parentid, displayorder, title_clean, description, description_clean,
(options & " . $vbulletin->bf_misc_forumoptions['cancontainthreads'] . ") AS cancontainthreads
FROM " . TABLE_PREFIX . "forum AS forum
WHERE displayorder <> 0 AND
password = '' AND
(options & " . $vbulletin->bf_misc_forumoptions['active'] . ")
ORDER BY displayorder
");
$vbulletin->iforumcache = array();
while ($forum = $vbulletin->db->fetch_array($forums))
{
$vbulletin->iforumcache["$forum[parentid]"]["$forum[displayorder]"]["$forum[forumid]"] = $forum;
}
unset($forum);
$vbulletin->db->free_result($forums);
}

if (is_array($vbulletin->iforumcache["$parentid"]))
{
$output = "\n$indent<ul>\n";

foreach($vbulletin->iforumcache["$parentid"] AS $x)
{
foreach($x AS $forumid => $forum)
{
($hook = vBulletinHook::fetch_hook('archive_forum')) ? eval($hook) : false;

if (!($vbulletin->userinfo['forumpermissions']["$forumid"] & $vbulletin->bf_ugp_forumpermissions['canview']) AND ($vbulletin->forumcache["$forumid"]['showprivate'] == 1 OR (!$vbulletin->forumcache["$forumid"]['showprivate'] AND !$vbulletin->options['showprivateforums'])))
{
continue;
}
else
{
if ($forum['link'] !== '')
{
$forum_link = "<a href=\"$forum[link]\">";
}
else if ($forum['cancontainthreads'])
{
$forum_link = "<a href=\"" . (!SLASH_METHOD ? 'index.php?' : '') . "f-$forumid.html\">";
}
else
{
$forum_link = "<a style=\"font-weight:bold\">";
}
$output .= "$indent\t<li>$forum_link$forum[title_clean]</a>" . print_archive_forum_list($forumid, "\t$indent") . "</li>\n";
}
}
}

$output .= "$indent</ul>\n$indent";
}

return $output;
}

TheMilkCarton
12-11-2007, 03:25 AM
Remove all the $output lines.

In place of the inner-most (the one indented the most) $output, you need an eval to call a template with the correct code. It will most likely contain similar code, unless you're not using an unordered list.

You should probably also remove the function line, and the last }... and include the PHP file you took that code from, since there are most likely a lot of variables it needs to be defined already.

In place of the return $output line, you'd need to use an eval to call another template that'd look something like so.

menu_forumlist
<ul>
$menu_forumlistbits
</ul>"$menu_forumlistbits" being the variable that the code EVALs in place of that inner-most $output.

A typical eval line looks like so:
eval('$menu_forumlistbits = "' . fetch_template('menu_forumlistbits') . '";'); "menu_forumlistbits" being the template containing each individual list code.

The second eval line (that replaces return $output) would look like so:
eval('$menu_forumlist = "' . fetch_template('menu_forumlist') . '";');And then you'd need to put $menu_forumlist into whatever template this menu is in.

Also.. you can probably get rid of all that $indent crap too. I think that's just to make the HTML look cleaner.

menu_forumlistbits could be as simple as this:
<li>$forum_link$forum['title_clean']</a></li>----

OH... haha. You'd also need to change all the $forum_link lines to reflect the correct code, since that code is for the archive and not the normal forums.

.... and btw, in your code example, I don't think "showforum.php" is exactly right... Does that even exist? =p

----

Sorry if that seems like alot... I think that explaining how to do it instead of just giving you code to try will help you become better at these kinds of things, right? :)

I apologize if I've missed anything... hopefully someone smarter can come in and correct anything I forgot.. I'm quite new with this stuff as well. :o

ChurchMedia
12-11-2007, 03:44 AM
That makes a lot of sense to me. I think I can pull it off. I'll play with it tomorrow and let you know. No, "showforum.php" doesn't exist... it's just something I must have imagined :p

Thanks a ton for the help! :)

TheMilkCarton
12-11-2007, 05:59 AM
That makes a lot of sense to me. I think I can pull it off. I'll play with it tomorrow and let you know. No, "showforum.php" doesn't exist... it's just something I must have imagined :p

Thanks a ton for the help! :)

I didn't notice that the eval lines I copied from the first code I could find used periods in front of the = sign. You're not concatenating more templates onto that variable, so you'd have to remove the period.

I edited my post to reflect that.