Jen jeden aktivni filtr?

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

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
+
0
-

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
+
0
-

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
+
0
-

Eskapování v js automaticky doplní uvozovky kde je potřeba.
Ten odkaz tam zkus takto:

<a href="{plink Default:}" onclick="document.location.href={plink Default:};return false;">Odkaz</a>
peci1
Člen | 60
+
0
-

Diky, ted uz je mi jasne, kde byla chyba. Nesmim za document.location.href= psat apostrofy. Prijde mi to matouci:

<a href=„{plink }“>

document.location.href={plink}

V HTML uvozovky pisu, v JS ne… mozna trochu nekonzistentni chovani…

Editoval peci1 (11. 9. 2009 15:08)

jasir
Člen | 746
+
0
-

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
+
0
-

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).