prace s ajaxem vlastnost v danou chvíli už neexistuje

endy
Člen | 18
+
0
-

Zdravím, Pokusím se svůj problém popsat podrobně. Vytáhnu si data z databáze a uložím do property. Tato data bych chtěl zpracovat a postupně posílat do šablony (po indexu) aniž by došlo k jejich změně (vykoná se nový dotaz do databáze). Proto jsem chtěl použít ajax, aby se znovu nevolala metoda render, kde data získávám z databáze. Takto mi to ale nefunguje po zavolání ajaxu je $this->words už null.

public function renderTest($id) {
 $this->words = $this->courseManager->getWords($id);
 $this->template->questions = $this->testManager->prepareQustions(0, $this->words);
}
public function handleContinueTest(){
    $this->template->questions = $this->testManager->prepareAnswers(1, $this->words);

   if($this->isAjax()){

       $this->redrawControl('test');

   }

}
neznamy_uzivatel
Člen | 115
+
0
-

Ukokončí se PHP, data zmizí – zavolání ajaxu už je nová instance, kdy $this->words neylo nikdy naplněno..
Nevím, co je words – asi by to šlo v renderTest poslat do šablony a v ajax požadavku si to poslat do handle..
Případně uložit do session..?

duke
Člen | 650
+
+1
-

Nebo si na to napiš getter který zajistí max. jedno načtení, např. takto:

protected function getWords($id, $forceReload = false)
{
	static $words = array();

	if (!isset($words[$id]) || $forceReload) {
		$words[$id] = $this->courseManager->getWords($id);
	}

	return $words[$id];
}
jiri.pudil
Nette Blogger | 1028
+
+1
-

Ajax ne-ajax, pro server a PHP je to úplně nový request a všechno se vytváří zčerstva.

Doporučuji prostudovat životní cyklus presenteru. Signály (handle) se vyhodnocují mezi action a render – a protože do $this->words nastavuješ data až v render, v handle je tam ještě nemáš.

Taky pozor na to, že metoda render se zavolá i při ajaxovém požadavku (pokud tedy v handle běh presenteru neukončíš) – Nette pak jen zajistí, že se nevykreslí celá šablona, ale jen změněné snippety. Takže si v render metodě přepisuješ $this->template->questions nastavené v handle.