Ajax request – update v databázi

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

Mám v aplikaci možnost hlasování, uživatel klikne na dokaz, provede se v databázi update +1 a zobrazí se ve stránce výsledek. Snažil jsem se to udělat přes ajax, aby se mi nerefreshovala celá stránka ale jen proměnná toho skóre.

Komponenta:

class ScoreComponent extends BaseComponent {
    private $score;
    private $subject;

    public function handleScore($id) {
        $this->reviewModel->updateScore($id);
        if ($this->presenter->isAjax()) {
            $this->invalidateControl();
        }
        else {
            $this->redirect('this');
        }
    }

    public function render($subjectId) {
        $this->score = $this->reviewModel->getSubjectScore($subjectId);
        $this->subject = $this->reviewModel->getSubjectById($subjectId);

        $template = $this->template;
        $exists = dirName(__FILE__)
                .DIRECTORY_SEPARATOR.'templates'
                .DIRECTORY_SEPARATOR.'score.latte';
        $template->setFile($exists);
        $template->score = $this->score;
        $template->subject = $this->subject;

        $template->render();
    }
}

score.latte

{block content}
There will be something beautiful with css here!
Name: {$subject['name']}
Description: {$subject['description']}
{snippet}
Score of subject: {$score}<br>
<a n:href="score!" class=ajax>obrazek</a>
{/snippet}

{/block}

Při kliknutí na odkaz se dotaz nevykoná, nic se neděje. Nějaké rady?

Myiyk
Člen | 321
+
0
-

V odkazu nemáš parametr $id, který požaduješ v handleScore

<a n:href="score! $id" class=ajax>obrazek</a>

A jen pro info: Komponenta, která přijímá signál, je automaticky označena za invalidní.
Nemusíš tedy ručně volat invalidateControl (redrawControl v novějším nette)

mara11
Člen | 42
+
0
-

Díky to mi tohle vyřešilo, akorát mám teď jiný problém… při kliknutí se dotaz vykoná, ale proměnná se nerefreshne, to se stane teprve až po refreshi stránky…
Třeba mám skóre 68, třikrát na to kliknu… nic se nestane, refreshnu stránku a je tam 71

Myiyk
Člen | 321
+
0
-

zkus ten snippet pojmenovat a potom ho invalidovat po jménu

mara11
Člen | 42
+
0
-

Přesunul jsem logiku do presenteru, již funkční :-)