commit optimalizace foreach někdy nedefinuje $iterator

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

chtěl jsem to dát na github, ale tam nějspíš parser markdown ořízne kód
https://github.com/…9a267c6c97b8
předtím to fungovalo, dodám.
regexp nepozná $iteratator (nevím jestli to nejdřív zpracuje attra macro clas), $iterator tedy není definován.

<?php

require '../libs/Nette/loader.php';
Nette\Diagnostics\Debugger::enable(false);
Nette\Diagnostics\Debugger::$strictMode = true;

$t = new Nette\Templating\Template;
$t->registerFilter(new Nette\Latte\Engine);
$src = <<<'EURO'
Test
{foreach [1,2,3] as $article}
	      -<b n:class="$iterator->isEven() ? even">{$article}</b>,

{/foreach}
EURO;
$t->setSource($src);
$cp = $t->compile();
Nette\Diagnostics\Debugger::$maxLen = 41568;
dump($cp);

echo $t;

Aby to bylo hned vidět bez spouštění, tak zde je compiled template

<?php
// prolog Nette\Latte\Macros\CoreMacros
list($_l, $_g) = Nette\Latte\Macros\CoreMacros::initRuntime($template, '8kttu7hf5e')
;
// prolog Nette\Latte\Macros\UIMacros

// snippets support
if (!empty($_control->snippetMode)) {
	return Nette\Latte\Macros\UIMacros::renderSnippets($_control, $_l, get_defined_vars());
}

//
// main template
//
?>
Test
<?php $iterations = 0; foreach (array(1,2,3) as $article): ?>
	      -<b<?php if ($_l->tmp = array_filter(array($iterator->isEven() ? 'even':null))) echo ' class="' . htmlSpecialChars(implode(" ", array_unique($_l->tmp))) . '"' ?>
><?php echo Nette\Templating\Helpers::escapeHtml($article, ENT_NOQUOTES) ?></b>,

<?php $iterations++; endforeach ;

funkce macroendforeach

	public function macroEndForeach(MacroNode $node, $writer)
	{
		if (preg_match('#\W(\$iterator|include|require|get_defined_vars)\W#', $node->content)) {
			$node->openingCode = '<?php $iterations = 0; foreach ($iterator = $_l->its[] = new Nette\Iterators\CachingIterator('
			. preg_replace('#(.*)\s+as\s+#i', '$1) as ', $writer->formatArgs(), 1) . '): ?>';
			$node->closingCode = '<?php $iterations++; endforeach; array_pop($_l->its); $iterator = end($_l->its) ?>';
		} else {
			$node->openingCode = '<?php $iterations = 0; foreach (' . $writer->formatArgs() . '): ?>';
			$node->closingCode = '<?php $iterations++; endforeach ?>';
		}
	}

A ještě dump $node->content;
-<bj1ziyvybxr><?php echo Nette\Templating\Helpers::escapeHtml($article, ENT_NOQUOTES) ?></b>,

Editoval bojovyletoun (26. 1. 2012 12:47)

Filip Procházka
Moderator | 4668
+
0
-

Možná tam chybí lomítko?

'#\W(\$iterator'

'#\W(\\\$iterator'
David Grudl
Nette Core | 8228
+
0
-

fixed

Proki
Člen | 66
+
0
-

V aktuální verzi ze 30.1.2012 se mi objevuje ta stejná chyba (Undefined variable: iterator) v případě, že foreach je použit jako n atribut.

<p n:foreach="[1, 2, 3] as $item" n:class="$iterator->even ? even">{$item}</p>

Editoval Proki (31. 1. 2012 18:13)

David Grudl
Nette Core | 8228
+
0
-

fixed