Šablona hlásí Undefined offset: 2 kvůli tabulátoru?
- mirdič
- Člen | 41
Nette Framework 2.0 (revision 013c8ee released on 2012–02–03)
Zdravíčko,
Našel jsem nejspíš bug:
Když mám v šabloně:
{if !empty($services)}
<fieldset><div>{_"Services"} - BRUTTO</div>
{foreach $services as $service}
<div>
{label 'price_netto'.$service['id'] /}
<div>{input 'price_brutto'.$service['id']}</div>
</div>
{/foreach}
</fieldset>
{/if}
<fieldset>
<div>
<div>{input 'send'}</div>
</div>
</fieldset>
Tak skončím s notice Undefined offset: 2
Ale když nemám kód indentovaný tak je vše v pořádku. Takže toto, mi jede bez problém:
{if !empty($services)}
<fieldset><div>{_"Services"} - BRUTTO</div>
{foreach $services as $service}
<div>
{label 'price_netto'.$service['id'] /}
<div>{input 'price_brutto'.$service['id']}</div>
</div>
{/foreach}
</fieldset>
{/if}
<fieldset>
<div>
<div>{input 'send'}</div>
</div>
</fieldset>
Je to na řádce 4896 v nette.min.php
Žádné skrytém znaky v kódu nemám.
Dělám něco já špatně, nebo je to chyba nette?
- mirdič
- Člen | 41
Juan napsal(a):
Ty myslíš, že ještě nikdy nikdo před tebou nepoužil tabulátor v šabloně? :D
To si nemyslím, ani jsem to nikde nenapsal. Jen je to podle mého názoru zajímavá chyba a vzheledem k tomu, že jsem nic podobného zde na fóru nenašel a nette 2.0 stable je venku pár dní přičemž na betě mi to nedělalo, tak jsem to napsal zde do hlášení chyb.
V jakém kódování je šablona? Na jakém řádku šablony to padá?
Šablona je v utf-8 a chyba je od řádku 105 kde začíná if empty.. a končí na řádku 120 kde je konec formu. Když mám kdekoli mezi těmito řádky víc jak dva tabulátory odsazený řádek, tak to hodí notice.
Zajímavé je, že mám stejný kód o pár řádků níže indentovaný a s tím problém není.
- mirdič
- Člen | 41
Jo zkusím to, ale dostanu se k tomu nejspíš až o víkendu.
Jinak tady je verze funkce z bety:
function macroBlockEnd(MacroNode $node, $writer)
{
if (isset($node->data->name)) {
if (empty($node->data->leave)) {
if (!empty($node->data->dynamic)) {
$node->content .= '<?php if (isset($_dynSnippets)) return $_dynSnippets; ?>';
}
$this->namedBlocks[$node->data->name] = $node->content;
$node->content = '';
}
return $node->data->end;
} elseif ($node->modifiers) {
return $writer->write('echo %modify(ob_get_clean())');
}
}
A tady aktuální:
public function macroBlockEnd(MacroNode $node, $writer)
{
if (isset($node->data->name)) { // block, snippet, define
if ($node->name === 'snippet' && isset($node->htmlNode->macroAttrs['snippet']) // n:snippet -> n:inner-snippet
&& preg_match("#^(.*? n:\w+>\n?)(.*?)([ \t]*<[^<]+)$#sD", $node->content, $m))
{
$node->openingCode = $m[1] . $node->openingCode;
$node->content = $m[2];
$node->closingCode .= $m[3];
}
if (empty($node->data->leave)) {
if (!empty($node->data->dynamic)) {
$node->content .= '<?php if (isset($_dynSnippets)) return $_dynSnippets; ?>';
}
preg_match("#^(\n)?(.*?)([ \t]*)$#sD", $node->content, $m);
$this->namedBlocks[$node->data->name] = $m[2];
$node->content = $m[1] . $node->openingCode . "\n" . $m[3];
$node->openingCode = "<?php ?>";
}
} elseif ($node->modifiers) { // anonymous block with modifier
return $writer->write('echo %modify(ob_get_clean())');
}
}
Když v šabloně nepoužiju block, tak notice nevyskočí.