Request for comments - nested sections/looping/padding
[email protected] (Andrei Zmievski) Wed, 1 Mar 2000 09:33:07 -0600
| Newsgroups | php.template |
|---|---|
| Message-ID | <[email protected]> |
I've been thinking a lot about nested sections/looping/repeating values.
Here's what I came up with.
* I'm not sure 'repeat' is a good name. I think 'pad' would be better.
* 'pad' would have one of three values:
* 'none' - means stop looping when the variable with the minimum number
of values is done
* 'default' - pad with the default value, or empty string if default is
not specified
* 'last' - pad with the last value of the variable (or the only value
if it's not an array)
By default, I think, 'pad' should be 'default' for arrays, and 'last'
for variables with single value. Some examples:
1. Let's say we have $color = array("red", "green", "blue"), and $size =
array("large", "small"). If we have this template piece:
{{section}}
{{ $color }} - {{ $size }}
{{/section}}
Then by default it will output:
red - large
green - small
blue -
If we use {{ $size default="none" }}, then we'd have:
red - large
green - small
blue - none
If we use {{ $size pad=none }}, we'd have:
red - large
green - small
2. Let's say we have $domain = "php.net", $name = array("joe",
"andrei").
{{section}}
{{ $name }}@{{ $domain }}
{{/section}}
Then by default it will output:
[email protected]
[email protected]
If we use {{ $size pad=last }}, we'd have:
[email protected]
andrei@
* Imagine this scenario:
{{section category}}
Category: {{ $catname }}
{{section article}}
{{ $headline }} - {{ $date }}
{{/section article}}
{{/section category}}
What we want to do here is display a list of categories, and for each
category, display the list of headlines and dates in it. So, we'll have
to assign the data like this:
tmpl_assign($id, "catname", array("Sports", "News"));
tmpl_assign($id, "headline", array("Sports Headline 1"),
array("News Headline 1", "News Headline 2"));
tmpl_assign($id, "date", array("02/20/00", array("02/21/00", "02/23/00"));
Or if you are receiving data incrementally, you'd use tmpl_add_value(),
assuming $sql->record["headline"] contains all the headlines for a
category, and so on:
while ($sql->next()) {
tmpl_add_value($id, "catname", $sql->record["Category"]);
tmpl_add_value($id, "headline", $sql->record["headline"]);
tmpl_add_value($id, "date", $sql->record["date"]);
}
Is this clear?
Basically, after the section loops through one set of values, it
increments internal pointer so that the next time 'article' section is
entered into, it will loop through the next set of values.
* You can refer to the current value of variable as it exists in another
section using $<section name>/<var name>, e.g. $category/catname
* The variables in outer sections are visible to inner ones, e.g.
$category/catname, but outer sections cannot look inside inner ones, e.g.
$article/headline will give you nothing when used outside the 'article'
section. But it might be useful to do #article/TOTAL to get the total
number of headlines/dates that were printed. We'll have to think more
about what happens when you refer to $article/headline from outside.
* Imagine that we want to print the categories and articles like this:
News News Headline 1 02/21/00
News Headline 2 02/23/00
Sports Sports Headline 1 02/20/00
Now, how would you do this? Each row would have to be printed in the
'article' section, but we need to loop through $catname too, getting each
next value only when the 'article' section looping is done. I think we can
do it like this:
{{section category}}
{{section article}}
Category: {{ $category/catname pad=default }} {{ $headline }} {{ $date }}
{{/section article}}
{{/section category}}
So, even though $catname is not seen in 'category' section, it is assigned
to it by virtue of having been mentioned as $category/catname. Thus on the
first iteration of the 'article' loop, we'll print:
News News Headline 1 02/21/00
Then, since pad=default and $category/catname has only a single value,
we're going to output default (which is empty here) and we'd have:
News Headline 2 02/23/00
Now, 'article' looping is done and it will increment internal pointer to
go to the next set of values. 'category' looping is also done, so it's
going to go to 'Sports' now, and the next printed thing will be:
Sports Sports Headline 1 02/20/00
And we have our desired result.
I think the basic ideas are good and pretty flexible, we might want to come
up with really good names for attributes and values so that the designer is
not too confused. I'm not sure about 'pad', 'default', 'last', etc.
-Andrei
"The galaxy is, in other words, an immensely, intrinsically,
and inexhaustibly interesting place." -- Iain M. Banks