PDA

View Full Version : Nested Loop with templates


Ghostsuit
21 Dec 2009, 11:14
Wonder if anyone can help. What I'm trying to do is show a gig listings but add multiple ticket buying options.

I'm stuck though at the nested part and getting it to display in the template. I'm pretty sure the bit that's wrong is the 1st and 3rd line as if I do it with just the second line I get one link displayed but with this code I get none.

I know it's something simple but I'm new to the way vB4 does stuff.

So any ideas?

$templater = vB_Template::create('event_giglistrowticket');
$templater->register('ticketlink', $linkrow[ticketlink]);
$event_giglistrowticket .= $templater->render();

Here's the full loop with nesting

$results = $vbulletin->db->query_read("SELECT date_format(gig.date, '%a %D %b %y') AS gig_date, gig.gigid, venue.venuename AS gig_venuename, gig.title, gig.status, gig.age
FROM gig
LEFT JOIN venue ON gig.venueid=venue.venueid
WHERE Status='confirmed' AND title != '' AND date >= ( CURDATE() ) ORDER BY date ASC");

// Loop through all results
while ($row = $vbulletin->db->fetch_array($results))
{
// Generate row html from template
$templater = vB_Template::create('event_giglistrow');
$templater->register('gigid', $row[gigid]);
$templater->register('title', $row[title]);
$templater->register('venuename', $row[gig_venuename]);
$templater->register('date', $row[gig_date]);
$templater->register('age', $row[age]);

$linkresults = $vbulletin->db->query_read("SELECT ticketlink
FROM ticketlink
LEFT JOIN gig ON ticketlink.gigid=gig.gigid
WHERE ticketlink.gigid=gig.gigid AND ticketlink.gigid = '$row[gigid]'");

while ($linkrow = $vbulletin->db->fetch_array($linkresults))
{
$templater = vB_Template::create('event_giglistrowticket');
$templater->register('ticketlink', $linkrow[ticketlink]);
$event_giglistrowticket .= $templater->render();
}
$event_giglistrow .= $templater->render();
}

Lynne
21 Dec 2009, 15:13
You just need to register the array:
$templater->register('linkrow', $linkrow);


And now in the template you may use {vb.raw linkrow.ticketlink}

Ghostsuit
21 Dec 2009, 15:52
Where do I need to put that register line?

Also do I need a separate bit template for the {vb.raw linkrow.ticketlink} or can I jsut include it in the main template?

Lynne
21 Dec 2009, 15:55
In place of this one:
$templater->register('ticketlink', $linkrow[ticketlink]);


Then just use the variable {vb.raw linkrow.ticketlink} in the template.

Ghostsuit
21 Dec 2009, 16:06
I must be doing something wrong that's giving blank results. :(.

Ghostsuit
21 Dec 2009, 16:42
Heres the full page code with the suggested change made.

<?php

// ####################### SET PHP ENVIRONMENT ###########################
error_reporting(E_ALL & ~E_NOTICE);

// #################### DEFINE IMPORTANT CONSTANTS #######################

define('THIS_SCRIPT', 'giglist');
define('CSRF_PROTECTION', true);
// change this depending on your filename

// ################### PRE-CACHE TEMPLATES AND DATA ######################
// get special phrase groups
$phrasegroups = array();

// get special data templates from the datastore
$specialtemplates = array();

// pre-cache templates used by all actions
$globaltemplates = array('event_giglist',
'event_giglistrow',
'event_giglistrowticket',
);

// pre-cache templates used by specific actions
$actiontemplates = array();

// ######################### REQUIRE BACK-END ############################
// if your page is outside of your normal vb forums directory, you should change directories by uncommenting the next line
// chdir ('/path/to/your/forums');
require_once('./global.php');

// #######################################################################
// ######################## START MAIN SCRIPT ############################
// #######################################################################

$navbits = construct_navbits(array('' => 'Gig List'));
$navbar = render_navbar_template($navbits);

// ###### YOUR CUSTOM CODE GOES HERE #####
$pagetitle = 'Gig List';

// ###### NOW YOUR TEMPLATE IS BEING RENDERED ######
$results = $vbulletin->db->query_read("SELECT date_format(gig.date, '%a %D %b %y') AS gig_date, gig.gigid, venue.venuename AS gig_venuename, gig.title, gig.status, gig.age
FROM gig
LEFT JOIN venue ON gig.venueid=venue.venueid
WHERE Status='confirmed' AND title != '' AND date >= ( CURDATE() ) ORDER BY date ASC");

// Loop through all results
while ($row = $vbulletin->db->fetch_array($results))
{
// Generate row html from template
$templater = vB_Template::create('event_giglistrow');
$templater->register('gigid', $row[gigid]);
$templater->register('title', $row[title]);
$templater->register('venuename', $row[gig_venuename]);
$templater->register('date', $row[gig_date]);
$templater->register('age', $row[age]);

$linkresults = $vbulletin->db->query_read("SELECT ticketlink
FROM ticketlink
LEFT JOIN gig ON ticketlink.gigid=gig.gigid
WHERE ticketlink.gigid=gig.gigid AND ticketlink.gigid = '$row[gigid]'");

while ($linkrow = $vbulletin->db->fetch_array($linkresults))
{
$templater = vB_Template::create('event_giglistrowticket');
$templater->register('linkrow', $linkrow);
$event_giglistrowticket .= $templater->render();
}
$event_giglistrow .= $templater->render();
}


// Optionally free memory
$vbulletin->db->free_result($results);
unset ($result_row);

$templater = vB_Template::create('event_giglist');
$templater->register_page_templates();;
$templater->register('event_giglistrow', $event_giglistrow);
$templater->register('navbar', $navbar);
$templater->register('pagetitle', $pagetitle);
print_output($templater->render());

?> main template (only the main display of table)

<table align="center" border="1" cellpadding="$stylevar[cellpadding]" cellspacing="$stylevar[cellspacing]" class="tborder" width="100%">

<tr class="tcat">
<td class="smallfont" align=center width="120"><b>Date&nbsp;</b></td>
<td class="smallfont" align=center width="140"><b>Venue&nbsp;</b></td>
<td class="smallfont" align=center><b>Title&nbsp;</b></td>
<td class="smallfont" align=center width="40"><b>Age&nbsp;</b></td>
<td class="smallfont" align=center width="80"><b>Tickets&nbsp;</b></td>
</tr>
{vb:raw event_giglistrow}
</table>templatebit that does the rows

<tr class="alt2">
<td class="smallfont" align=center>{vb:raw date}</td>
<td class="smallfont" align=center>{vb:raw venuename}</td>
<td class="smallfont" align=center>{vb:raw title}</td>
<td class="smallfont" align=center>{vb:raw age}</td>
<td class="smallfont" align=center>{vb:raw event_giglistrowticket}</td>
</tr>third template for the ticket link

{vb:raw linkrow.ticketlink}What seems to be happening is the ticket link is being skipped somehow then then just dropped in at the top of the gig list page.

It doesn't seem to be getting included in the template.

Lynne
21 Dec 2009, 16:56
I *think* (I'm not positive) that you need to use a different variable for your template rendering in the second while loop because you are using the same variable as the template above but it isn't 'complete' yet (you hadn't rendered it and thus completed the action). Maybe try this:
while ($linkrow = $vbulletin->db->fetch_array($linkresults))
{
$templater2 = vB_Template::create('event_giglistrowticket');
$templater2->register('linkrow', $linkrow);
$event_giglistrowticket .= $templater2->render();
}

Ghostsuit
21 Dec 2009, 17:00
That sorted them appearing at the top but still leaving me blank results at the ticket column :S.

Lynne
21 Dec 2009, 17:12
I guess you're gonna have to do some debugging and see if your query is getting you what you want. So, play with that loop and see what is really being output.

Ghostsuit
21 Dec 2009, 17:18
Yup looks like it thanks for the help though, sure you've got me on the right track :D

--------------- Added 21 Dec 2009 at 18:37 ---------------

Getting there...

$templater->register('event_giglistrowticket', $event_giglistrowticket); needed added after the second loop closed to bring the variable into the first loop. Now all I need to do is clear the variable after each loop I think so it's not constantly storing the same links. from the previous time.

All sorted with addition of $event_giglistrowticket=''; after $event_giglistrow .= $templater->render();

Hopefully this helps someone else in future.

Lynne
21 Dec 2009, 18:32
Great!