Jak ověřit Latte syntax, zachytit všechny chyby před include
- ludek
- Člen | 83
Zdravím, potřeboval bych před vložením Latte šablony ověřit, jestli
je správně napsaná,
abych v případě syntaktické chyby zabránil zobrazení
500 Server Error
(ParseError, syntax error na DEV stroji).
Šablona
{if $syntaxOK}
{include $page} {* << $page je .latte soubor, jestli má vadnou syntax, nenačítat a zobrazit chybu *}
{else}
CHYBA!
{/if}
Napadlo mě jen zkusit to předem zkompilovat:
Presenter:
$page = $this->context->parameters['wwwDir'].'/pages/page1.latte';
$this->template->syntaxOK = TRUE;
$latte = new \Latte\Engine;
try {
$test = $latte->compile($page); //< jde to zkompilovat?
} catch (\Exception $e) {
$this->flashMessage('<strong>CHYBA:</strong> (' . $e->getMessage() . ').', 'danger');
$this->template->syntaxOK = FALSE;
}
funguje to, ALE některé chyby zachytím, některé ne. Např.
{<něco>
vyhodí výjimku
"Malformed macro"
{<něco>}
projde a skončí to až na {include}
"syntax error, unexpected '<'"
, to znamená 500 Server
Error.
→ source
file: echo LR\Filters::escapeHtmlText(<'něco'>)
To druhé prostě projde přes compile()
a spadne to až na
{include $page}
při renderování šablony.
Můžete mi prosím poradit, jak zachytit všechny chyby v Latte šabloně dřív než bude includovaná?
EDIT: použité verze: PHP 7.3.6
,
nette/application v3.0.0
, latte/latte v2.5.1
Díky.
Editoval ludek (27. 9. 2019 13:17)
- ludek
- Člen | 83
Možné řešení:
Spadne to na render
metodě. Takže jednou se zachytává
výjimka a jednou ParseError
.
$page = $this->context->parameters['wwwDir'].'/pages/page1.latte';
$latte = new \Latte\Engine;
$syntaxOK = TRUE;
try {
$test = $latte->compile($page); // jde to zkompilovat?
} catch (\Exception $e) {
$this->flashMessage('<strong>CHYBA:</strong> (' . $e->getMessage() . ').', 'danger');
$syntaxOK = FALSE;
}
if ($syntaxOK) {
try {
$test = $latte->renderToString($page); // jde to vyrenderovat?
} catch (\ParseError $e) {
$this->flashMessage('<strong>CHYBA:</strong> (' . $e->getMessage() . ').', 'danger');
$syntaxOK = FALSE;
}
}
$this->template->syntaxOK = $syntaxOK;