vb.org Archive

vb.org Archive (https://vborg.vbsupport.ru/index.php)
-   vB4 Programming Discussions (https://vborg.vbsupport.ru/forumdisplay.php?f=252)
-   -   Nested Loop with templates (https://vborg.vbsupport.ru/showthread.php?t=230680)

Ghostsuit 12-21-2009 10:14 AM

Nested Loop with templates
 
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?

Code:

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

Here's the full loop with nesting

Code:

$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 12-21-2009 02:13 PM

You just need to register the array:
PHP Code:

$templater->register('linkrow'$linkrow); 

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

Ghostsuit 12-21-2009 02:52 PM

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 12-21-2009 02:55 PM

In place of this one:
PHP Code:

$templater->register('ticketlink'$linkrow[ticketlink]); 

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

Ghostsuit 12-21-2009 03:06 PM

I must be doing something wrong that's giving blank results. :(.

Ghostsuit 12-21-2009 03:42 PM

1 Attachment(s)
Heres the full page code with the suggested change made.

Code:

<?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)

Code:

<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

Code:

<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

Code:

{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 12-21-2009 03:56 PM

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:
PHP Code:

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


Ghostsuit 12-21-2009 04:00 PM

That sorted them appearing at the top but still leaving me blank results at the ticket column :S.

Lynne 12-21-2009 04:12 PM

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 12-21-2009 04:18 PM

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...

Code:

$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.


All times are GMT. The time now is 06:02 PM.

Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2025, vBulletin Solutions Inc.

X vBulletin 3.8.12 by vBS Debug Information
  • Page Generation 0.01329 seconds
  • Memory Usage 1,760KB
  • Queries Executed 10 (?)
More Information
Template Usage:
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_header_end
  • (1)ad_header_logo
  • (1)ad_navbar_below
  • (7)bbcode_code_printable
  • (3)bbcode_php_printable
  • (1)footer
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (6)option
  • (1)pagenav
  • (1)pagenav_curpage
  • (1)pagenav_pagelink
  • (1)post_thanks_navbar_search
  • (1)printthread
  • (10)printthreadbit
  • (1)spacer_close
  • (1)spacer_open 

Phrase Groups Available:
  • global
  • postbit
  • showthread
Included Files:
  • ./printthread.php
  • ./global.php
  • ./includes/init.php
  • ./includes/class_core.php
  • ./includes/config.php
  • ./includes/functions.php
  • ./includes/class_hook.php
  • ./includes/modsystem_functions.php
  • ./includes/class_bbcode_alt.php
  • ./includes/class_bbcode.php
  • ./includes/functions_bigthree.php 

Hooks Called:
  • init_startup
  • init_startup_session_setup_start
  • init_startup_session_setup_complete
  • cache_permissions
  • fetch_threadinfo_query
  • fetch_threadinfo
  • fetch_foruminfo
  • style_fetch
  • cache_templates
  • global_start
  • parse_templates
  • global_setup_complete
  • printthread_start
  • pagenav_page
  • pagenav_complete
  • bbcode_fetch_tags
  • bbcode_create
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • printthread_post
  • printthread_complete