n:foreach a n:if … řazení

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

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…

v6ak
Člen | 206
+
0
-

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.

rokerkony
Člen | 122
+
0
-

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??

pave.kucera
Člen | 122
+
0
-

Možná zkusit tohle

<table n:if="$notes">
	<tr n:foreach="$notes as $note">
	</tr>
</table>
rokerkony
Člen | 122
+
0
-

problem je ze jsem chtel halvicku tabulky zachovat… ale zatim asi jine reseni pomoci n: syntax neni noooo

Petr Motejlek
Člen | 293
+
0
-

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.

rokerkony
Člen | 122
+
0
-

to je rohodne dobre reseni… :) a resi i muj problem…

nAS
Člen | 277
+
0
-

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.