Reload stránky na základě změny na serveru pomocí setTimeout

admin@easyweb4u.cz
Backer | 143
+
0
-

Zdar vespolek. Potřebuju zjišťovat, zda je na serveru nová objednávka a poté reloadovat stránku. Zkusil jsem to dost neobratně, v šabloně jsem použil setTimeout() a přes nette.ajax spustil signál, který mi přes snippet vracel kýžený aktuální počet objednávek. Ten jsem chtěl porovnat s cookie s původním počtem v šabloně a v případě, že nový počet je větší, udělat reload. Bordel mi v tom ale dělal ten snippet.

<script>
setTimeout(function(){
 $.nette.ajax({
 url: {$control->link("ordernum!")},
 error: function () {
 alert("theres an error with AJAX");
 }
 });
 },5000);
</script>

Já bych vlastně potřeboval, aby mi ten signál poslal tu hodnotu zpátky do JS jinak než přes snippet. Snad by to mohlo jít přes JSON – v presenteru $this->sendJson($data), to ale nevím, zda JSON takto odejde do šablony a jak ho v šabloně (v JS scriptu) přečíst. Možná spustit signál a pak přečíst v šabloně výsledek nějak umí nette.ajax přímo v té funkci výše, nevím…

Předem dík za radu

Poradí někdo jak na to?

CZechBoY
Člen | 3608
+
0
-

Klasicky pres $.ajax, neni potreba volat $.nette.ajax.

dakur
Člen | 493
+
0
-

Můžeš buďto poslat request bez nette.ajax, zpět na klienta přijde číslo, tam ho porovnáš a pak zavoláš window.location.reload(). Anebo pošleš request přes nette.ajax, porovnáš v presenteru a když true, zavoláš $this->redirect('this'). V response pak přijde něco jako {redirect: "url adresa"} a nette.ajax už provede redirect (tj. reload) samo.

Klasicky pres $.ajax, neni potreba volat $.nette.ajax.

Rozdíl jsem teď zrovna vysvětloval tady. Zkráceně nette.ajax využiješ tehdy, když potřebuješ framework-specific věci. Na prostý request stačí $.ajax nebo fetch.

Editoval dakur (5. 5. 2021 9:39)

admin@easyweb4u.cz
Backer | 143
+
0
-

Ono mi to funguje následovně:

<script>
	setTimeout(function(){
		var olast;
		olast = $.cookie("orderlast");
		$.nette.ajax({
					url: {$control->link("ordernum!")},
					data: {'orderlast': olast},
					error: function () {
							alert("theres an error with AJAX");
					}
			});
		},5000);
</script>

spustí se handler

<?php
	public function handleOrdernum($orderlast) {
		if ($this->isAjax()) {

			$row = $this->database->table('inforest')->where('userid = ?', $this->userid)->fetch();

			if ($row) {

					$this->ordernum = count($this->order->showOrdersRest($row->id, 1)); // dnes

					if ($orderlast) {

						if ('(' . $this->ordernum . ')' > $orderlast) {

							$this->orders = $this->order->showOrdersRest($row->id, 1); // dnes

							$this->orderlast = $orderlast;

							$this->redirect('Orders:default');
						}
					}
			}

		} else {
			$this->flashMessage('Chyba přenosu dat!');
		}

	}
?>

Kontrola se provede, ALE TEN SETTIMEOUT SE UŽ DÁLE NEVYKONÁVÁ. Zkouším to všelijak zapouzdřit do snippetu a provést redrawControl, což mi ve většině případů funkuje, ale tady ne.

MajklNajt
Člen | 494
+
0
-

Čo tak setInterval?

admin@easyweb4u.cz
Backer | 143
+
0
-

MajklNajt napsal(a):

Čo tak setInterval?

Funguje to, dík moc :-)