Jen jeden aktivni filtr?
- peci1
- Člen | 60
Ahoj, mam Nette 0.9. V BasePresenteru v beforeRender registruju filtry takto (Latte se registruje samo, ze?):
<?php
$this->template->registerFilter('TemplateFilters::netteLinks');
$this->template->registerFilter('TemplateFilters::relativeLinks');
?>
Problem spociva v tom, ze jakmile se v layoutu objevi jediny odkaz
nette:Default:foo,
vypda to, ze se pouzije jen netteLinks filtr a ostatni se neaplikuji, protoze mi
v prohlizeci vyskoci stranka s raw verzi sablony. Kde delam chybu? (Kdyz tam
nette: odkaz neni a smazu template cache, Latte jede normalne)
Jeste jedna vec – netteLinks jsem zkusil hlavne kvuli tomu, ze kdyz
mam
<script>onclick=„document.location.href=‚{plink
Default:}‘“</script>
, tak to Nette opravdu nehezky oescapuje a odkaz je naprosto nepouzitelny. Jak
to resit? Vsechny mozne kombinace {,{!,{= a tak jsem zkousel, ale bud je spatne
escapovani nebo parse error…
A ted koukam, ze znacka <script> na foru taky nefunguje…
Diky moc za rady
- Ondřej Mirtes
- Člen | 1536
Filtry se registrují takto: https://forum.nette.org/…iewtopic.php?…
A to oescapování uvnitř Javascriptu je správně, viz https://phpfashion.com/…vni-prirucka
- peci1
- Člen | 60
Diky, kdyz filtr registruju v te funkci, jak radi David, tak to je ok. Asi jsem spatne pochopil „beforeRender může obsahovat například společné nastavení filtrů pro všechny vykreslovače a nastavení společných proměnných pro šablony všech vykreslovačů.“ z zivotniho cyklu presenteru. Prislo by mi fajn, kdyby Nette na takhle spatne registrovany filtr umelo upozornit :)
A s tim escapovanim nesouhlasim. Ano, jako retezec v Javascriptovem kodu je to oescapovane spravne (az na to, ze se kolem pridaji uvozovky!), ale clovek by cekal, ze at uz pouzije {plink Default:} kdekoli, vzdy mu to tam podle kontextu vygeneruje spravny odkaz. Nebo se pletu?
- jasir
- Člen | 746
Ono je to proto, že v rámci js se escapuje (také) pomocí
json_encode
. A ten dává okolo stringů uvozovky, naopak okolo
čísel ne. Ono je to výhodné a imho správné chování – při přenosu
proměnných z php do js se nemusíš starat o otravné uvozovky.
<?php $hodnota = 'ahoj';?>
<script>
a = {$hodnota}; //zde se vygeneruje a = "ahoj";
</script>
<?php $hodnota = 333;?>
<script>
a = {$hodnota}; //a zde a = 333;
</script>
Editoval jasir (11. 9. 2009 15:42)
- David Grudl
- Nette Core | 8229
Je to skutečně napoprvé matoucí, ale těžko řešitelné jinak. V JavaScriptu (a ostatně i v PHP) se totiž jinak zapíše řetězec v jednoduchých a jinak ve dvojitých uvozovkách.
s = 'It\'s five o\'clock! 5,25" media';
s = "It's five o'clock! 5,25\" media";
Nějaké detekce uvozovek a vůbec řetězců uvnitř JavaScriptu jdou myslím hodně nad rámec frameworku. (programovat JavaScriptový parser je možná složitější než celý LatteFilter).