Ajax + cookies – funguje ale hlasování nabízí 2×
- motorcb
- Člen | 552
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
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;
}
- Ot@s
- Backer | 476
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)