Ajax + cookies – funguje ale hlasování nabízí 2×

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

Zdravím. Dělám hodnocení komentářů +1 nebo –1 bod. To celé zatím přes cookies.
Jenže tím že jsem to zajaxoval, se mi odkaz pro hlasování zobrazuje i po hlasování. Až po následném hlasování zmizí (je možné hlasovat 2× ovšem je započítán pouze 1 hlas). Když to není přes ajax, funguje to tak jak má.

{if $user->isLoggedIn() }
  {ifset $myThumbsUp[$comment->id]} {else}
    <a n:href="plusPoint! $comment->id" class="ajax">+1</a>
  {/ifset}
  {ifset $myThumbsDown[$comment->id]} {else}
    <a n:href="minusPoint! $comment->id" class="ajax">-1</a>
  {/ifset}
{/if}

Pro zkrácení uvedu poze handler pro +1 bod, minusové body jsou na stejnem principu

public function handlePlusPoint( $idComment )
{
    // cookies
    if( $this->context->getService('httpRequest')->getCookie('article') )
    {
      //uz jsem hlasoval
      $cookie = json_decode( $this->context->getService('httpRequest')->getCookie('article'), true);
    }
    else
    {
      //jeste jsem nehlasoval
      $cookie = array();
    }

    //kdyz neni muj hlas v poli hlasuj
    if ( !isset($cookie[$nIdComment] ) ) {
        $cookie[$nIdComment] = 1;

        //uprav hlasy v db
        //...

        //uloz cookie
        $this->getHttpResponse()->setCookie("article", json_encode($cookie), 0);
    }

    if (!$this->isAjax()) {
        $this->redirect('this');
    } else {
        $this->invalidateControl('comments');
    }
}

Presenter: získání hlasů:

//mé palce nahoru
if( $this->context->getService('httpRequest')->getCookie('article') )
{
    $this->template->aMyThumbsUp = json_decode( $this->context->getService('httpRequest')->getCookie('article'), true);
}
else
{
    $this->template->aMyThumbsUp = array();
}

Problém je v tom, že když kliknu na +1 nebo –1 abych hlasoval, s obnovením snippetů se mi znovu zobrazí možnost hlasovat a úspěšně se připočte hlas. Následným hlasováním na stejnou možnost se hlas nezapočte a již není vidět tlačítko pro hlasování.
Jak script opravit aby po prvním hlasování již nebylo vidět hlasovací tlačítko?
Když vypnu JS, hlasování funguje tak jak má ⇒ provedu hlas, zmizí tlačítko pro hlasování.

Děkuji za rady

Ot@s
Backer | 476
+
0
-

Těžko se v tom kódu orinetuju a budu hádat. V signálu přidáváš do cookie ID k zablokování hlasování a následně v šabloně se na tu samé ID z cookie ptáš. ID v cookie ale „neexistuje“, resp. není nastavená od klienta (resp. je, ale až v druhém kroku).

Možná by pomohla úprava presenteru:

// puvodni kod
if( $this->context->getService('httpRequest')->getCookie('article') ) {
    $this->template->aMyThumbsUp = json_decode($this->context->getService('httpRequest')->getCookie('article'), true);
} else {
    $this->template->aMyThumbsUp = array();
}
// predpokladam, ze signaly jsou v presentru (jestli ne, uprav si `$this->isSignalReceiver()` a `$this->getParameter()`)
if( $this->isSignalReceiver($this, 'handlePlusPoint') || $this->isSignalReceiver($this, 'handleMinusPoint') ) {
	$this->template->aMyThumbsUp[ $this->getParameter('idComment') ] = 1;
}
motorcb
Člen | 551
+
0
-

Ot@s napsal(a):

Díky, funguje. Máš u mne pivo. Jen pro ty co začínají připomínám, že isSignalReceiver se musí volat v action.

Ot@s
Backer | 476
+
0
-

motorcb napsal(a):

Ot@s napsal(a):

Díky, funguje. Máš u mne pivo. Jen pro ty co začínají připomínám, že isSignalReceiver se musí volat v action.

Rádo se stalo. Teoreticky by to mělo jít ještě více zjednodušit (a případně i přesunout do render). Podmínkou je, že parametr idComment používáš výhradně pro hlasování.

if( $this->getParameter('idComment') ) {
        $this->template->aMyThumbsUp[ $this->getParameter('idComment') ] = 1;
}

Editoval Ot@s (24. 8. 2012 9:09)