Deklarace proměnné a předání do javascriptu

BuMoRi
Člen | 109
+
0
-

Ahoj, v určitém místě v šabloně chci použít deklaraci proměnné a tu si předat do javascriptu. Lze to nějak? Vypisuje Undefined variable.

MajklNajt
Člen | 471
+
-1
-

Ahoj, pozrel si do výsledného HTML, čo ti to vygeneruje? {var …} ti deklaruje premennú pre použitie v šablóne, nie pre JS. Ak chceš tú premennú posunúť javascriptu, mal by si ju vypísať takto nejako:

{var $foo = "bar"}
<script>
var fooForJS = {$foo};
</script>

Pozor na to, aby si ju pre JS nedeklaroval s úvodzovkami, latte si ich tam pridá samo vďaka context-aware

BuMoRi
Člen | 109
+
0
-

No právě tento kód tam mám, a ten mi píše Undefined variable foo.
Nicméně v pátrání jsem pokročil v tom, že toto se děje, když proměnnou deklaruju v {block content} a předávám v {block scripts}. Pokud bych jí deklaroval v {block scripts}, tak to funguje. Ale to je mi nanic :(.

MajklNajt
Člen | 471
+
0
-

tak to potom vyzerá na problém poradia – ak skript, ktorý tú premennú potrebuje, spúšťaš (inkluduješ/vypisuješ) skôr, ako je zadefinovaná, potom logicky vyhadzuje Undefined variable. Skús ten skript spustiť až na udalosť DOM load/ready – napr. v jQuery to vložiť do $('document').ready( .... );

BuMoRi
Člen | 109
+
0
-

jj, to samozřejmě spouštím až po $(document).ready(function()

MajklNajt
Člen | 471
+
0
-

pozrel si si vygenerované HTML? vidíš tam tú deklaráciu? keď spravíš:

{var $foo = "bar"}
<script>
var fooForJS = {$foo};
alert(fooForJS);
</script>

vyskočí ti ten alert s premennou?

BuMoRi
Člen | 109
+
0
-

Teď nechápu: myslíš jako že v HTML má být vidět deklarace proměnný $foo? Tak ta tam vidět neni.
Když přeskočim Notice, tak fooForJS je null.
Pokud proměnnou $foo deklaruju v {block sripts}, tak v HTML taky vidět není, ale vše je OK, fooForJS vypíše „bar“.

MajklNajt
Člen | 471
+
0
-

v HTML to MUSÍ byť vidieť, ako ináč by si to predal tomu javascriptu?? …môžeš sem prilepiť obsah @layout.latte, že kde includuješ scripts a kde includuješ content?

MajklNajt
Člen | 471
+
0
-

Sorry, až teraz som si všimol, že tebe vyhadzuje undefined variable foo už Nette, ja som celý čas v tom, že ti to vyhadzuje javascript.

Ono to takto asi nerozchodíš, ak premennú definuješ v inom bloku ako používaš, tie bloky sa (myslím) kompilujú do PHP ako callbacky, čiže nevidia premenné z iných blokov…

BuMoRi
Člen | 109
+
0
-

No je mi jasný, že tam musim dělat nějakou totální kravinu, ale fakt nevim…

@layout.latte

<!DOCTYPE html>
<head>
	<!-- Bootstrap -->
	<link href="{$basePath}/css/bootstrap/bootstrap.min.css" rel="stylesheet" media="screen">

	<!-- Custom Template Styles -->
	<link href="{='css/style.css'|asset}" rel="stylesheet" media="screen">
</head>

<body>
	{include content}

	{block scripts}
		<!-- ======================= JQuery libs =========================== -->
		<script type="text/javascript" src="{$basePath}/js/jquery.1.8.2.js"></script>
		<!-- Custom -->
		<script type="text/javascript" src="{$basePath}/js/custom.js"></script>
    {/block}
</body>
</html>

default.latte

{block content}
	<footer id="menu-contact">
        {var $foo = "bar"}
	</footer>
{/block}

{block scripts}
	{include parent}
	<!-- přehrávání audia -->
	<script type="text/javascript" src="{$basePath}/js/audio.js"></script>
	<script>
		$(document).ready(function() {
			var fooForJS = {$foo};
			alert(fooForJS);
		});
	</script>
{/block}
BuMoRi
Člen | 109
+
0
-

No myslel jsem si že je to těma blokama, poslal jsem to dřív, než jsem si přečet poslední příspěvek. Každopádně díky za pomoc.
Já teda ještě napíšu, čeho chci vlastně docílit a myslim že mi pomůžete najít lepší řešení.
Chci vypsat zkratku článku, jen 100 znaků, plain text (tzn. s využitím makra striptags). A klasicky tlačítko „More“, ale aby už text byl včetně tagů z wysiwyg editoru. Proto jsem ho chtěl uložit do proměnný a z ní ho přepsat místo původní zkratky. Krom této varianty mě napadlo ještě si znovu ajaxem článek vyvolat z DB, a pak mám řešení, že si ho vypíšu ještě jednou, do skrytého divu a pomocí JS si z něj změním zkratku na celý článek. Toto funguje OK, jen se mi to zdá trochu kostrbatý. Kdyby měl někdo lepší nápad, jak toto vyřešit, budu rád za jakoukoliv radu.