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