Foreach ve foreach v latte

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

Přátelé, potřeboval bych vyřešit následující problém. Potřebuji v rámci výpisu vypsat objednávky a zároveň u každé z nich i vypsat její položky. Ve view mám něco takového:

{foreach $orders as $order}
	<tr>
		<td>
			{foreach $order->items as $item}
				{$item->name}
			{/foreach}
		</td>
	</tr>
{/foreach}

Což bohužel není funkční (chyba Nette\Database\ResultSet implements only one way iterator). Nevím, jak jinak to řešit a nenapadá mě nic jiného, než že bych výpis položek objednávky vytvořil už modelu nebo presenteru, kde bych však již musel vkládat html, což samozřejmě nechci.

Doplnění: $Orders se tahá z databáze, kdy řádek odpovídá jedné objednávce, $order->items se pak tahá také z databáze, kdy řádek odpovídá jedné položce objednávky. Zhruba takto:

		$sql = 'SELECT * FROM order';
		$orders = $this->db->query($sql);
		foreach ($orders as $order) {
			$sql = 'SELECT * FROM order_item';
			$order->items = $this->db->query($sql);
			$return[] = $order;
		}
		$this->template->orders = $return;

Editoval Andre (9. 10. 2014 16:05)

David Matějka
Moderator | 6445
+
0
-

Kde a jak vytvaris $orders? jak tam vyplnujes ty items?

Andre
Člen | 24
+
0
-

Doplnil jsem to do otázky.

David Matějka
Moderator | 6445
+
+1
-

takze chapu spravne, ze nekde v modelove tride vytahnes objednavky, projdes je pomoci foreache a nasetujes jim items dalsim dotazem?

Nejsnazsi reseni bude projet vysledek fci iterator_to_array, zhruba takhle:

$orders = $this->database->query(....);
$orders = iterator_to_array($orders);
foreach(..) {
	....
}
return $orders;
Andre
Člen | 24
+
0
-

A jakým způsobem pak nahradit cyklus foreach v latte? Bohužel jsem úplně nepochopil, jak tvoje řešení aplikovat. Do otázky jsem ještě doplnil, jak se proměnné používané ve view plní.

David Matějka
Moderator | 6445
+
0
-

Jestli to opravdu mas tak, jak si doplnil do ukazky, tak by to fungovat melo. Na jakym radku konkretne to hlasi chybu?

Ten muj kod s iterator_to_array zajisti, ze se PDO iterator prevede na pole a tudiz pres nej pude iterovat neomezene-krat

Andre
Člen | 24
+
0
-

Chybu vyhazoval řádek {foreach $order->items as $item} ve view, tudíž jsem aplikoval fci iterator_to_array na $order->items v modelu. Nyní je již vše funguje. Děkuji za pomoc.