Latte foreach při použití iterator

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Bilbo
Člen | 16
+
0
-

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)

Bilbo
Člen | 16
+
0
-

Hmmmm, tak jsem tady na fóru našel, že se jedná o bug v samotném PHP :-(

https://forum.nette.org/…akru-foreach

Bilbo
Člen | 16
+
0
-

Ještě se zeptám, neřešil někdo podobný problém?
Dá se s tím něco dělat?