Data z presenteru/modelu do js souboru
- AdamVyborny
- Člen | 36
Zdravím, jaký je nejlepší způsob jak dostat do JS souboru data z DB v Nette. Mužu nějak třeba v presenteru vygenerovat JSON do kterého si hodím data co vrátí dotaz na DB?
- Šaman
- Člen | 2666
Záleží na konkrétním použití. Na malé věci lze použít
data-
atribut a informace se předá v šabloně přímo přes
prvek, kterého se to týká.
Pokud si JS sám má načitat data (třeba u našeptávače), pak si zavolej handle metodu presenteru a zpátky si pošli odpověď jako JsonResponse.
Editoval Šaman (31. 5. 2016 12:46)
- AdamVyborny
- Člen | 36
Šaman napsal(a):
Záleží na konkrétním použití. Na malé věci lze použít
data-
atribut a informace se předá v šabloně přímo přes prvek, kterého se to týká.Pokud si JS sám má načitat data (třeba u našeptávače), pak si zavolej handle metodu presenteru a zpátky si pošli odpověď jako JsonResponse.
Mám v DB daterange, typ udalosti a autora udalosti, potrebuju to dostat angular JS kalendáře.
- AdamVyborny
- Člen | 36
Tak jsem to vyřešil zatím tak, že jsem si vytvořil další presenter a
prázdnou šablonu, v presnteru si vytvořím JSON v
renderShow()
takto:
$this->sendResponse(new Nette\Application\Responses\JsonResponse($jsonData));
a v js souboru ho následně takto čtu:
$.get('http://172.22.0.241/json-cal/show', function (data) {
vm.events = data;
});
Ale zaprvé mi to přijde jako strašná prasárna, za druhé mi vadí ta absolutní cesta a za třetí jsou ty data dostupná na URL i z browseru. Jsem v tomhle uplnej začátečník, může mě někdo nakopnout jak to dělat lépe? Díky
Editoval AdamVyborny (1. 6. 2016 15:39)
- homolka
- Člen | 3
Díky tomu, že má Latte Context-Aware Escaping# můžeš postupovat takto:
Presenter:
namespace App\Presenters;
use Nette;
class HomepagePresenter extends BasePresenter
{
public function renderDefault()
{
$this->template->hello = 'hello';
$this->template->world = 'world';
}
}
Šablona:
{block content}
<div id="out" />
{/block}
{block scripts}
{include parent}
<script>
var out = document.getElementById('out');
out.appendChild(document.createTextNode({$hello} + " " + {$world} + "!!!"));
</script>
{/block}
Tedy hodnoty proměnných šablony vyrenderuješ přímo v Latte v kontextu JS.
- AdamVyborny
- Člen | 36
Šaman napsal(a):
Pokud bez šablony, pak použij
handleShow()
místorender
. A jak psal CZechBoY, pro to odesílání existuje zkratka$this->sendJson($jsonData)
, která dělá totéž.
A pokud to dám přes handleShow()
bez šablony, pod jakou url
to můžu volat?
- Darkling
- Člen | 35
Tu url si do js předej přes data atribut. Takže v šabloně bude něco jako
<div data-url="{link show!}" id="idecko"></div>
V js pak
<script>
var url = $('#idecko').data('url'); // pokud používáš jquery
var url = document.getElementById('idecko').getAttribute('data-url'); // pure js
</script>
Výhoda řešení, pokud se změní doména nebo něco, vše bude stále fungovat.
- homolka
- Člen | 3
AdamVyborny napsal(a):
Šaman napsal(a):
Pokud bez šablony, pak použij
handleShow()
místorender
. A jak psal CZechBoY, pro to odesílání existuje zkratka$this->sendJson($jsonData)
, která dělá totéž.A pokud to dám přes
handleShow()
bez šablony, pod jakou url to můžu volat?
URL na handle vygeneruješ takto:
Presenter
$this->link('show!')
Latte
{link show!}