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.