Latte foreach při použití iterator
- Bilbo
- Člen | 16
Ahoj, zase nevím, jestli se jedná o bug nebo o mou chybku, každopádně:
V Latte chci použít makro foreach společně s proměnnou $iterator na iterovatelný objekt (implementace rozhraní \Iterator nebo \IteratorAggregate), když však používám některé iterátory (dělá mi to např. u \DirectoryIterator a u některých mých vlastních iterátorů, u normálního pole a \ArrayIterator to funguje správně), tak při průchodu v Latte, pokud používám uvnitř cyklu zmíněnou proměnnou $iterator, tak to vynechává první prvek (iterátor je jakoby posunutý), viz následující příklad:
{var $test = new \DirectoryIterator('.')}
{foreach $test as $elem}
{$elem}<br>
{/foreach}
{* versus *}
{foreach $test as $elem}
{$elem}<br>
{var $a = $iterator->getCounter()}
{/foreach}
Zatímco první příklad korektně vypíše všechny soubory ve složce,
druhý vynechá první prvek.
Všiml jsem si, že pokud použiji proměnnou $iterator, tak se výsledná
šablona zkompiluje jinak (viz níže), konkrétně se tam použije třída
‚Nette\Iterators\CachingIterator‘.
Dělám něco špatně, nevěděl by někdo ?
Předem díky :-)
<?php $iterations = 0; foreach ($test as $elem): ?>
<?php echo Nette\Templating\Helpers::escapeHtml($elem, ENT_NOQUOTES) ?><br />
<?php $iterations++; endforeach ?>
<?php $iterations = 0; foreach ($iterator = $_l->its[] = new Nette\Iterators\CachingIterator($test) as $elem): ?>
<?php echo Nette\Templating\Helpers::escapeHtml($elem, ENT_NOQUOTES) ?><br />
<?php $a = $iterator->getCounter() ;$iterations++; endforeach; array_pop($_l->its); $iterator = end($_l->its) ?>
Editoval Bilbo (8. 8. 2012 6:41)