Automaticé načítání po 5ti sekundách
- slade183
- Člen | 30
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 ?
- ic
- Člen | 430
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.
- Twista
- Člen | 48
a co pouzit websocket ?
nemam s tim primo zkusenosti, ale melo by to jit, http://socketo.me/
- David Matějka
- Moderator | 6445
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
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.
- Nox
- Člen | 378
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)
- Nox
- Člen | 378
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
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
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');