Výstup pole do šablony jako JSON a funkce uvnitř
- tprochazka
- Člen | 13
Generuji to JS kódu dynamicky JSON strukturu takto
foreach ($items as $itemKey => $item) {
$graphs[] = [
'id' => $itemKey,
'title' => $item->title . ' [' . $item->unit . ']',
'valueField' => $itemKey,
'valueAxis' => $item->unit,
];
}
A dostávám korektně espcapovaný JSON
[{"id":"water_temp","title":"Aktuální teplota teplé vody [°C]","valueField":"water_temp","valueAxis":"°C"},{"id":"...
Ale teď bych potřeboval dostam tam volání JS funkce, tedy
‚callback‘: function() {.....}
čekal bych něco jako
'callback' => new NoEscape("function() {}")
Ale nepodařilo se mi nikde nic takového najít. Jde to nějak?
Díky!
Editoval tprochazka (1. 10. 2018 9:54)
- CZechBoY
- Člen | 3608
Chceš definovat funkci v jsonu? To jsem ještě neviděl… :-)
https://stackoverflow.com/…json-results
- tprochazka
- Člen | 13
Není to JSON je to datová struktura v JS.
Pro lepší představu generuji konfiguraci grafů
https://www.amcharts.com/…ggle-graphs/
Něco jako
var chart = AmCharts.makeChart( "chartdiv", {
"type": "serial",
"theme": "light",
"legend": {
"equalWidths": false,
"periodValueText": "total: [[value.sum]]",
"position": "top",
"valueAlign": "left",
"valueWidth": 100,
"listeners": [ {
"event": "hideItem",
"method": legendHandler
}, {
"event": "showItem",
"method": legendHandler
} ]
},
"dataProvider": [ {
"year": 1994,
"cars": 1587,
"motorcycles": 650,
"bicycles": 121
Editoval tprochazka (1. 10. 2018 16:18)
- Felix
- Nette Core | 1196
Jestli to chapu spravne, tak by ti mohlo stacit v sablone vypnout escapovani.
{$graph|noescape}
Pripadne na to jit trochu oklikou a udelat si json filter.
latte.latteFactory:
setup:
- addFilter(datetime, Filters::json)
class Filters
{
public static function json($data): Latte\Runtime\Html
{
return new Latte\Runtime\Html(Nette\Utils\Json::encode($data));
}
}
V latte se Latte\Runtime\Html
uz neescapuje, protoze se
predpoklada, ze to nekdo sestavil takto zamerne.
- tprochazka
- Člen | 13
Díky. Není to ideální, protože pak už zase musím escapovat já všude sám. Možnost obalit konkrétní data ještě před vstupem do šablony do speciálního objektu, který by Latte říkal, že už jej nemá escapovat by zde byla podle mě ideální.
- tprochazka
- Člen | 13
Aha, tak ne, použití {$graph|noescape} vede na „Array to string conversion“, se pokusí do stránky vložit „graphs“: <?php echo $graphs /* line 89 */ ?>, tak to použít nelze :-( Musel bych to už rovnou skládat jako string.
- David Matějka
- Moderator | 6445
To opravdu není dobrý nápad vytvářet JS v PHP. posílej si přes JSON pouze ta data a callbacky a další věci (ideálně i konfiguraci, pokud není nějak dynamická) přidej až v JS
- tprochazka
- Člen | 13
Tak ona je tak jako tak celá ta stránka včetně JS generovaná PHP, celé
Latte je PHP.
Dělám vizualizaci grafů, ke kterým mám v aplikaci na jendom místě
metadata.
Z těchto metadat se pak v aplikaci dynamicky řeší jejích získávání,
ukldání do DB a zobrazení grafů.
Ta grafová knihovna má přesně daný způsob konfigurace.
Asi bych mohl vytvořit nějakou vlastní datovou strukturu, tu pak číst JS a
dynamicky skládat tu konfiguraci až v prohlížeči. Ale jen bych přesunul
to, co teď dělám v PHP jinam a vytvářel zbytečně další konfigurační
datovou strukturu.
Ale už jsem zjistil, že to není možné, Nette escapuje JS přímo pomoci
json_encode()
a tedy nejde s tím dělat něco nestandardního,
musím si to napsat sám.