Po ajaxu změnit jen malou část stránky přes snippet

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

Dobrý den,
nevíte jak obnovit pouze malou část výpisu z databáze? Když tam dám snippet, úplně to přestane fungovat, nemá to userRow. Postupoval jsem podle dokumentace na Nette, ale nějak jsem tomu nerozumněl.

V template mám

{snippet usersContainer}
	    <article n:foreach="$usersList as $userRow">
	    	<div>
		        <h2>{$userRow->first_name} {$userRow->last_name}</h2>
		        <img src="images/upload/{$userRow->picture}">
		       	{if $user->id != $userRow->id}
		** Tady odtud bych chtěl snippet **
		       			{if $userRow->cu == 0}
			                <a n:href="like! $userRow->id" class="ajax">to se mi líbí</a>
			            {else}
			                <a n:href="unlike! $userRow->id" class="ajax">už se mi to nelíbí</a>
			            {/if}
		** Konec snippetu **
		        {/if}
		    </div>
	    </article>
	{/snippet}

Presenter

public function handleLike($user_id)
	{
        if($this->user->id&&$user_id!=$this->user->id)
        {
            if($this->usersModel->findById($user_id))
            {
                $this->pointsModel->saveLike($user_id, $this->user->id);
            }


            if ($this->isAjax()) {
                $this->redrawControl('usersContainer'); // Zde bych chtěl překreslit pouze část s Like&Unlike
            } else {
                $this->redirect('this');
            }
        }
        else
        {
            $this->redirect('this');
        }
	}

Moc vám děkuji. :)

David Matějka
Moderator | 6445
+
+1
-
resigo
Člen | 20
+
0
-

Co nechápu je, jak vložit pouze jeden řádek aby se aktualizovalo pouze jedno user-id. Díky za trpělivost.

					{snippet user-$userRow->id}
		       			{if $userRow->cu == 0}
			                <a n:href="like! $userRow->id" class="ajax">to se mi líbí</a>
			            {else}
			                <a n:href="unlike! $userRow->id" class="ajax">už se mi to nelíbí</a>
			            {/if}
		       		{/snippet}
$this->template->usersList = $this->usersModel->findTop100($user_id, $user_id);
$this->redrawControl('usersContainer');
David Matějka
Moderator | 6445
+
0
-

V handle* nactes pouze onen konkretni radek (a das ho do pole, aby sablona nic nepoznala :)) a v render pak jiz nebudes volat findTop100

resigo
Člen | 20
+
0
-

Ještě to nefunguje, je tohle správně? $this->template->usersList[] = $this->usersModel->findTop100($user_id, $user_id); Mám usersList přepsat nebo tam ten řádek přidat?

David Matějka
Moderator | 6445
+
0
-

v handleLike nastav userList, aby v tom byl pouze ten jeden radek, zhruba takhle:

...
if($row = $this->usersModel->findById($user_id))
{
	$this->template->userList = array($row);
	$this->pointsModel->saveLike($user_id, $this->user->id);
}
...

a v render metode pak nacti plny seznam jen pokud je ta property v sablone prazdna, takze

public function renderDefault()
{
	if(!isset($this->template->userList)) {
		$this->template->userList = ....
	}
}
resigo
Člen | 20
+
0
-

To $row tam nemůžu použít, mám tam místo toho $this->usersModel->findTop100($this->user->id, $user_id), což vrací trochu jiné údaje, vrací to Nette\Database\Row, to by mělo být v pořádku ne?.

Editoval resigo (24. 10. 2014 18:06)

David Matějka
Moderator | 6445
+
0
-

jeste tam mam vlastne chybu.. v tom handle to do ty sablony muzes poslat jen pokud se jedna o ajaxovy request.

proste pri ajaxovem requestu na ten signal posles do sablony pouze jeden radek s tim konkretnim zaznamem, co se ma prekreslit

resigo
Člen | 20
+
0
-

Vypadá, že to funguje tedka, i když se mi zdá, že to ještě před chvíli takhle nefungovalo :D Díky moc!!! :)