CurlyBracketsFilter: Složená závorka před {else}

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

Zdravím,
jiném vlákně jsme narazili na problém se zavináčem před {else}, který způsobí parse error. Testováno na PHP 5.3 (někdo by mohl vyzkoušet, jak se to chová na PHP 5.2.x).

// Doplnění: PHP 5.2.9 – stejná chyba

Problém je ve vygenerovaném kódu šablony:

{* kód  *}

@{if TRUE}
	{* kód  *}
@{else}
	{* kód  *}
@{/if}

{* kód  *}
<?php
if (SnippetHelper::$outputAllowed) {
	// kód
}

if (TRUE):
	if (SnippetHelper::$outputAllowed) {
		// kód
	}
else: // zde dojde k parse error
	if (SnippetHelper::$outputAllowed) {
		// kód
	}
endif;

if (SnippetHelper::$outputAllowed) {
	// kód
}
?>

else se v tomto kontextu pravděpodobně považuje za součást vnitřní podmínky if (SnippetHelper::$outputAllowed), a ne jako else: pro vnější podmínku, která je zapsaná alternativní syntaxí, takže koncová : je neočekávaná. Totéž platí pro jakýkoliv if se složenými závorkami před {else}:

{if TRUE}
<?php
	if (TRUE) {
		// kód
	}
?>
{else}
	{* kód *}
{/if}

Oprava by měla být jednoduchá – upravit překlad makra {else} na <?php ; else: ?>, tedy přidat středník. Nic by to rozbít nemělo (tzn. nic jsem nezaznamenal) a výše uvedené příklady se chovají tak, jak mají.

Editoval Panda (18. 7. 2009 9:58)

Mas3r
Člen | 116
+
0
-

Zafungovalo.

Díky… nemělo by se to dát přímo do Nette?

hrach
Člen | 1838
+
0
-

nemělo by to platit i pro elseif?

jarks
Člen | 94
+
0
-

Zdá se, že problém přetrvává i v dalších verzích. Dnes jsem si z webu stáhnul doporučovanou 0.9, rev 464 a dělá to pořád. Nově se ale k nápravě musí použít místo

CurlyBracketsFilter::$defaultMacros['else'] = '<?php ; else: ?>'; */

toto:

CurlyBracketsMacros::$defaultMacros['else'] = '<?php ; else: ?>';

Protože podle changelogu v rev. 444 došlo k oddělení maker. Jinak obdržíte chybu
Access to undeclared static property: CurlyBracketsFilter::$defaultMacros.

Panda
Člen | 569
+
0
-

hrach napsal(a):

nemělo by to platit i pro elseif?

Mělo, díky za upozornění.

CurlyBracketsMacros::$defaultMacros['elseif'] = '<?php ; elseif (%%): ?>';
romansklenar
Člen | 655
+
0
-

Taky jsem si nad tím teďka vylámal zuby a vytrhal vlasy :)

Opraveno v r465.

Panda
Člen | 569
+
0
-

romansklenar napsal(a):

Taky jsem si nad tím teďka vylámal zuby a vytrhal vlasy :)

Opraveno v r465.

Paráda, díky moc!

David Grudl
Nette Core | 8218
+
0
-

Už by to mělo být pořešeno na úrovni optimalizátoru PHP kódu šablon.