Cyklus foreach v foreach v latte

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

Ahoj,
řeším takový zajímavý problém.
Když v latte šabloně udělám toto.

{foreach $years as $year}
	<ul>
		<li>{$year->rok} ({$year->pocet})</li>
		<ul>
	{foreach $archives as $archiv}
		<li>{$archiv->mesic} ({$archiv->pocet})</li>
	{/foreach}
		</ul>
	</ul>
{/foreach}

dostanu tuto chybu:
Nette\InvalidStateException

Nette\Database\ResultSet implements only one way iterator.

Pokud ale dam ty cykly za sebe tak probehnou normalne.

mr.mac
Člen | 87
+
0
-

Vzdyt chybova hlaska jasne rika, ze iterator muze byt v cyklu jen jeden. Co na tom neni jasne?

David Matějka
Moderator | 6445
+
0
-

Necha se projit foreachem jen jednou, muzes ho (v presenteru) obalit treba CachingIterator-em 

Editoval matej21 (24. 4. 2014 0:47)

David Grudl
Nette Core | 8233
+
0
-

K čemu by obalení CachingIteratorem bylo?

Vícekrát by tuším mohlo jít projít {foreach $archives->fetchAll() as $archiv}

Tomáš Votruba
Moderator | 1114
+
0
-

Možná poslouží

{foreach $archives as $archiv |noiterate}
	...
{/}

Editoval Tomáš Votruba (24. 4. 2014 0:23)

David Matějka
Moderator | 6445
+
0
-

@dg: konkretne od flagu FULL_CACHE jsem ocekaval, ze by to pak nemuselo opakovane iterovat

@Tomáš Votruba: to jen v sablone vypne obaleni CachingIteratorem, takze to nepomuze

slo by taky rovnou v presenteru zavolat iterator_to_array($result) (coz je to, co interne dela fetchAll)

duke
Člen | 650
+
+1
-

Doporučuji nahradit text výjimky: „Nette\Database\ResultSet implements only one way iterator.“ za dle mého názoru poněkud jasnější: „Nette\Database\ResultSet implements only single-pass iterator.

Editoval duke (24. 4. 2014 1:22)