n:foreach a n:if … řazení
- rokerkony
- Člen | 122
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…
- pave.kucera
- Člen | 122
Možná zkusit tohle
<table n:if="$notes">
<tr n:foreach="$notes as $note">
</tr>
</table>
- Petr Motejlek
- Člen | 293
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.
- nAS
- Člen | 277
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.