PDA

View Full Version : nested dependent vb:each - building headers for sorting


wpeloquin
04-09-2012, 03:25 PM
Hello,

I have tried numerous ways, but am beginning to think this not possible (or i'm just stuck looking at it from a single angle), so figured i'd try to get some outside opinions/help.

In my php file, i create an array that looks like the following:

while ($wp_alist = $vbulletin->db->fetch_array($wp_fulllist))
{
$wp_list[$count] = array(
'id' => htmlspecialchars($wp_alist['id']),
'name' => htmlspecialchars($wp_alist['name']),
'locid' => htmlspecialchars($wp_alist['locid']),
'location' => htmlspecialchars($wp_alist['location']),
'url' => htmlspecialchars($wp_alist['url'])
);
$count++;
}

$templater->register('wp_list', $wp_list);


In my template, i can successfully display the entire list using

<vb:each from="wp_list" value="list">
<tr>
<td>{vb:raw list.location}</td>
<td><a href="{vb:raw list.url}">{vb:raw list.name}</a></td>
</tr>
</vb:each>


However, what i would like to do is separate the items based on the location, something similar to the image that i attached. A rough code might be something like this, but i know that vb:raw cannot be used in a conditional, and i cannot figure out how to work around this.

<vb:each from="wp_list" value="location">
<h1>{vb:raw location.location}</h1>
<vb:each from="wp_list" value="list">
<vb:if condition="{vb:raw loc.location} = {vb:raw scroll.location}">
<tr>
<td>{vb:raw list.location}</td>
<td><a href="{vb:raw list.url}">{vb:raw list.name}</a></td>
</tr>
</vb:if>
</vb:each>
</vb:each>

kh99
04-09-2012, 04:24 PM
I think that appraoch will work but you might need to create your own array of locaitons and register it too. Maybe try something like this:

while ($wp_alist = $vbulletin->db->fetch_array($wp_fulllist))
{
$locations[] = htmlspecialchars($wp_alist['location']);
$wp_list[] = array(
'id' => htmlspecialchars($wp_alist['id']),
'name' => htmlspecialchars($wp_alist['name']),
'locid' => htmlspecialchars($wp_alist['locid']),
'location' => htmlspecialchars($wp_alist['location']),
'url' => htmlspecialchars($wp_alist['url'])
);
}
$locations = array_unique($locations);
$templater->register('wp_list', $wp_list);
$templater->register('wp_locations', $locations);



and then in your template:

<vb:each from="wp_locations" value="location">
<h1>{vb:raw location}</h1>
<vb:each from="wp_list" value="list">
<vb:if condition="$list['location'] == $location">
<tr>
<td>{vb:raw list.location}</td>
<td><a href="{vb:raw list.url}">{vb:raw list.name}</a></td>
</tr>
</vb:if>
</vb:each>
</vb:each>


I'm not sure of there's any way to use the value from the outer vb:each to specify the inner vb:each array. That would make things a little more efficient.

wpeloquin
04-10-2012, 07:32 PM
That didn't work (for me, anyways). I think it still sees the objects in the IF statement as <vb:raw> statements...

kh99
04-11-2012, 02:46 AM
I did have one error in the code above, which I just fixed. It said location.location when it should just be location. Also I left out the htmlspecialchars when setting the locations array. But I did test it and it basically seemed to work. What happens when you try?

wpeloquin
04-13-2012, 08:07 PM
I had to play with the <table> tag and it is working now (see below). Much thanks kh99! I was on the right track it seems, just off on the syntax. You saved me many hours of tedious hair pulling :)


<vb:each from="wp_locations" value="location">
<h1>{vb:raw location}</h1>
<table>
<vb:each from="wp_list" value="list">
<vb:if condition="$list['location'] == $location">
<tr>
<td>{vb:raw list.location}</td>
<td><a href="{vb:raw list.url}">{vb:raw list.name}</a></td>
</tr>
</vb:if>
</vb:each>
</table>
</vb:each>