Šablona hlásí Undefined offset: 2 kvůli tabulátoru?

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

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?

nanuqcz
Člen | 822
+
0
-

Ahoj, zkus pls, jestli se ta chyba projeví i v ne-minifikované verzi Nette. A případně napiš, kde to hlásí chybu tam (což určitě Davidovi při odstraňování chyby pomůže víc).

mirdič
Člen | 41
+
0
-

File: …\libs\Nette\Latte\Macros\UIMacros.php Line: 331

331: $this->namedBlocks[$node->data->name] = $m[2];

Jan Jakeš
Člen | 177
+
0
-

Našel jsem nejspíš bug:

Ty myslíš, že ještě nikdy nikdo před tebou nepoužil tabulátor v šabloně? :D

V jakém kódování je šablona? Na jakém řádku šablony to padá?

mirdič
Člen | 41
+
0
-

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í.

nanuqcz
Člen | 822
+
0
-

Mohl bys tu chybu nasimulovat v sandboxu? (předpokládám, že zdrojáky tvojeho projektu nám dávat ke stažení nechceš ;-) )

mirdič
Člen | 41
+
0
-

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čí.

radas
Člen | 221
+
0
-

Stejný problém v tomto příspěvku a taky tady kde jsem dal link na můj „problémový kód“ na Pastebin.