jQuery Datatables a Nette
- Croc
- Člen | 270
Zdravím,
mám takový problém. Vypisuji DB tabulku do jQuery Datatables. Před tabulku
mám umístěný form s jedním polem, pomocí kterého vkládám záznamy do
té tabulky. Problém je, že nevím, jak po odeslání formuláře a vložení
nového záznamu do DB, zavolat v AJAXu reload tabulky.
Tabulku mám ve snippetu a formulář je jako komponenta:
Šablona:
<div style="padding-top: 10px;">
{control addForm}
</div>
{snippet table}
<div style="padding-top: 50px;">
<table id="data">
<thead>
<th>ID</th>
<th>Name</th>
</thead>
<tbody></tbody>
</table>
</div>
{/snippet}
<script type="text/javascript">
$(document).ready(function() {
var table = $('#data').DataTable( {
"sAjaxSource": {link dataJson!},
"aoColumns": [
{"mData": "id_item"},
{"mData": "name"}
]
});
/*
table.ajax.reload(); // takto by se měl provést reload
*/
});
</script>
Nevíte jakým směrem se vydat?
Pokud po odeslání formuláře refreshnu snippet, tak se mi zobrazí prázdná tabulka, protože se neprovede načtení dat z databáze.
Editoval Croc (27. 7. 2016 8:57)
- CZechBoY
- Člen | 3608
Ten formulář se odesílá ajaxem? Tak potom si pomocí nette.ajax vytvoř
callback po úspěšným odeslání požadavku, který překreslí tu
tabulku.
Něco ve stylu
$.nette.ext('prekreslit_tabulku', {
init: function() {
this.ext('snippets').after(function ($el) {
table.ajax.reload();
});
}
});
- akadlec
- Člen | 1326
imho pokud chceš používat datatables tak bys měl uvažovat trochu jinak. To že překreslíš snippet s celou tabulkou a jejím initem je tak trochu proti filozofii tohohle gridu. Tam bys měl pracovat na JS úrovni a reload tabulky apod řešit tam. viz třeba jak to používám tady
- Croc
- Člen | 270
No to jsem se pokoušel, ale vždy jsem dospěl jen k tomu, že se mi po postnutí formu vrátila (v poždavku – nikoliv překreslila) prázdná tabulka, nebo se vrátil jen JSON s novými daty, ale tabulka se nepřekreslila. Do db se hodnota zapsala, ale pak jsem nedokázal udělat to, aby se buď přidaná hodnota přidala do tabulky, nebo se celá tabulka reloudnula pomocí JS (s novým dotazem do DB).
Bohužel mě tlačí čas :( Takže to potřebuji nějak udělat, aby se po přidání nové hodnoty aktualizovala tabulka bez refreshe stránky…
EDIT:
Tak jsem zapřemýšlel a vyřešil jsem to takto:
šablona:
{block content}
{control addForm}
<div style="padding-top: 50px;">
<table id="data">
<thead>
<th>ID</th>
<th>Name</th>
</thead>
<tbody></tbody>
</table>
</div>
{/block}
{block script}
<script type="text/javascript">
$(document).ready(function() {
var table = $('#data').DataTable( {
"sAjaxSource": {link dataJson!},
"aoColumns": [
{"mData": "id_item"},
{"mData": "name"}
]
});
$("#button").click(function(e){
e.preventDefault();
var $el = $(this);
$.nette.ajax({
type: "POST",
url: {link addRecord!},
data: {'record': $('#addName').val()},
success: function(payload) {
table.row.add( {
"id_item": payload.newRow.id_item,
"name": payload.newRow.name
} ).draw();
}
});
});
});
</script>
{/block}
Při odeslání formuláře zavolám pomocí ajax handle na přidání záznamů a ten pak pošlu zpět s doplněným ID přes payload a pouze ten přidám do zobrazené tabulky. Takže ani neproběhne zbytečné načtení celé tabulky znovu.
Editoval Croc (27. 7. 2016 19:29)
- GEpic
- Člen | 566
Nakonec stejně využiješ nějaký grid přímo pro Nette, který má již zabudovanou ajax podporu, protože načíst veškerá data do stránky a na ně aplikovat ‚ksicht‘ v podobě jquery datatable (navíc jQuery… eh…) není úplně ideální. :D
https://componette.org/search/grid
stačí si jen vybrat. :)
Editoval GEpic (28. 7. 2016 1:15)
- akadlec
- Člen | 1326
@GEpic: nesouhlasím. A jak si myslíš že probíhá ajaxifikace těch „skvelých“ nettích gridů? DataTables je hodně elegantní a pokud plně využiješ jeho api tak se s ním pracuje snad i lépe než s klasickými gridy. Navíc DataTables je jako ext do nette, jen je stále ve fázi vývoje.
- GEpic
- Člen | 566
akadlec napsal(a):
@GEpic: nesouhlasím. A jak si myslíš že probíhá ajaxifikace těch „skvelých“ nettích gridů? DataTables je hodně elegantní a pokud plně využiješ jeho api tak se s ním pracuje snad i lépe než s klasickými gridy. Navíc DataTables je jako ext do nette, jen je stále ve fázi vývoje.
Jo, a použil si někdy jQuery Datatables na 2+ tisících záznamech? Pokud to použiješ na 50ti záznamech, tak to je ho*no a nepotřebuješ žádný grid, protože v tolika záznamech se zorientuje i kret*n. Ale pokud chceš použít tabulku na víc záznamů, už vidím jak posíláš do prohlížeče např. 2, 5, 10 tis. záznamů. Což je v praxi úplně normální.
Já na nich také začínal, takže vím o čem mluvím.
Editoval GEpic (29. 7. 2016 10:14)
- artemevsin
- Člen | 61
@GEpic https://datatables.net/…er_side.html – datatables se dá
použit i na více než 2000+ záznamů. Stačí si napsat jednoduchý script,
který to bude filtrovat, řadit atd na serveru a vracet jen potřebné
řádky.
@Croc jinak zkus to udělat tak, že po odeslání formu překreslíš
snippet, který bude obsahovat <script>table.ajax.reload()</script>.
Tj. při načtení stránky snippet bude prázdný, ale po překreslení tam
budeš mít ten reload
edit: samozřejmě by bylo správnější a hezčí napsat extension pro
nette.ajax, který toto obstará, místo toho, aby js byl takto v kódu, ale to
mi přijde jako zbytečný overhead.
Když toho js budeš mít více, tak bych udělal nějakou funkci mojeFunkce(),
která bude obsahovat potřebný kód (i třeba včetně toho reloadu) a ve
snippetu pak zavoláš tuto funkci
Editoval artemevsin (1. 8. 2016 9:38)
- Croc
- Člen | 270
@artemevsin Já už jsem to vyřešil, viz můj poslední příspěvek. Myslím že i docela elegantně a bez snippetu.
@GEpic Ono ani nemusíš posílat všechny záznamy najednou. Zatím jsem to nezkoušel, ale co jsem zahlídl tak datatables lze definovat tak, aby nenačítal všechny záznamy, ale jen potřebné na zobrazení dle flitrů a stránky.
- GEpic
- Člen | 566
Croc napsal(a):
@artemevsin Já už jsem to vyřešil, viz můj poslední příspěvek. Myslím že i docela elegantně a bez snippetu.
@GEpic Ono ani nemusíš posílat všechny záznamy najednou. Zatím jsem to nezkoušel, ale co jsem zahlídl tak datatables lze definovat tak, aby nenačítal všechny záznamy, ale jen potřebné na zobrazení dle flitrů a stránky.
Ve finále tedy napíšeš něco, co už existuje, navíc vždy musíš tabulku vykreslit ručně. Mě to prostě vzhledem k dostupným zdrojům přijde jako zbytečná práce navíc (a né ta užitečná práce navíc, která šlechtí, ale ta otročina). Protože budeš muset tabulku co tabulku definovat, poté sepsat JS nebo jQuery na inicializaci té tabulky, nadefinovat si filtry, atp. pokaždé zvlášť.
- akadlec
- Člen | 1326
@GEpic sorry ale tady trepeš blbosti. To jako když použiju grid co je postaven čistě na php tak jej nemusím definovat?
Pro datatables sem si udělal extension, stejně udělám komponentu kde nadefinuju sloupce tabulky, filtry atd. a vše se mi udělá „samo“ takže nějaké definice js, jquery atd per taublka je blbost. Toto by se dalo napsat i o těch klasických gridech pokud bys nepoužil extension…oh wait to by ten grid vůbec neexistoval.