Jak převzít pole v šabloně do javascriptu?

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

Zdravím, chci se zeptat jak převzít pole v šabloně do javascriptu ve Smarty jsem používal

{$Array|@json_encode}

Ja na to u Nette?

Filip Procházka
Moderator | 4668
+
0
-
$template->registerHelper('json', function ($array) {
	return Nette\Utils\Json::encode($array);
});

v šabloně

{$array|json}

Editoval HosipLan (13. 7. 2011 10:40)

breeta
Člen | 68
+
0
-

Mě ten helper jaksi divně přebírá to pole, když vypíšu v javascriptu přes for tak mě to hodí tohle:

[ " 0 6 . j p g " , " 0 9 . j p g " , " 0 8 . j p g " , " 1 0 . j p g " , " 0 7 . j p g " , " 1 1 . j p g " ]

místo 06.jpg 09.jpg, atd.

Editoval breeta (13. 7. 2011 11:29)

Filip Procházka
Moderator | 4668
+
0
-

Zajímavé, pokud to jen potřebuješ vypsat v Javascriptu, tak mám pro tebe novinku :)

<script type="text/javascript">
var promenna = {$array};
</script>

Zkus to takhle :)

ic
Člen | 430
+
0
-

respektive tohle:

<script type="text/javascript">
var promenna = {!$array};
</script>

pokud tam má být ten json_encode

redhead
Člen | 1313
+
0
-

@ic: Dle dokumentace to není nutné.

ic
Člen | 430
+
0
-

redhead napsal(a):

@ic: Dle dokumentace to není nutné.

Pokus omyl na mojí verzi ‚2.0-dev released on 2011–07–01‘ mě vyšlo, že…
pro běžný třeba řetězec ne, ale pokud už asociativní pole projde php funkcí json_encode(), tak ho tohle escapování jen zdemoluje
viz

data = {!$data}; //data = [{"nazev":"neco","www":"http:\/\/www.neco.cz", ...
//kdežto
data = {$data}; //data = "[{\"nazev\":\"neco\",\"www\":\"http:\\\/\\\/www.neco.cz\\\/\", ...

zvlášť teda ta adresa je lol

Milo
Nette Core | 1283
+
0
-

Pokud to pole proženeš přes json_encode(), předáš do šablony a použiješ ve <script> tagu tak se to chová správně, protože to escapuje řetězec aby byl bezpečně použitelný. Ale pokud předáš do šablony asociativní pole, automaticky je z něj json (objekt).

// Presenter
public function renderNeco()
{
	$this->template->pole = array(
		'key' => 'val',
		'xxx' => 'yyy',
	);
}
<!-- Šablona -->
<script>
var pole = {$pole};	// var pole = {"key":val,"xxx":yyy};
</script>

Editoval Milo (13. 7. 2011 21:17)

ic
Člen | 430
+
0
-

Milo napsal(a):

Pokud to pole proženeš přes json_encode(), předáš do šablony a použiješ ve <script> tagu tak se to chová správně, protože to escapuje řetězec aby byl bezpečně použitelný. Ale pokud předáš do šablony asociativní pole, automaticky je z něj json (objekt).

Teď se na to dívám… máš pravdu díky.
To jsem úplně zbytečně používal tu json_encode(), když ona se použije sama a ani nemusím nic dělat… někdy je to až příliš snadné XD