PDA

View Full Version : Conditionals in templates do NOT work


sv1cec
12-12-2013, 05:02 PM
I am working on old hack I've build for vB 3.0.xx, which I would like to upgrade so that we can use it in our new vB 4.2.2 site and I have trouble making the conditionals inside the templates work.

For example, I have this template:


<html>
<head>
{vb:raw headinclude}
<title>$vboptions[bbtitle] - $pagetitle</title>
{vb:raw headinclude_bottom}
</head>
<body>
{vb:raw header}

<BR>
<vb:if condition="$bbuserinfo[userid]=='0'">

<table class="tborder" cellpadding="5" cellspacing="5" border="0" width="100%" align="center">
<tr>
<td colspan="3">Guest - No Permissions</td>
</tr>
<tr>
<td colspan="3">Unable To View</td>
</tr>
<tr>
<td colspan="3">Guests Are Unable To View This Page</td>
</tr>
</table>
<br/>

<vb:else />

$warn_page
<br />
</vb:if>

{vb:raw footer}
</body>
</html>


Nothing shows up. If I edit it and remove the conditional, then it works fine (OK, there are some formating issues but that's another thing).

So my question is: Is there something special that needs to be done, in the php side of things, in order for conditionals to work? I've noticed by studying the original code, that there is a ... templater section, for example:


$templater = vB_Template::create('register');
$templater->register_page_templates();
$templater->register('navbar', $navbar);
$templater->register('birthdayfields', $birthdayfields);
$templater->register('checkedoff', $checkedoff);
$templater->register('customfields_option', $customfields_option);
$templater->register('customfields_other', $customfields_other);
$templater->register('customfields_profile', $customfields_profile);
$templater->register('day', $day);
$templater->register('email', $email);
$templater->register('emailconfirm', $emailconfirm);
$templater->register('errorlist', $errorlist);
$templater->register('human_verify', $human_verify);
$templater->register('month', $month);
$templater->register('parentemail', $parentemail);
$templater->register('password', $password);
$templater->register('passwordconfirm', $passwordconfirm);
$templater->register('referrername', $referrername);
$templater->register('timezoneoptions', $timezoneoptions);
$templater->register('url', $url);
$templater->register('username', $username);
$templater->register('year', $year);
$templater->register('fbname', $fbname);
$templater->register('fbprofileurl', $fbprofileurl);
$templater->register('fbprofilepicurl', $fbprofilepicurl);
$templater->register('fbimportform', $fbimportform);
print_output($templater->render());


Can someone please explain what this section does? From its looks, it appears to me that it is passing parameters to the template, is that correct? Is this mandatory?

Many thanks for all help you can provide.

Lynne
12-12-2013, 05:07 PM
What do you mean by "nothing shows up"? Do you mean a blank page shows up or what?

Is $warn_page registered for use in the template? Nothing will show up for it if it isn't (and that is what the templater stuff is all about).

kh99
12-12-2013, 05:11 PM
Also, it should be changed to {vb:raw warn_page} (as well as being registered to the template).

sv1cec
12-12-2013, 05:48 PM
Yes, that's what I mean. A blank page. And no, I am not using the templater at all (didn't you understand my ignorance?!?!?! LoRL).

So let me understand that. Every variable that appears in a template, has to be passed via the templater? And am I correct in assuming that the first reference to the variable name (the one within the single quote) is the name with which the variable will be known in the template, while the second one (the one with the $ in front) is the variable name in php?

One more question, if a template is evaluated many times, let's say that it is evaluated several times, creating several <tr> rows in a table, can the templater be included in a while loop? Something doesn't work correctly, when I do that.

I knew there was something in that piece of code that was needed! LoRL

Lynne
12-12-2013, 10:18 PM
Cellarius wrote a really good article that you may be interested in - [vB4] Rendering templates and registering variables - a short guide (https://vborg.vbsupport.ru/showthread.php?t=228078) Near the bottom he talks about how to preregister a variable for use in a template (search on the word preregister).

If you are creating a variable that is a bunch of table rows (you are using .= to add to the variable?), then once you are out of the loop you will want to preregister the variable for use in a template. If you are rendering the template in the middle of the loop, then you would just use $templater->register right before you render it.

sv1cec
12-13-2013, 07:03 AM
Good Lord, thanks! I wonder why that article never popped up when I was googling this issue!

Lynne many thanks, I appreciate it.

And yes, I am using .= to add the table rows in a variable, but those table rows are generated from the eval of a template. The problem with the new vB approach for rendering templates is that if you use eval, you can't use conditionals inside the template, so you need to evaluate these conditionals in the php code.

kh99
12-13-2013, 09:48 AM
... The problem with the new vB approach for rendering templates is that if you use eval, you can't use conditionals inside the template, so you need to evaluate these conditionals in the php code.

Maybe I'm missing what you're saying, but that doesn't sound right. You shouldn't be using eval at all for your templates in vb4. And you should always be able to use conditionals in a template.