Unexpected {/ifset}, expecting {/define}

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

Ahoj, omlouvam se za relativne trivilani otazku, ale porad se s Nette po kruckach seznamuji a narazil jsem na nasledujici vec v latte.

Mam klasicky foreach prispevku v latte a v kazdem prispevku potrebuji vypsat par udaju pro kategorii prispevku. Kategorie se casto opakuji a tak se mi zda zbytecne znovu pokladat stejny dotaz do databaze, pokud jiz probehl.

Takhle to spis vysvetlim lip :) :

//$catID predavam pri includovani snippetu
{define snippet}

{!ifset $category[$catID]}
{var $category[$catID] = $template->getCat($catID)}
{/ifset}

//nejaky html kod, vypisovani promennych, apod., tam je vse ok
{/define}

Chybou je: Unexpected {/ifset}, expecting {/define}
Nevite, proc by to takhle nemohlo fungovat? Ja tam z pohledu logiky chybu nevidim. Diky za rady.

EDIT: Ted me jeste napadlo:

{default $category[$catID] = $template->getCat($catID)}

Coz mi vraci: Unexpected '[', tak jeste mrknu jak funguji pole v latte.

Editoval hotline (27. 6. 2015 17:43)

David Grudl
Nette Core | 8216
+
+3
-

Nahraď {!ifset $category[$catID]} za {if !isset($category[$catID])}

hotline
Člen | 41
+
0
-

Diky moc, to je ono. Problem v te negaci me vubec nenapadl.

Šaman
Člen | 2658
+
+1
-

Jen pokud by nebylo úplně zřejmě, proč tomu tak je – latte se parsuje a v tom prvním zápisu to pochopilo jako makro {!}, které ti bez escapování vypíše ifset $category[$catID]. To se asi vykonalo, nic nevypsalo a latte pak narazilo na neočekávané {/ifset}. Pokud by makro {!} neexistovalo, napsalo by ti už nahoře neznámé makro {!ifset}.


Pokud ti nefunguje ten zápis {default $category[$catID] = $template->getCat($catID)}, tak můžeš použít makro {?}. Default nastavuje proměnnou, ale jestli umí pracovat s položkami pole, to nevím, nějak jsem to zatím nepotřeboval. Když už pracuješ se složitějšími strukturami, je lepší to pořešit v presenteru, a v latte spíš jen vypisovat.

Editoval Šaman (27. 6. 2015 21:04)

hotline
Člen | 41
+
0
-

Diky moc za podrobne vysvetleni, Samane. :) Ja to chtel resit v presenteru, ale pak mi doslo, ze bych musel vykonavat ten samy pozadavek dvakrat (foreach; v presenteru i v latte), coz se mi moc nechtelo, protoze tech foreachu je vic.

Kazdopadne diky za vsechnu pomoc, ktera se mi tu dostava, jsem moc rad, ze jsem poznal Nette a po dlouhe dobe rozmysleni a dokopavani se jsem v nem zacal delat, vazne si ho nemuzu vynachvalit. :)