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

před 8 dny

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');

   }

}

před 8 dny

neznamy_uzivatel
Člen | 75
+
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..?

před 8 dny

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];
}

před 7 dny

jiri.pudil
Člen | 870
+
+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.