Automaticé načítání po 5ti sekundách

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

Dělám něco jako návštěvní knihu, spíše takový chat. A potřebuju, aby se chat refrešnul po 5ti sekundách.

	{snippet chat}
        {foreach $chat as $ch}
            {$ch->text}<br><hr>
        {/foreach}
    {/snippet}

{form chatForm class => ajax}
<div class="task-form">
    {control $form errors}

    {label text /} {input text size => 30, autofocus => true}
</div>
{/form}

Takže načte snippet chat samozřejmě ajaxově.
Nebo někoho napadá jíné řešení, například aby běžel nějak script na pozadí a kontroloval, jeslti není něco v tabulce navíc ?

llook
Člen | 407
+
0
-

S jQuery by mělo fungovat něco takového:

<script type="text/javascript">
window.setInterval(function () { $.get({link this}); }, 5000);
</script>

Šlo by to udělat i lépe, ale taky složitěji, tohle je nejjednodušší způsob.

slade183
Člen | 30
+
0
-

Díky funguje to.

Nebude to však moc vytižovat hosting ? Nebylo by lepší udělat nějaké jiné řešení ?
Jaké by bylo to lepší řešení o kterém jsi psal..

Editoval slade183 (4. 11. 2012 14:07)

ic
Člen | 430
+
0
-

Zatím pokud vím nic lepšího není, než se neustále opakovaně dotazovat serveru. Ideálně by server měl odpovědět jen HTTP statusem 304, pokud není co posílat a pokud je, tak obsah přenášených dat co možná nejvíce minimalizovat.
I tak ty datové přenosy budou docela velké, pokud bude chat využívat hodně lidí, ale nemyslím, že by si s tím dnešní hostingy neporadily.

Nox
Člen | 378
+
0
-

No je tu možnost, hledej „long polling“ … jen nevim jestli je pro server ok aby tam žilo větší množství requestů zároveň

Twista
Člen | 48
+
0
-

a co pouzit websocket ?

nemam s tim primo zkusenosti, ale melo by to jit, http://socketo.me/

David Matějka
Moderator | 6445
+
0
-

websockets by byly idealni, jestli ale slade183 pouziva normalni hosting (dle 3. prispevku), tak se mu nepodari vytvorit server, kterej bude naslouchat pozadavkum

jinak diky za tip na websocket php library, vypada propracovane :)

llook
Člen | 407
+
0
-

Vytěžování serveru bych se nebál, je srovnatelné se starým dobrým refreshovaným iframem. Z uživatelského hlediska může být nasírací, že když si označíš text, tak se refreshem zase odznačí. Dá se to řešit, ale jak říkám – složitěji. Tohle nejjednodušší řešení by mělo většinou stačit.

slade183
Člen | 30
+
0
-

Jo používám nrmální webhosting, takže ten websocket ne no, ale dky za tip.
Pokud to nebude nějak extra vadit, tak to teda nechám tím ajax refrešem

Nox
Člen | 378
+
0
-

Z uživatelského hlediska může být nasírací, že když si označíš text, tak se refreshem zase odznačí.

To lze řešit poměrně triviálně – načteš a přidáš jen to nové. Jediný případ by bys měl limit na počet zpráv (myšleno počet řádků nebo elementů v DOM) a po updatu by překročila označená část limit a měla tak být odstraněna. Tady si nejsem hned jistý, jak ideálně řešit.

Editoval Nox (4. 11. 2012 17:38)

slade183
Člen | 30
+
0
-

Přidat vždy jen to nové není špatný nápad, ale jak to udělám ? Tohle jsem ještě nikdy nedělal..

Nox
Člen | 378
+
0
-

No nejlíp na serveru… jde třeba WHERE id > ? (nepoužívám čas, protože teoreticky mohou být dvě zprávy ve stejný čas). A potom v JS dané záznamy nenahradíš, ale přidáš. No ale takto tedy budeš muset mít jiný mechanismus než defaultní Nette AJAX JavaScript, i když s jQuery by to mělo být triviální, ale nemám teď bohužel čas to napsat komplet

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

nette.ajax.js v masteru má podporu pro infinite ajaxování… stačí snippet vytvořit pomocí n: makra a dát mu datový atribut data-ajax-append. Takže takto:

<div n:snippet="chat" data-ajax-append>
	{foreach $chat as $ch}
		{$ch->text}<br><hr>
	{/foreach}
</div>
slade183
Člen | 30
+
0
-

Funguje to, ale jen, když přidám něco nového do formůláře z mojí strany, když otevřu 2 okna v jednom něco napíšu, tak se to ukáže, ale neukáže se to v druhém okně.

	<div n:snippet="chat" data-ajax-append>

    {foreach $chat as $ch}
         <strong>{$ch->created|date:'j. n. Y - h:i:s'}</strong> -- {$ch->text}<br><hr>
    {/foreach}
</div>
<script type="text/javascript">
    window.setInterval(function () { $.get({link Homepage:default}); }, 1000);
</script>

Přitom se mi nová hodnota vrátí, ale už se to nepřipíše (ve firebug to najdu)
V presenteru to vracím takhle:

$this->invalidateControl('chat');