Poslání dat z PHP do Javascriptu
- ragulin
- Člen | 58
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
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
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
- h4kuna
- Backer | 740
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)