Výstup pole do šablony jako JSON a funkce uvnitř

před 9 měsíci

tprochazka
Člen | 7
+
0
-

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)

před 9 měsíci

CZechBoY
Člen | 3360
+
+3
-

Chceš definovat funkci v jsonu? To jsem ještě neviděl… :-)
https://stackoverflow.com/…json-results

před 9 měsíci

tprochazka
Člen | 7
+
0
-

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)

před 9 měsíci

Felix
Nette Core | 917
+
0
-

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.

před 9 měsíci

tprochazka
Člen | 7
+
0
-

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í.

před 9 měsíci

tprochazka
Člen | 7
+
0
-

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.

před 9 měsíci

David Matějka
Moderator | 5897
+
0
-

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

před 9 měsíci

tprochazka
Člen | 7
+
0
-

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.