Jak vypnout context Aware Escapovani

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

Zdravím,
napsal jsem si vlastní makro (image) které když použiji takto:

{image 'images/test.gif'}
<img src="{image 'images/test.gif'}" />
<a onmouseover="DoSomething('{image 'images/test.gif'}');">xxx</a>

Dá tento výsledek:

/www/xx/images/test.gif
<img src="/www/xx/images/test.gif" />
<a onmouseover="DoSomething('&quot;\/www\/xx\/images\/test.gif&quot;');"></a>

První dva řádky jsou OK, ale ten poslední je špatně. Co se s tím dá dělat?

castamir
Člen | 629
+
0
-

Vykřičník nepomůže?

{!image 'images/test.gif'}
Jan Tvrdík
Nette guru | 2595
+
0
-

Nemělo by to být správně takto?

<a onmouseover="DoSomething({image 'images/test.gif'});">xxx</a>
frosty22
Člen | 373
+
0
-

Ten vykřičník by měl pomoci, jenom menší dodatek, používám obdobně, leč osobně bych spíše preferovat vlastní helper než-li makro na toto.

Editoval frosty22 (21. 3. 2013 23:27)

esorimer
Člen | 114
+
0
-

castamir napsal(a):

Vykřičník nepomůže?

{!image 'images/test.gif'}

Nepomůže, to skončí chybou Parse Error
syntax error, unexpected test.gif (T_CONSTANT_ENCAPSED_STRING), expecting ‚,‘ or ‚;‘

135:        <img src="<?php echo image 'test.gif' ?>" />

Jan Tvrdík napsal(a):

Nemělo by to být správně takto?

<a onmouseover="DoSomething({image 'images/test.gif'});">xxx</a>

To taky nepomůže, pořád se to vypíše špatně. Jo a ted jsem si všim že to dělá stejnou chybu i s normálním linkem a ani tam nemusí být volání funkce …:

{link Homepage:}
    <a onmouseover="{link Homepage:}">xxx</a>
/www/
<a onmouseover="&quot;\/www\/&quot;">xxx</a>

PS: Jdou vám tu na fóru hodiny o hodinu napřed, žeby chybné locales? :) Beru zpět, měl sem blbě nastavené hodiny na svém PC, tak mi JS ukazoval že jsem vložil příspěvěk před hodinou … o:-)

Editoval esorimer (22. 3. 2013 8:31)

Jan Tvrdík
Nette guru | 2595
+
0
-

To taky nepomůže, pořád se to vypíše špatně. Jo a ted jsem si všim že to dělá stejnou chybu i s normálním linkem

Popsané chování je v pořádku. Proč ho považuješ za chybné?

enumag
Člen | 2118
+
0
-

Na ten inline JS se vybodni, url dej normálně do atributu href a tomu odkazu přidej nějakou třídu, podle které tam pak v samostatném JS souboru přidáš tu událost.

esorimer
Člen | 114
+
0
-

Jan Tvrdík napsal(a):

To taky nepomůže, pořád se to vypíše špatně. Jo a ted jsem si všim že to dělá stejnou chybu i s normálním linkem

Popsané chování je v pořádku. Proč ho považuješ za chybné?

Za chybný považuji výsledek, neříkám že je to bug nette. Ale třeba vůbec nechápu kde se tam > bere to &quot; V prvním ani druhém příkladu použití se žádné uvozovky nevrací.

Pardon, asi jsem si stál na vedení. Ono je to fakt dobře :) Nedošlo mi že zápis
<a onmouseover=„DoSomething(&quot;\/www\/&quot;)“>xx</a> je validní zápis JS. Pořád jsem tam chtěl mít místo &quot; jednoduchou uvozovku.

Asi sem fakt potřeboval lekci z JavaScriptu a nez Nette :D

Editoval esorimer (22. 3. 2013 10:47)

enumag
Člen | 2118
+
0
-

Když je href atribut jiný, tak data-* atribut.

Pozn. nečisté je už to použití atributu on*.

Editoval enumag (22. 3. 2013 9:45)

Filip Procházka
Moderator | 4668
+
0
-

Správně například takto.

<a href="{image 'images/test.gif'}" onmouseover="DoSomething(this.href);">xxx</a>

Do javascriptových attributů je třeba hodnoty validně escapovat, Nette se tedy chová správně, ty to jen špatně používáš.

Btw, tohle makro image neznám. Pokud je to tvé vlastní makro, ještě je tu možnost, že jsi ho implementoval špatně.

esorimer
Člen | 114
+
0
-

enumag napsal(a):

Když je href atribut jiný, tak data-* atribut.

Pozn. nečisté je už to použití atributu on*.

Myslím že to není až tak nečisté, ale souhlasím že použití data-* by bylo lepší, kdybych to psal v HTML5. Jenže kvůli zpětné kompatibilitě a kvůli tomu, že přepisuju do nette starý projekt a nechce se mi přepisovat tuny JS kódu (který je sice starý a ošklivý, ale spolehlivě funguje) potřebuji co potřebuji.

Filip Procházka napsal(a):

Správně například takto.

<a href="{image 'images/test.gif'}" onmouseover="DoSomething(this.href);">xxx</a>

Do javascriptových attributů je třeba hodnoty validně escapovat, Nette se tedy chová správně, ty to jen špatně používáš.

Jak mám tedy Nette použít, abych vypsal do prohlížeče tento html kód?

<a href="neco.php" onmouseover="DoSomething('/www/xx/images/test.gif')">xxx</a>

Btw, tohle makro image neznám. Pokud je to tvé vlastní makro, ještě je tu možnost, že jsi ho implementoval špatně.

Je to mé vlastním akro, ale jak jsem už psal, stejně se to chová i s makrem {link} …

PS: Opravdu nepotřebuji učit JavaScript nebo zásady správného kódování, děkuji vám za snahu, ale učím se Nette a potřebuji poradit s Nette.

PSS: A když už se to escapuje, proč je tam na začátku a na konci to &quot;? Když budu chtít předat do JS makrem jakoukoliv hodnotu tak se obalí do &quot;?

Editoval esorimer (22. 3. 2013 10:38)

esorimer
Člen | 114
+
0
-

Tak vyřešeno, viz můj příspěvek č. 8. Díky!