jQuery Datatables a Nette

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Croc
Člen | 270
+
0
-

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
+
0
-

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();
		});
	}
});
Croc
Člen | 270
+
0
-

Přesně, odeslám pomocí ajax, ale v JS a AJAXu jsem úplná lama.
Díky za tip. Můžu se zeptat co je přesně myšleno textem prekreslit_tabulku?? Respektive co tam má být?
A místo snippets má být název snippetu který chci překreslit?

Díky

CZechBoY
Člen | 3608
+
0
-

@Croc prekreslit_tabulku je jen unikátní název extension pro nette ajax, snippets je název extension v nette.ajax, která se stará o překreslení snippetů.

akadlec
Člen | 1326
+
0
-

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
+
0
-

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
+
0
-

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)

Croc
Člen | 270
+
0
-

No já bych ho i použil, ale bohužel jsem neměl na výběr :) Takové bylo zadání

akadlec
Člen | 1326
+
0
-

@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
+
0
-

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
+
0
-

@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)

akadlec
Člen | 1326
+
0
-

@GEpic: hele představ si že jsem to zkusil a kupodivu to fungovalo. Ono taky chce trochu číst dokumentaci a tam se o tom dočteš…

Croc
Člen | 270
+
0
-

@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
+
+2
-

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
+
0
-

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