CurlyBracketsFilter: Složená závorka před {else}
- Panda
- Člen | 569
Zdravím,
v 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)
- jarks
- Člen | 94
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
.