#1 17. 2. 2010 23:53
- rokerkony
- Člen

- Místo: Děčín 27
- Registrovaný: 29. 7. 2008
- Příspěvky: 120
n:foreach a n:if … řazení
Ahoj mám tento kód
<tr n:if="!empty($notes)" n:foreach="$notes as $note">
<td>
{$note->note_created|date}
</td>
</tr>
a předpokládal jsem že se nejdříve vykoná podmínka IF a teprve když to projde, tak dojde ke zpracování foreache… ale ať zadám kód výše nebo to prohodím takto
<tr n:foreach="$notes as $note" n:if="!empty($notes)">
tak mi to vždy vygeneruje toto:
<?php foreach ($iterator = $_cb->its[] = new SmartCachingIterator($notes) as $note): if (!empty($notes)): ?>
čili podmínku if to hodí za foreach…
nevím zda je to bug nebo chtěné chování, ale asi spíš bug
jsem na vývojové verzi…
Offline
#2 20. 2. 2010 18:50
- v6ak
- Člen

- Registrovaný: 1. 5. 2008
- Příspěvky: 129
Re: n:foreach a n:if … řazení
Co jsem četl diskuzi, tak je to spíš vlastnost. Na pořadí parametrů AFAIK zřetel brán obecně není a podmínka se může hodit k filtraci.
Offline
#3 20. 2. 2010 23:38
- rokerkony
- Člen

- Místo: Děčín 27
- Registrovaný: 29. 7. 2008
- Příspěvky: 120
Re: n:foreach a n:if … řazení
chapu ze neni brat zretel na poradi v jakem to pises… ale melo by to snad zachovavat poradi ktere zadas ne?
a nebo jinak.. jak to resite?
<tr n:foreach="$notes as $note">
když je $notes prazdny tak to zarve chybu… takhle by se to dalo osetrit… ?? nebo lepsi napad??
Offline
#4 21. 2. 2010 9:11
- JannBaill
- Člen
- Registrovaný: 9. 5. 2009
- Příspěvky: 34
Re: n:foreach a n:if … řazení
Možná zkusit tohle
<table n:if="$notes">
<tr n:foreach="$notes as $note">
</tr>
</table>
Offline
#5 21. 2. 2010 11:03
- rokerkony
- Člen

- Místo: Děčín 27
- Registrovaný: 29. 7. 2008
- Příspěvky: 120
Re: n:foreach a n:if … řazení
problem je ze jsem chtel halvicku tabulky zachovat… ale zatim asi jine reseni pomoci n: syntax neni noooo
Offline
#6 21. 2. 2010 11:07
- Petr Motejlek
- Nette guru
- Registrovaný: 9. 1. 2009
- Příspěvky: 283
Re: n:foreach a n:if … řazení
Já se vždycky snažím proměnnou definovat (tzn. mít jich co nejméně null), takže i pole, nejdřív definuju jako array() a pak je začnu plnit.
Offline
#7 21. 2. 2010 19:32
- rokerkony
- Člen

- Místo: Děčín 27
- Registrovaný: 29. 7. 2008
- Příspěvky: 120
Re: n:foreach a n:if … řazení
to je rohodne dobre reseni… :) a resi i muj problem…
Offline
#8 19. 3. 2010 20:59
Re: n:foreach a n:if … řazení
Mně by se také líbilo, kdyby se zachovávalo pořadí parametrů. Tak jsem
se na to koukal a stačí přepsat metodu attrsMacro v
LatteMacros.php:
public function attrsMacro($code, $attrs, $closing)
{
$left = $right = '';
foreach ($attrs as $name => $foo) {
$macro = $closing ? "/$name" : $name;
if (isset($this->macros[$macro])) {
if ($closing) {
$right = $this->macro($macro, '', '') . $right;
} else {
$left .= $this->macro($macro, $attrs[$name], '');
}
}
else if (strpos($name, 'inner-') === 0) {
$innerName = substr($name, 6); // strip starting "inner-"
$macro = $closing ? "/$innerName" : $innerName;
if (isset($this->macros[$macro])) {
if ($closing) {
$left .= $this->macro($macro, '', '');
} else {
$right = $this->macro($macro, $attrs[$name], '') . $right;
}
} else {
return NULL;
}
}
else if (strpos($name, 'tag-') === 0) {
$tagName = substr($name, 4); // strip starting "tag-"
if (isset($this->macros[$tagName])) {
$left .= $this->macro($tagName, $attrs[$name], '');
$right = $this->macro("/$tagName", '', '') . $right;
} else {
return NULL;
}
}
else {
return NULL;
}
unset($attrs[$name]);
}
return $left . $code . $right;
}
Ještě by to chtělo, aby někdo zkontroloval, jestli to nemá nějaké vedlejší efekty, ale já jsem žádné nepozoroval. A kód by měl být rychlejší než originální.
Jenom se musí dávat n:tag- parametry za všechny ostatní
n:, jinak to nefunguje správně. Ale na to by šla udělat
jednoduše kontrola a vyhazovat výjimku.
Offline


