PDA

View Full Version : How To Create Collapsable Boxes


peterska2
29 Jun 2006, 22:37
This tutorial explains how to create collapsable boxes throughout vBulletin.

For the purpose of this tutorial, I will explain how the first part of the 'What's Going On' box is structured (ie WOL on forumhome) and how you can use this technique to create stand alone collapsable boxes or add sections to additional boxes (eg Forum Statistics as part of the What's Going On box)

Part One: Decipering the What's Going On box

In your forumhome template, the following code exists by default:<!-- what's going on box -->
<table class="tborder" cellpadding="$stylevar[cellpadding]" cellspacing="$stylevar[cellspacing]" border="0" width="100%" align="center">
<thead>
<tr>
<td class="tcat" colspan="2">$vbphrase[whats_going_on]</td>
</tr>
</thead>
<if condition="$show['loggedinusers']">
<!-- logged-in users -->
<tbody>
<tr>
<td class="thead" colspan="2">
<a style="float:$stylevar[right]" href="#top" onclick="return toggle_collapse('forumhome_activeusers')"><img id="collapseimg_forumhome_activeusers" src="$stylevar[imgdir_button]/collapse_thead$vbcollapse[collapseimg_forumhome_activeusers].gif" alt="" border="0" /></a>
<a href="online.php$session[sessionurl_q]" rel="nofollow">$vbphrase[currently_active_users]</a>: $totalonline (<phrase 1="$numberregistered" 2="$numberguest">$vbphrase[x_members_and_y_guests]</phrase>)
</td>
</tr>
</tbody>
<tbody id="collapseobj_forumhome_activeusers" style="$vbcollapse[collapseobj_forumhome_activeusers]">
<tr>
<td class="alt2"><a href="online.php$session[sessionurl_q]" rel="nofollow"><img src="$stylevar[imgdir_misc]/whos_online.gif" alt="$vbphrase[view_whos_online]" border="0" /></a></td>
<td class="alt1" width="100%">
<div class="smallfont">
<div style="white-space: nowrap"><phrase 1="$recordusers" 2="$recorddate" 3="$recordtime">$vbphrase[most_users_ever_online_was_x_y_at_z]</phrase></div>
<div>$activeusers</div>
</div>
</td>
</tr>
</tbody>
<!-- end logged-in users -->
</if>
This is the section of the code that we are going to look at.

Firstly, you will notice that the code starts with a table row, the same as any other table anywhere in vBulletin. This is essential. However, before the <tr>there is an additional tag<thead>This tag is used to create a header row for any tables that contain collapsable boxes. Generally speaking, this is only used if the table is going to contain more than one collapsable item.

All the code until</thead>is the same as any other table row, so you whould already be familiar with that.

Next we have the condition for the content section to show. For the purposes of this tutorial, the conditional is being disregarded.

This is then followed by the following code:<tbody>
<tr>
<td class="thead" colspan="2">
<a style="float:$stylevar[right]" href="#top" onclick="return toggle_collapse('forumhome_activeusers')"><img id="collapseimg_forumhome_activeusers" src="$stylevar[imgdir_button]/collapse_thead$vbcollapse[collapseimg_forumhome_activeusers].gif" alt="" border="0" /></a>
<a href="online.php$session[sessionurl_q]" rel="nofollow">$vbphrase[currently_active_users]</a>: $totalonline (<phrase 1="$numberregistered" 2="$numberguest">$vbphrase[x_members_and_y_guests]</phrase>)
</td>
</tr>
</tbody>There are a few important aspects in this section, so we shall look at each one in turn.

First there is the<tbody>This tells us that this is a new section in the table body. The codes<tr>and<td>you should already be familiar with. Normal classes and colspans can be used within these tags as usual.

The next section is essential<a style="float:$stylevar[right]" href="#top" onclick="return toggle_collapse('forumhome_activeusers')"><img id="collapseimg_forumhome_activeusers" src="$stylevar[imgdir_button]/collapse_thead$vbcollapse[collapseimg_forumhome_activeusers].gif" alt="" border="0" /></a>This creates the collapse image at the far right of the row, and controls the collasping of the section. By default this section is open, and the button will collapse it. We will look at the code to do the reverse later in this tutorial.

Probably the most important section of this code, and the bit that is the cause for most problems are the labelsforumhome_activeusersandcollapseimg_forumhome_activeusersThese appear three times in this one section of code, the first one being used once, and the second being used twice. These are also used later, so it is essential that care to detail is taken here. You will notice that the difference between the two codes is the prefix ofcollapseimg_on the second one. The rest of the code is the same.

When you are creating a new collapsable box, you need to give it a name. The length of the name is not important, as long as you ensure that every time it is used, it is identical. In the example used for this tutorial (the WOL on forumhome) the name used isforumhome_activeuserswhich is pretty self explanatory. I recommend using similar explanatory names for your collaspable boxes. It is essential that this is entered exactly the same for each occurance in the code, otherwise your box will not function correctly.

Some examples of names for collapsable boxes are:

thishack
this_hack
page_hack
author_hack
author_page_hack
random_numberAll the the above are perfectly acceptable for use as names for the boxes. You will have your own preference as to what you want to call them. Personally I prefer the format author_hack as it makes it easiest to see exactly what they are for.

The next section is <a href="online.php$session[sessionurl_q]" rel="nofollow">$vbphrase[currently_active_users]</a>: $totalonline (<phrase 1="$numberregistered" 2="$numberguest">$vbphrase[x_members_and_y_guests]</phrase>)
</td>
</tr>
</tbody>which is pretty self explanatory. Basically, it contains the text to be displayed in the row including any links, if appropriate. It is then followed by closing tags for everything except the table. It is important that we do not close the table before we have added the next row, which is the collapsable content.

The next line is<tbody id="collapseobj_forumhome_activeusers" style="$vbcollapse[collapseobj_forumhome_activeusers]">You will notice that again there are two instances ofcollapseobj_forumhome_activeusersIt is essential that these have the same name as the ones changed previously.

This line controls the collapsing of the box by identifying it, and setting the style of the box to match that of the image used earlier. (ie when collapsed the image shows a + and when expanded the image shows a - )

To have the box collapsed by default, you should use<tbody id="collapseobj_forumhome_activeusers" style="$vbcollapse[collapseobj_forumhome_activeusers]; display:none">However, any users that do not have javascript enabled will not be able to open these boxes.

Finally, we have the content for the collapsable row, followed by the closure tag</tbody>To end the table you would also add</table>after this.


Part Two: Creating Standalone Collapsable Boxes

Creating a standalone collapsable box (eg the one used for topXstats) is very straightforward. Literally, it involves following all the steps layed out in part one, using the same code and making adjustments as highlighted for the box name and setting the title and content to your requirements.

Using the <thead>section is optional. However, I would only use it if you are creating two or more associated collaspable sections within a table as the category sections (the part containing the collapse image) does not be hidden at any point.


Part Three: Adding To Existing Tables

You can add a collapsable section to any existing table. You simply use the steps laid out in part one, but omit the table and thead sections. You can place your collapsable section anywhere in a table, providing it is located in the center of the following code</tr>
<tr>This is to ensure that it is located correctly in a row in the table. Simply start with your first<tbody>and take it from there.

You can also add collapsable sections right at the beginning of a table by adding the code immediately after the table tag, or at the end of the table by adding the code directly above the end table tag.

An example of a modification that uses this technique is the Who Has Visited Today modification.


Part Four: Multiple Items Collapsing With One Control

Using the Whats Going On box as a primary example, what if you didn't want everything to be seperate, but rather all collapse apart from the statistics if you click a collapse icon?

This is very easy to do, and you simply use the same name for each section that you wish to have collapsed by the one icon. In this case, that would be the WOL section, upcoming events and birthdays. Statistics would retain it's own name otherwise that two would collapse with the rest.



I hope that you find this useful, and if you have any questions, please feel free to ask.

Justine
01 Jul 2006, 15:55
wow .. I just noticed that you have numerous articles for us newbies.


thank you :up:

Kirk Y
02 Jul 2006, 05:48
Is it possible to display text in place of the image for the collapse button?

peterska2
02 Jul 2006, 23:35
I don't see why not, but I haven't experimented with it so I'm not sure how easy it will be to implement.

Kirk Y
03 Jul 2006, 00:10
Well getting the text to show in place of the image is easy, it's getting it to change with the status of the container.

Antivirus
03 Jul 2006, 17:12
Nice job peterska2! I just love collapsible tables, i try to use em anywhere i can to make the best use of space, etc... I recently posted a how-to for developers on including them in the admincp for new hacks, etc... It can be seen at http://www.vbulletin.org/forum/showthread.php?t=118696 if anyone's interested.

SiriusBlack22
22 Jul 2006, 13:40
What code would I insert into the what's going on table to make it collapsible? I got rather lost there.

peterska2
22 Jul 2006, 16:11
part three tells you how to add to existing tables, such as the whats going on box, and part one explains how to set one up.

SiriusBlack22
22 Jul 2006, 18:03
Done.

Thanks.

Actually I did it and got a bunch of weird errors! And it was collapsing different boxes, it was a mess.

I still don't fully understand where to put it...

peterska2
22 Jul 2006, 23:11
Start a new thread with what you want to add and where you want it and also what you had done and I'll give it a look over later.

Buraq
13 Aug 2006, 06:35
I hate to dig this up, but how do you make the box collapsed by default? I read something in another thread, it does the job, but then it still shows the "collapse" button by default instead of the "expand" button.

Kirk Y
13 Aug 2006, 06:41
As Kerry-Anne posted above:
<tbody id="collapseobj_forumhome_activeusers" style="$vbcollapse[collapseobj_forumhome_activeusers]; display:none">

It's not a good idea to use this though, as users with Javascript disabled won't be able to expand the container.

Buraq
14 Aug 2006, 03:12
As Kerry-Anne posted above:
<tbody id="collapseobj_forumhome_activeusers" style="$vbcollapse[collapseobj_forumhome_activeusers]; display:none">

It's not a good idea to use this though, as users with Javascript disabled won't be able to expand the container.

That's exactly what I did, but like I said above, it shows the wrong button for collapsing. Is there any other way to do this?

Now I know nothing about javascript, but since this seems to be a JS function, is it possible to do something like toggle_collapse in <body onload>? So it collapses the box when the page loads, and then you'd have to click the button to collapse?

peterska2
14 Aug 2006, 10:45
I'm hoping that you did read the enitre tutorial, and not literally use that code that Kirk quoted, as that won't work correctly as it is the control for another box.

Can you provide a copy of the code you are using for the box, along with details of where it is and a link to view it on your site, and I'll give it a look over for you.

Buraq
14 Aug 2006, 18:00
I'm hoping that you did read the enitre tutorial, and not literally use that code that Kirk quoted, as that won't work correctly as it is the control for another box.

Can you provide a copy of the code you are using for the box, along with details of where it is and a link to view it on your site, and I'll give it a look over for you.

I read the tutorial when I originally made collapsable boxes on my site (and they work fine), but when I came back for making them collapsed by default I just added the "display:none" (I payed attention to your tutorial :)).

Currently you have to be an administrator to view the style I'm working on, and we're also in the process of upgrading to 3.6.0, so I'll get back to you guys later with screenshots. For now here's the code for the box...


<table class="tuser_info" cellpadding="0" cellspacing="0" border="0" width="100%" align="center">
<tbody>
<tr>
<td class="vbmenu_control" colspan="2">
<a style="float:$stylevar[right]" href="#top" onclick="return toggle_collapse('postbit_userinfo$post[postcount]')"><img id="collapseimg_postbit_userinfo$post[postcount]" src="$stylevar[imgdir_button]/collapse_thead$vbcollapse[collapseimg_postbit_userinfo].gif" alt="" border="0" /></a>
User Info
</td>
</tr>
</tbody>
<tbody id="collapseobj_postbit_userinfo$post[postcount]" style="$vbcollapse[collapseobj_postbit_userinfo]; display:none">
<tr>
<td>
<div class="smallfont">
<if condition="$post['joindate']"><div id="profileField">$vbphrase[join_date]: $post[joindate]</div></if>
<if condition="$post['field2']"><div id="profileField">$vbphrase[location_perm]: $post[field2]</div></if>
<if condition="$post['age']"><div id="profileField">$vbphrase[age]: $post[age]</div></if>
<div id="profileField">
$vbphrase[posts]: $post[posts]
</div>
<if condition="$show['reputation']"><div><if condition="$show['reppower']">$vbphrase[reppower]: $post[reppower]</if>$post[reputationdisplay]</div></if>
<if condition="$post['icqicon'] OR $post['aimicon'] OR $post['msnicon'] OR $post['yahooicon'] OR $post['skypeicon']"><div id="profileField">IM: $post[icqicon] $post[aimicon] $post[msnicon] $post[yahooicon] $post[skypeicon]</div></if>
</div>
</td>
</tr>
</tbody>
</table>


Note that I have built the collapsable box around the user info in my postbit_legacy template, which I've also modified in other ways.

peterska2
14 Aug 2006, 20:56
ok, there is a simple reason for this. For your id you have id="collapseobj_postbit_userinfo$post[postcount]"and your image issrc="$stylevar[imgdir_button]/collapse_thead$vbcollapse[collapseimg_postbit_userinfo].gif"Those are different, but you cannot putsrc="$stylevar[imgdir_button]/collapse_thead$vbcollapse[collapseimg_postbit_userinfo$post[postcount]].gif"as this is invalid code.

There isn't anything that you can do about this I'm afraid, unless you want them all to open and close regardless of which post you click on.

Buraq
15 Aug 2006, 01:20
ok, there is a simple reason for this. For your id you have id="collapseobj_postbit_userinfo$post[postcount]"and your image issrc="$stylevar[imgdir_button]/collapse_thead$vbcollapse[collapseimg_postbit_userinfo].gif"Those are different, but you cannot putsrc="$stylevar[imgdir_button]/collapse_thead$vbcollapse[collapseimg_postbit_userinfo$post[postcount]].gif"as this is invalid code.

There isn't anything that you can do about this I'm afraid, unless you want them all to open and close regardless of which post you click on.

dang....that sucks :(

Is there ANY way around this? Is it possible to have any other variable in there? like...
src="$stylevar[imgdir_button]/collapse_thead$vbcollapse[collapseimg_postbit_userinfo$x].gif"
where I define $x outside?

peterska2
15 Aug 2006, 01:49
I wouldn't think so. You are probably best using a popup menu to achieve the results that you want for this.

booox
17 Sep 2006, 13:49
wow, thx for this tut mate :)

Kungfu
19 Sep 2006, 09:09
the only thing you can do is collapse on load. That is what i did at least.
<script type="text/javascript">toggle_collapse('yourcollapseidhere')</script>

Is it possible to display text in place of the image for the collapse button?

<a style="float:$stylevar[right]" href="#top" onclick="return toggle_collapse('forumhome_activeusers')"><div id="collapseimg_forumhome_activeusers" alt="" border="0" />Text goes here</div></a>

this should work, i tried it before using text and im pretty sure i did this.

Mutt
28 Feb 2007, 13:33
Part Four: Multiple Items Collapsing With One Control

Using the Whats Going On box as a primary example, what if you didn't want everything to be seperate, but rather all collapse apart from the statistics if you click a collapse icon?

This is very easy to do, and you simply use the same name for each section that you wish to have collapsed by the one icon. In this case, that would be the WOL section, upcoming events and birthdays. Statistics would retain it's own name otherwise that two would collapse with the rest.



I hope that you find this useful, and if you have any questions, please feel free to ask.

i know this is a little old but i figured i'd try anyway.

i have 3 divs that I want opened and closed w/ one click. even though all 3 have the same name, only the first div is opening.

here's my calendar event RSVP template

<if condition="!$eventempty">
<hr>
</if>

<if condition="$rsvp_yes || $rsvp_maybe || $rsvp_no"><a style="float:$stylevar[right]" href="#top" onclick="return toggle_collapse('group_rsvp')"><img id="collapseimg_group_rsvp" alt="Show/Hide Users" src="$stylevar[imgdir_button]/collapse_alt_collapsed.gif" alt="" border="0" /></a></if>
<if condition="$rsvp_yes">
<b>$vbphrase[calendar_rsvpd] $vbphrase[yes]: $rsvp_yes_count </b>
<if condition="$eventinfo[rsvp_max_guests]">
(<phrase 1="$rsvp_yes_members" 2="$rsvp_yes_guests">$vbphrase[x_members_and_y_guests]</phrase>)
</if>
<div id="collapseobj_group_rsvp" style="display: none;"><ul><if condition="$vboptions[rah_rsvp_showavatar]"><table>$rsvp_yes</table><else />$rsvp_yes</if></ul></div>
</if>
<if condition="$rsvp_maybe">
<b>$vbphrase[calendar_rsvpd] $vbphrase[maybe]: $rsvp_maybe_count</b>
<if condition="$eventinfo[rsvp_max_guests]">
(<phrase 1="$rsvp_maybe_members" 2="$rsvp_maybe_guests">$vbphrase[x_members_and_y_guests]</phrase>)
</if>
<div id="collapseobj_group_rsvp" style="display: none;"><ul><if condition="$vboptions[rah_rsvp_showavatar]"><table>$rsvp_maybe</table><else />$rsvp_maybe</if></ul></div>
</if>
<if condition="$rsvp_no">
<b>$vbphrase[calendar_rsvpd] $vbphrase[no]: $rsvp_no_count</b>
<div id="collapseobj_group_rsvp" style="display: none;"><ul><if condition="$vboptions[rah_rsvp_showavatar]"><table>$rsvp_no</table><else />$rsvp_no</if></ul></div>
</if>

it's not an option to use 1 div. I want to list the RSVP counts but hide the users & comments.

if anyone knows what i'm doing wrong, I'd love the help. thanks

Mutt
05 Mar 2007, 14:07
I really need help on this. anyone?

I have the divs setup individually with no problem. my issue is trying to have multiple divs oven with one click. i gave all the divs the same id but only the first one opens & closes

the code is quoted above

ravyn
15 Aug 2007, 22:24
I've created a left-column menu thingy (I know.... such technical terms... lol) with collapsable boxes, but they don't quite act like the collapsable boxes on the rest of the site. I mean, I got them to work, and I even used the display: none thing to make them collapsed upon page loads, but the rest of the boxes (What's going on box and forum category boxes) will remember when they have been collapsed. Sometimes I will collapse boxes and as I return to the forum home page, they will remain collapsed, but the side menu boxes don't remember. They will either be open or closed depending on whether I have added the display:none thing in the style variable, but not dependant on whether I have opened or closed them before. Is there a reason for this?

ewelin
18 Dec 2008, 04:19
dang....that sucks :(

Is there ANY way around this? Is it possible to have any other variable in there? like...
src="$stylevar[imgdir_button]/collapse_thead$vbcollapse[collapseimg_postbit_userinfo$x].gif"where I define $x outside?
Buraq, there is a way around this, if you're still looking for a solution. Or if anyone happens to be looking for the same solution. Only drawback is you have to be willing to edit some php code as well. Take a look at the template forumhome_forumbit_level1_nopost
<tbody>
<tr>
<td class="tcat" colspan="<if condition="$vboptions[showmoderatorcolumn]">6<else />5</if>">
<if condition="$childforumbits">
<a style="float:$stylevar[right]" href="#top" onclick="return toggle_collapse('forumbit_$forumid')"><img id="collapseimg_forumbit_$forumid" src="$stylevar[imgdir_button]/collapse_tcat{$collapseimg_forumid}.gif" alt="" border="0" /></a>
</if>
<a href="forumdisplay.php?$session[sessionurl]f=$forum[forumid]">$forum[title]</a>
<if condition="$show['forumdescription']"><div class="smallfont">$forum[description]</div></if>
<if condition="$show['subforums']"><div class="smallfont"><strong>$vbphrase[subforums]</strong>: $forum[subforums]</div></if>
</td>
</tr>
</tbody>
<if condition="$childforumbits">
<tbody id="collapseobj_forumbit_$forumid" style="{$collapseobj_forumid}">
$childforumbits
</tbody>
</if>I've highlighted the variables they use. In the php file, in this case, includes\functions_forumlist.php they generate that variables with the code starting on line 377 if ($depth == 1 AND $tempext == '_nopost')
{
global $vbcollapse;
$collapseobj_forumid =& $vbcollapse["collapseobj_forumbit_$forumid"];
$collapseimg_forumid =& $vbcollapse["collapseimg_forumbit_$forumid"];
$show['collapsebutton'] = true;
}
Now I have a custom php file for my site and was able to mimick this into that file as well as it's bit template. Hope someone else finds this useful.

Vangerltd
30 Apr 2009, 04:25
bump for ravyn's (#23) question

AlphaNation
26 May 2009, 23:29
Sometimes I will collapse boxes and as I return to the forum home page, they will remain collapsed, but the side menu boxes don't remember. They will either be open or closed depending on whether I have added the display:none thing in the style variable, but not dependant on whether I have opened or closed them before. Is there a reason for this?
There's 2 tricks to remember the state of a collapsed element.
1 - Using unique variables and the tricks involved in naming them.
2 - Some places require you to reference the GLOBAL to get the collapsed state from the cookie.

To do something like collapse a post.
Button:

<a href="#top" style="float:$stylevar[right]"
onclick="return toggle_collapse('post_$post[postid]')">
<img id="collapseimg_post_$post[postid]"
src="$stylevar[imgdir_button]/collapse_thead{$GLOBALS['vbcollapse']['collapseimg_post_'.$post[postid]]}.gif"
alt="Collapse/Expand" border="0" /></a>


Table:

<table width="100%" align="right" border="0" cellpadding="0" cellspacing="0">
<tbody id="collapseobj_post_$post[postid]"
style="{$GLOBALS['vbcollapse']['collapseobj_post_'.$post['postid']]}">
Stuff to hide.
</tbody>
</table>


Without using $GLOBALS['vbcollapse'], it won't get the information from the cookie.

Vangerltd
10 Jul 2009, 03:02
AlphaNation, thanks!

Hell Bomb
09 Jan 2010, 07:34
lol thank you so much, i spent about 2 hours trying to figure out how to get collapsible boxes working right, and about 10 minutes after i am done i come here and see your tutorial anyways thanks, This will save people a lot of time.

final kaoss
04 Jan 2011, 13:07
Thanks, I spent some time too, trying to get the boxes working.

Kiran-E-Sehar
17 Aug 2012, 01:18
the default code is changed in 4.1.11
what to do?