Poslání dat z PHP do Javascriptu

ragulin
Člen | 58
+
0
-

Ahoj, snažím se tu asi tři hodiny něco vymyslet a už jsem zjistil, že to ani nepotřebuji. Nicméně protože mě to zajímá, tak bych potřeboval poradit.

Potřebuji dostat data z PHP do JS. Zkoušel jsem poslat data takto:

public function beforeRender() {
$data[] = ['test' => "hodnota"]

$this->template->data = $data;

$this->payload->data = $data;
$this->Payload->send();

echo($data) // a nebo echo(json_encode($data))

}

U toho payload se mi povedlo, že jsem dostal ta data do DOM, ale naopak to zase zablokovalo kompletně vykreslení zbytku stránky.

V JS jsem je zkoušel přebrat přes knihovnu Ajax Nette Dobeš, přes jQuery a přes funkci popsanou zde:
https://stackoverflow.com/…o-javascript

Ale vše bez jakéhokoliv úspěchu. Přitom takováhle prkotina musí jít nějak jednoduše, ne? To je přeci základ programování, tak nevím, jestli jsem tolik neschopný, nebo kde je problém.

Jeden z přikladů řešení:

$.ajax({
    type: 'GET',
    dataType: "json",
    data: data,
    url:'http://app.local/upload/?op=100731197&type=expedice',    //zde jsem zkoušel dát ještě 'HomepagePresenter'.php
    success: function(data)
    {
        try {
            data = JSON.parse(data);
        }catch(e) {}
        console.log(data);
    }
});

Ve všech návodech na internetu je popsáno jak dostat GET a POST hodnoty z DOM, ale zde prostě potřebuji dostat data z PHP do JS ideálně přes AJAX, ještě lépe s nějakou Nette utilitou.

Jak na to? Případně by mi stačilo poradit, co hledat
p.s. vím, že asi objevuji kolo (:

Lukes
Silver Partner | 68
+
+1
-

Podle mě to stačí poslat do latte šablony:

<script type="text/javascript">
    var js_variable = {$data}; // Bez uvozovek!!!
</script>

Kde $data je proměnná v Latte a díky kontextovému escapování se tam provolá json_encode(). Navic to nemusíš posílat přes AJAX, pokud to vyloženě nepotřebuješ… Samozřejmě postupu je více, ale tohle je takovej nejvíce přímočarý.

h4kuna
Backer | 740
+
+2
-

Trošku lepší způsob je

<script id="conf" type="text/json">
{
  "foo" = "123",
  "color" = "purple"
}
</script>
<script src="code.js"></script>

Konfiguraci ve stránce je možné zachovat, jen je potřeba změnit typ obsahu značky SCRIPT na text/json. JSON není kód, nelze spustit a browser ho tedy při ‚unsafe-inline‘ nemusí blokovat. V code.js se pak k hodnotám dostaneš takto:

var c = document.getElementById('conf');
var d = JSON.parse(c.textContent || c.innerHTML);

Zdroj, bod 19

CZechBoY
Člen | 3608
+
+1
-

@h4kuna Čím si pomůžu když stejně musím ten json parsovat?

h4kuna
Backer | 740
+
0
-

Je to složitější něž se ptát na to parsování. Můžeš odebrat javascript z DOMu a nastavit striktnější CSP. Viz body 17, 18 https://www.michalspacek.cz/…tu-pixdevday

JSON není spustitelný a na konfiguraci dostačující.

EDIT: ač projekty používají latte, tak už jsem viděl zanesený XSS, právě špatným použitím nebo špatně napsaným makrem nebo filtrem.

Editoval h4kuna (30. 11. 2020 12:10)