Ajaxové volání statické metody z everyTime
- Saurian
- Člen | 28
Prosil bych o pomoc, už začínám být v koncích …
- Potřeboval bych v šabloně zobrazovat každou vteřinu několik hodnot z tabulky datábaze.
- V druhé tabulce mám hodnoty které rovněž potřebuji zpracovávat každou vteřinu, ale už je nemusím neustále číst z databáze, stačí jen jednou načíst a „někde“ uložit (statická třída ?).
Problém je, že nevím jak vhodně volat signál z Ajaxu tak, aby se mě
neustále nevytvářeli instance celého projektu.
Testovací verze …
Presenter:signal
public function handleTest()
{
$this->payload->data = AjaxLiveModel::getNeco();
$this->terminate();
}
AjaxLiveModel
class AjaxLiveModel extends Object
{
static public $neco = 1;
static public function getNeco()
{
return self::$neco;
}
public static function setNeco()
{
self::$neco = rand(0,5);
}
}
Šablona
<div id="content">
<p id="test">zkouška dat</p> // po každém volání nové random číslo ...
<script type="text/javascript">
<!--
$("#content").everyTime(1000,function() {
$.getJSON({link test!}, {}, function(payload) {
$("#test").text(payload.data);
});
});
-->
</script>
[..]
Nastavení attributu $neco v AjaxLiveModelu provádím např.
$application->onStartup[] = 'AjaxLiveModel::setNeco';
nebo ve startupu Presenteru.
Já bych potřeboval nějaký způsob, jak nastavit „$neco“ jen jednou. Ajax mi voláním signálu vytváří instanci celého projektu, proto se samozřejmě i nastavování „$neco“ provádí po každém volání Ajaxu, tj. každou vteřinu.
Zatím bych viděl způsob asi následující …
<script type="text/javascript">
$("#content").everyTime(1000,function() {
$.getJSON({"VOLAT PŘÍMO STATICKOU METODU getNeco()"}, {}, function(payload) {
$("#test").text(payload.data);
});
});
</script>
Ale nevím jak na to :)
Navíc pozoruji pro mě zatím překvapivý závěr, tenhle způsob volání
„everyTime“ nefunguje spolehlivě v IE, kde se neprovádí každou
vteřinu, ale každé 2 vteřiny, navíc sem tam padá Apache (náhodně tak po
1–5 minutách).
Ve Firefoxu / GoogleChrome bez problémů. (FireBug si taktéž nestěžuje).
Zkoušeno jak na IE7 tak i IE8 .
Co myslíte, kde bude problém a jak jej řešit ?
Editoval Saurian (8. 5. 2010 0:33)
- newPOPE
- Člen | 648
Problém je, že nevím jak vhodně volat signál z Ajaxu tak, aby se mě neustále nevytvářeli instance celého projektu.
- toto sa mi vidi tak trocha somarina, to co sa vytvara ta nemusi zaujimat skor ako to spracujes a co ide do response
Já bych potřeboval nějaký způsob, jak nastavit „$neco“ jen jednou. Ajax mi voláním signálu vytváří instanci celého projektu, proto se samozřejmě i nastavování „$neco“ provádí po každém volání Ajaxu, tj. každou vteřinu.
SESSION ?? (mozno by to riesila aj cache + nejake invalidacne pravidla napr. po x sekundach)
<?php
public function handleTest()
{
$this->payload->data = AjaxLiveModel::getNeco();
//tu by som skor pouzil
$this->sendPayload();
//$this->terminate();
}
?>
Editoval newPOPE (8. 5. 2010 12:11)
- Saurian
- Člen | 28
newPOPE napsal(a):
Problém je, že nevím jak vhodně volat signál z Ajaxu tak, aby se mě neustále nevytvářeli instance celého projektu.
- toto sa mi vidi tak trocha somarina, to co sa vytvara ta nemusi zaujimat skor ako to spracujes a co ide do response
newPOPE, jsem ve fázi učení se v Nette , nicméně mám za sebou léta programingu čistě jen jako koníček v jiných jazycích, zde teprve začínám. Nejde mi jen o to aby to „nějak“ fungovalo, ale trošku i o optimalizaci :)
SESSION: máš pravdu, taky jsem o tom uvažoval, ale
vzhledem k důležitosti údaje, raději ne …
(taky jsem si říkal do Sessionu timestamp, časové razítko, ale raději
žádný Session, spíše čistější cesta)
public function handleTest()
{
$this->payload->data = AjaxLiveModel::getNeco();
$this->sendPayload(); // úprava provedena, ale s přijímáním dat jsem neměl problém ...
// $this->terminate(); // testoval jsem ukončení i bez ...
}
?>
Zatím to řeším tak, že jsem resignoval z funkce „everyTime“ a přešel jsem na starý způsob
V Presenteru získám údaj z DB
public function renderDefault()
{
$this->template->ajaxtest = rand(1,100); // ajaxtest (později načtení z DB)
}
V šabloně posílám „ajaxtest“ na zpracování
<script type="text/javascript">
<!--
var rn = Math.random()*100; // jen pro test, že se "rn" generuje jen jednou
var i=0; // bude fungovat inkrementace ?
var timeTemp = function (){
$.getJSON({link test!}, {ajaxtest}, function(payload) { // ajaxtest se přenese na zpracování
$("#test").text(payload.data); // zobrazuje se stále po každé druhé vteřině v IE
});
$("#test2").text(" "+i+" "rn+" "+{$ajaxtest}); // ajaxtest z renderDefault se rovněž volá jen jednou
// zobrazuje se každou vteřinu
i=i+1; // inkrementace funguje
window.setTimeout(timeTemp,1000); // nové časování
};
window.setTimeout(timeTemp,1000);
-->
</script>
Není to ideální řešení (to by bylo asi, kdybych nějak z $.getJSON({volal přímo statickou metodu}, {}, function(payload)…
ale mám zatím volné ruce (vytváří se jen jedna instance, která se pěkně ukončí)
Navíc pozoruji jednu zajímavost, po hodině provozu nepadá Apache v IE, (ale Ajax část se stále volá každou druhou vteřinu v IE, nevím proč) , že by chyba v jquery.timers knihovně (everyTime) ? Do toho moc nevidím .
Jdu to zatím z testů předělat zpět na projekt, kdyby mi nějaký odborník poradil jak tyto problémy řešit čistěji, byl bych rád, protože jsem opravdu jen ve fázi učení se a odborník rozhodně nejsem :)
- newPOPE
- Člen | 648
SESSION: máš pravdu, taky jsem o tom uvažoval, ale vzhledem k důležitosti údaje, raději ne … (taky jsem si říkal do Sessionu timestamp, časové razítko, ale raději žádný Session, spíše čistější cesta)
no asi to povazujes za dolezity udaj :-), tak v session mozno nejaky key a udaj drzat v DB, subore (1× zapis, a potom uz len xx citanie)
takze hodnotu setNeco zapisem raz do session vrazim key a je vybavene potom uz len
<?php
if(key)
read(key)
else
write(key)
?>
Nejde mi jen o to aby to „nějak“ fungovalo, ale trošku i o optimalizaci :)
Malokedy na 1× krat vymyslis nieco genialne…, to sa mi po pravde este nepodarilo :D
To s tym volanim statickej metody asi nepojde, nic ma nenapada, lebo cely priebeh od requestu az po respone je nejaky zivotny cyklus ci uz Nette, Presenteru a pod. takze by som to napisal v ramci FWorku.
To s tymi IEckami, napada ma (nepozeral som) ze pokial getJSON neposiela nejake nahodne cislo v param… tak IE to niekedy nejak divne cachoval a v podstate nic nechodilo tam a spat.
- Saurian
- Člen | 28
no asi to povazujes za dolezity udaj :-), tak v session mozno nejaky key a udaj drzat v DB, subore (1× zapis, a potom uz len xx citanie)
Vím kam míříš, je to určitě funkční řešení, asi jsem trochu takový „nevěřící Tomáš“ :) , určitě si Sessiony nechám jako záložní řešení.
Malokedy na 1× krat vymyslis nieco genialne…, to sa mi po pravde este nepodarilo :D
Pravda, to by fórum pak mohlo mít jen sekci „geniální řešení geniálních lidí“, to by nějak nebylo ono, kde by jsme pak komunikovali :))
To s tym volanim statickej metody asi nepojde, nic ma nenapada, lebo cely priebeh od requestu az po respone je nejaky zivotny cyklus ci uz Nette, Presenteru a pod. takze by som to napisal v ramci FWorku.
Vypadá to tak, zkoušel jsem jen na testy dát pevnou adresu na externí Ajax model a Nette mi pěkně vynadalo 403jkou (za což jsem docela rád, vypadá to že autoři Nette mysleli na bezpečnost dobře :) ,víc jsem se v tom nevrtal)
To s tymi IEckami, napada ma (nepozeral som) ze pokial getJSON neposiela nejake nahodne cislo v param… tak IE to niekedy nejak divne cachoval a v podstate nic nechodilo tam a spat.
Ano, nejak se to chová divně v těch IE . Tohle bude ještě prácička. První předělám projekt podle nových nápadů a pak to musím vyřešit.
Zatím díky za ispirace :)