PDA

View Full Version : category tree bit Help


Logikos
03-02-2006, 07:49 AM
I would like to create a simple category tree using the vbulletin templates. Seems though I can't add a bit template to a bit template which would both be part of the main template. I'll try to explaine better...

Database Setup for table Categories with the following fields:
id, title, description, and display order. I have 3 Categories inserted that I'm testing with.

Category 1
Category 2
Category 3

I have another table setup called items with the following fields:
id, catid, title, description, and display order. I have 6 items inserted that I'm testing with.

Item 1 (catid1)
Item 2 (catid1)
Item 3 (catid1)
Item 4 (catid2)
Item 5 (catid2)
Item 6 (catid3)

Now with this code it would work right obvisoulsy because I'm just echoing:

$var1data = $db->query_read("
SELECT *
FROM " . TABLE_PREFIX . "category
");

while ($var1 = $db->fetch_array($var1data))
{
echo "<b>" . $var1['title'] . "</b><br />";

$var2data = $db->query_read("
SELECT *
FROM " . TABLE_PREFIX . "items
WHERE catid = $var1[id]
");

while ($var2 = $db->fetch_array($var2data))
{
echo "----<i>" . $var2['title'] . "</i><br />";
}
}


What will display the following:

Category 1
------ Item 1
------ Item 2
------ Item 3
Category 2
------ Item 4
------ Item 5
Category 3
------ Item 6

Though adding this to the templates like that would mean using 3 templates. A main template that will hold the main code and the category bit variable, the category bit template, which would hold the item bit variable, and the item bit template that would hold the item info. Like so...


$var1data = $db->query_read("
SELECT *
FROM " . TABLE_PREFIX . "category
");

while ($var1 = $db->fetch_array($var1data))
{
eval('$Categories .= "' . fetch_template('categories') . '";');

$var2data = $db->query_read("
SELECT *
FROM " . TABLE_PREFIX . "items
WHERE catid = $var1[id]
");

while ($var2 = $db->fetch_array($var2data))
{
eval('$Items .= "' . fetch_template('items') . '";');
}
}

eval('print_output("' . fetch_template('maintemplate') . '");');


But that won't work because I'm adding a bit variable inside another templatebit. Anyone know what can be done to do something like this. The screenshot it what I'm trying to get out of this. Thanks!! :)


I think using the cache system would be a better approach

Marco van Herwaarden
03-02-2006, 08:16 AM
move
eval('$Categories .= "' . fetch_template('categories') . '";');
to the last line of the while-loop. You will need to evaluate the item-bits before you do the category.

Logikos
03-02-2006, 08:26 AM
I should have said that I did try that before and It keep showing up like:
Category 1
------ Item 1
------ Item 2
Category 2
------ Item 1
------ Item 2
------ Item 4
------ Item 5
Category 3
------ Item 4
------ Item 5
------ Item 6

I'm thinking it might be eaiser to add the items to the datastore and using a foreach() to get them.

Well using foreach()'s didn't help much. This is getting on my nerves and I can't figure out why the hell the items are showing in other categorys even when I add a where clause and a if statment. (WHERE catid = $var1[id]) and (if ($var2['catid'] == $var1['id'])). AHHHHH

/me screams!!!!!

Marco van Herwaarden
03-03-2006, 06:54 AM
Try:
while ($var1 = $db->fetch_array($var1data))
{
$Items = null;
$var2data = $db->query_read("
SELECT *
FROM " . TABLE_PREFIX . "items
WHERE catid = $var1[id]
");

while ($var2 = $db->fetch_array($var2data))
{
eval('$Items .= "' . fetch_template('items') . '";');
}
eval('$Categories .= "' . fetch_template('categories') . '";');
}

Logikos
03-03-2006, 07:17 PM
Thanks MarcoH. Trigunflame helped me the other night and that was exacly what i had to do. I added $Items=""; under the eval for $Categories. :)

Marco van Herwaarden
03-05-2006, 09:23 AM
Yup that will do the same (although as a purist i would say always initialize;) so before the calculation, not after).