Vlastní implicitní escapování
- zirafka
- Člen | 12
Zdravím ve spolek,
normálně používám fórum jako readonly, ale teď jsem se nějak zasekla a
tak jsem se odhodlala, že vyzkouším na vlastní kůži sílu legendární
nette komunity (-;
Používám Latte na generování jiného souboru, než je HTML/JS/CSS (konkrétně zdroják pro sazbu v LaTeXu). Takže bych si potřebovala vytvořit jiné dafault makro na escapování. Jak to udělám nejlíp/nejhezčejc/nejsprávnějc?
Předem díky za podpověď!
Žirafka
EDIT: Tak nakonec jsme metodou pokus omyl zjistili, že funguje toto:
<?php
NLatteMacros::$defaultMacros['$'] = '<?php echo %:macroDollar% ?>';
?>
Ale nemělo by náhodou fungovat i toto?
<?php
$latteFilter->escape = "myEscapeFunction";
$latteFilter->context = NLatteFilter::CONTEXT_NONE;
?>
Editoval zirafka (8. 3. 2011 13:43)
- Jan Tvrdík
- Nette guru | 2595
zirafka napsal(a):
Ale nemělo by náhodou fungovat i toto?
<?php $latteFilter->escape = "myEscapeFunction"; $latteFilter->context = NLatteFilter::CONTEXT_NONE; ?>
Ne, nemělo. $latteFilter->escape
a
$latteFilter->context
jsou pomocné funkce, jejichž hodnota se
přepíná za chodu. Udržují aktuální kontext a aktuální funkci použitou
pro escapování.
- zirafka
- Člen | 12
Díky za odpověď.
<?php
NLatteMacros::$defaultMacros['$'] = '<?php echo myEscapeFunction(%:macroDollar%) ?>';
?>
je tedy nejčistší cesta, jak to udělat, nebo to jde i elegantněji?
Jan Tvrdík napsal(a):
zirafka napsal(a):
Ale nemělo by náhodou fungovat i toto?
<?php $latteFilter->escape = "myEscapeFunction"; $latteFilter->context = NLatteFilter::CONTEXT_NONE; ?>
Ne, nemělo.
$latteFilter->escape
a$latteFilter->context
jsou pomocné funkce, jejichž hodnota se přepíná za chodu. Udržují aktuální kontext a aktuální funkci použitou pro escapování.
- Jan Tvrdík
- Nette guru | 2595
Tak jsem se na to díval ještě jednou a viděl bych to asi takto: LaTeX je
z pohledu Nette kontext, takže ideální by bylo nadefinovat nový typ
kontextu, což ale pořádně nejde, protože by to vyžadovalo podědit
LatteFilter
(to jde) a změnit private
metody na
protected
(to vyžaduje pull request do Nette). Pokud se rozhodneš
netvořit si vlastní kontext (což bude výrazně jednodušší), tak stačí
pomocí makra {contentType latex}
(uvedeného na začátku
šablony) resetovat kontext na NONE
a následně přeregistrovat
helper escape
v šabloně pomocí
$tpl->registerHelper('escape', myEscapeFunction')
.