Ajaxové volání statické metody z everyTime

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

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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 :)

newPOPE
Člen | 648
+
0
-

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 :)

Tak potom daj vediet kde bol problem s tym IE, nech sa poucime vsetci. ;-)

Saurian
Člen | 28
+
0
-

Jojo, jestli mě nepředběhnou guru odborníci :)