21306 Posts in 5736 Topics by 2603 members
|
Page:
1
|
Go to End | |
| Author | Topic: | 234 Views |
-
[SOLVED] Strange template include/loop order in SS3

16 January 2013 at 7:17am
Sorry for double posting, but I posted this in "Upgrading Silverstripe" and got no response. I was hoping someone here could help me.....
Okay, I have run into the following predicament and I'm not sure if this is a bug or intended behaviour, but it affects quite a bit of a project I'm upgrading.
In a template I have the following code:
<% if Results %>
<table class="records items">
<% loop Results %>
LOOP: $Pos
<% include ResultsTable %><% end_loop %>
</table>
<% end_if%>Which grabs the results from a search and plops them into a template. But the table part I reuse in other areas, so it is included. The table include looks like this:
<% if First %>
<tr class="heading">
<th>INCLUDE $Pos</th><% control ColHeadings %>
<th>$Value</th>
<% end_control %>
</tr>
<% end_if %><tr<% if Even %> class="zebra"<% end_if %>>
<td></td>
<% control RowValues %>
<td>$Value</td>
<% end_control %>
</tr>All the code works except I'm getting an unintended result: Every time the include runs, the "if first" evaluates to true... every time. The previous (2.*) versions of Silverstripe would first include the resultstable and THEN loop over it, with the "if first" only being true one time. The new (3.0.3) version seems to include that template every time it loops, which sets the iterator back to one every time.
Notice the $Pos vars in the templates: LOOP $Post evaluates to the correct number (LOOP 1, LOOP 2, LOOP 3, etc). But the INCLUDE $Pos is always 1.
Is this a bug or intended behaviour? If it is intended, then how am I supposed to order the includes/loop in order to have "if first" evaluate true only once?
-----------------
Don't know if it's relevant, but the table is populated by the following code:....
$query = $context->getQuery($searchCriteria, $Sort, array('start'=>$start,'limit'=>$limit));
$records = $context->getResults($searchCriteria, $Sort);
if($records) {
$records = new PaginatedList($records, $request);
}
return $records; -
Re: [SOLVED] Strange template include/loop order in SS3

18 January 2013 at 2:22am
I believe that this is bug and not intended. I would check http://open.silverstripe.org/ and see if its been submitted as a bug yet. If not, maybe submit a ticket yourself.
I've ran into this problem myself and just opted to not use the include until its resolved.
-
Re: [SOLVED] Strange template include/loop order in SS3

19 January 2013 at 9:50am
Thanks for your reply. That's what I'm afraid of. Just hoping I'm not the only one who is using Pos,First,or Last inside an include, which is included inside a loop...
Hoping I did something wrong so it's a quick fix...
-
Re: [SOLVED] Strange template include/loop order in SS3

27 January 2013 at 9:59am
I got a reply by submitting this as a bug, so in case anyone finds this and would like to know how it was solved, this is the reply I got from hfried:
--------------------------------
Hi,
This is expected behaviour. A bit annoying sometimes, but not a bug.
Including isn't the same as textual insertion - each include is evalutated as a seperate template, so <% include Foo %> Is the same as $this->renderWith('Foo').
The result is that $Pos, $First, $Last etc won't work at the top level of an include (and neither will $Up, and $Top will refer to the loop member, not the page)
There is a work-around though, in that you can pass arguments into includes
-- Page.ss --
<% loop Foo %>
<% include Table TopPos=$Pos %>
<% end_loop %>-- Table.ss --
$TopPos
| 234 Views | ||
|
Page:
1
|
Go to Top |


