AJAX – po stisku tlačítka se inkrementace provede pouze jednou

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

Zdravím,
snažím se vytvořit klasické načítaní obsahu z databáze přes ajax, kdy po stisku tlačítka se zobrazí vždy dalších několik položek. Problém je že inkrementace se provede pouze jednou a dál nic. Předem díky za rady

//Presenter

<?php
	public function __construct(Nette\Database\Context $database){
		$this->database=$database;
		$this->pocet=1;
	}
	public function renderDefault()
	{
		$this->template->posts = $this->database->table('priklad')->order('id')->limit($this->pocet);
		$this->afterRender();
	}

	public function handleDefault()
	{
		if ($this->isAjax())  {
			$this->pocet++;
			$this->invalidateControl('post');
			}
	}
?>

//template

@{block content}
{snippet post}
<div n:foreach=„$posts as $post“ class=„post“>
<h1>{$post->nazev}</h1>
</div>
<br>
<a n:href=„default!“ class=„ajax“>See more</a>
{/snippet}

Editoval chvostik (24. 9. 2014 18:52)

Mysteria
Člen | 797
+
0
-

Ten počet si musíš ukládat buď do session nebo si ho předávat jako parametr v URL (používám já).

chvostik
Člen | 5
+
0
-

zkouším to pomocí URL bo stejnym zpusobem to delam u neajaxového řešení, ale zatim se mi nedaří dostat ten parametr pres ajax do presenteru ‚<a n:href=„default! pocet ⇒ $pocet++“ class=„ajax“>See more</a>‘. Nejaky navod pres jakou funkci nebo postup to mám řešit?

thm
Člen | 147
+
0
-

A máš $pocet persistentní? Po ajaxu se vždy spouští celá aplikace, takže si přepisuješ v konstruktoru $pocet vždy na 1.

/** @var int @persistent */
public $pocet = 1;

Mám testovací komponentu a takhle to funguje:

class Counter extends \App\Controls\BaseControl{

      /** @persistent */
      public $number;

      public function handleAdd(){
            ++$this->number;
            if($this->presenter->isAjax()) $this->redrawControl('counter');
				else $this->presenter->redirect('this');
      }




      public function handleRemove(){
            --$this->number;
            if($this->presenter->isAjax()) $this->redrawControl('counter');
				else $this->presenter->redirect('this');
      }





      public function render(){
            $this->template->setFile(__DIR__.'\counter.latte');
            $this->template->number = $this->number;
            $this->template->render();
      }
}

a šablona:

{snippet counter}
      <a class="ajax" n:href="remove!" style="text-decoration: none;">odečíst 1</a>
      {$number}
      <a class="ajax" n:href="add!" style="text-decoration: none;">přičíst 1</a>
{/snippet}

Editoval thm (25. 9. 2014 11:03)

chvostik
Člen | 5
+
0
-

Hodil jsem tam podmínku at se to nepřepisuje, jinak jsem mel $pocet sice jako private, ale kdyz jsem to dal na public tak se nic nezmenilo. Nechce to nejak upravit tu URL (router), aby tam ten parametr byl i videt?

<?php
public $pocet;
public function renderDefault()
	{
		if($this->getParam('pocet')) {
			$this->pocet = $this->getParam('pocet');
			$this->template->pocet=$this->pocet;
		}
		else {
			$this->pocet = 1;
			$this->template->pocet=1;
		}
		$this->template->posts = $this->database->table('priklad')->order('datum_pridani DESC')->limit($this->pocet);
		$this->afterRender();
	}

	public function handleDefault()
	{
		$this->pocet = $this->getParam('pocet');
		$this->template->pocet=$this->pocet;

		if ($this->isAjax())  {
			$this->invalidateControl('post');
			}

	}
?>
chvostik
Člen | 5
+
0
-

Upravil jsem to stejně jak to máš ty a nefunguje to. Děla tadle třída něco navíc co potřebuju? (extends \App\Controls\BaseControl)

<?php
public $pocet;

public function renderDefault()
	{
		if($this->pocet==NULL) $this->pocet=1;
		$this->template->pocet= $this->pocet;
		$this->template->posts = $this->database->table('priklad')->order('datum_pridani DESC')->limit($this->pocet);
		$this->afterRender();
	}

public function handleDefault()
	{
	    ++$this->pocet;
        if($this->presenter->isAjax()) $this->redrawControl('post');
        else $this->presenter->redirect('this');

	}
?>

Editoval chvostik (25. 9. 2014 11:28)

David Matějka
Moderator | 6445
+
0
-

a mas nad tim $pocet tu anotaci /** @var int @persistent */ jo?

chvostik
Člen | 5
+
0
-

wow funguje to :-) neměl jsem, myslel jsem že to je komentář jen lol. Díky moc :-)

Editoval chvostik (25. 9. 2014 11:55)

thm
Člen | 147
+
+1
-

chvostik napsal(a):

wow funguje to :-) neměl jsem, myslel jsem že to je komentář jen lol. Díky moc :-)

Hlavně nezapomeň, že @persistent parametry musí být vždy public, aby fungovaly. Na tom už jsem tolikrát pohořel a strávil několik wtf minut.