problém s makry v javascriptu

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

Cao, potřeboval bych poradit, jak zabudovat makro do javascriptu, který je přímo v šabloně.
Zde jsem si přečetl
https://doc.nette.org/cs/quickstart#…
jak hodit makro do javascriptu, ale pomoci double syntaxe mi to nejde :(

zde je kod

<script>
 <script type="text/javascript" n:syntax="double">
         document.getElementById('link').href = "javascript:preview('{{$basePath}}/upload/{{$picture->nazev}}')";
</script>

</script>

zkousel jsem ruzne kombinace metodou pokus omyl a zadna mi nejde, pokud misto maker dám konkretni hodnoty, tak script funguje normalne.

Dekuju vsem za pripadné rady

bojovyletoun
Člen | 667
+
0
-

syntax double v tvém příkladu mi šlape v pořádku- máš dostatečně nové nette? a nějou chybovou hlášku to háže nebo kde jechyba?

Editoval bojovyletoun (27. 12. 2010 22:51)

o.x.i
Člen | 7
+
0
-

verzi mam 2.0, zadnou chybovou hlasku to nehaze, jenom nefunguje ten javascript, kdyz si otevre zdrojovy kod, tak by tam melo byt neco takoveho:

<script>
 document.getElementById('link').href = "javascript:preview('/sem2/www/uploadedData/Tulips.jpg')";
</script>

ale s double syntaxi mi to udela tohle:

<script>
document.getElementById('link').href = "javascript:preview('"\/sem2\/www"/uploadedData/"Tulips.jpg"')";
</script>

Editoval o.x.i (27. 12. 2010 23:01)

o.x.i
Člen | 7
+
0
-

uz sem to vyresil, stacilo zamezit escapovani znaku, takze k te double syntaxi doplnit vykrcnik

redhead
Člen | 1313
+
0
-

Není to double syntaxí, je to escapováním znaků pro javascript.

Všechny stringy se escapují podle JS a přidávají se uvozovky. Tvůj příklady by šel (s escapováním) zapsat jako:

preview({{$basePath}}+'/upload/'+{{$picture->nazev}})
nebo
preview({{=$basePath.'/upload/'.$picture->nazev}})

Editoval redhead (27. 12. 2010 23:08)

jtousek
Člen | 951
+
0
-

Ještě dodám, že je lepší mít javascripty v externím souboru. Samozřejmě v tomto případě JS potřebuje nějaká data navíc k čemuž se používají datové atributy HTML5.

o.x.i
Člen | 7
+
0
-

dik, ja to nakonec vyresil takto:

<script>
 document.getElementById('link').href = "javascript:preview('{{!$basePath}}/upload/{{!$picture->nazev}}')";
</script>

a funguje

Editoval o.x.i (27. 12. 2010 23:23)

bojovyletoun
Člen | 667
+
0
-

myslím, že teď jsi právě pohřbil bezpečnostní featuru frameworku, podle mě správné řešení je od redhead druhé

na1k
Člen | 288
+
0
-

Já zase preferuju to první (or redhead). Nemusím totiž přemýšlet jestli se to escapuje, jestli uvozovky nebo co se děje. Prostě si jen pamatuju, že se makro chová stejně jako JS proměnná.

Šaman
Člen | 2635
+
0
-

Jen bych dodal, ža kromě double syntaxe u maker můžeš používat i způsob jednoduchých závorek a tam kde nechceš aby byly chápány jako makro, tak tam dáš za otevírací závorku mezeru.

<script>
{makro}
{ něco ve složených závorkách, třeba fce v JS}
</script>

Taky si myslím, že JS patří mimo šablonu, ale jak pak řešíte {$basepath} a {plink}? Já jsem to musel přepsat na absolutní cesty, ale to se mi vůbec nelíbí. Pokud se přesunu na server, kde budu k aplikaci přistupovat třeba jako server.name/www/ tak mi to nebude fungovat.

Editoval Šaman (28. 12. 2010 13:06)

Lopata
Člen | 139
+
0
-

Buď webloader a nebo kompromis:

<script type="text/javascript">
	var link = {link X:y $z};
</script>
<script type="text/javascript" src="{$basePath}/js/js.js"> </script>