AJAX – po stisku tlačítka se inkrementace provede pouze jednou
- chvostik
- Člen | 5
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)
- thm
- Člen | 147
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
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
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)