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

- admin@easyweb4u.cz
 - Backer | 153
 
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?

- dakur
 - Člen | 493
 
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 | 153
 
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.