Stránkování
- Maggot
- Člen | 18
Ahoj
Zacinam s nette, nejake prikazy uz plne ovladam :), ale dnes jsem chtel udelat
strankovani, malem sem si z toho vytrhal vsechny vlasy…
u strankovani mi fungovalo to, ze se mi vypise jen 1 clanek jak chci , nebo ze
se samotny strankovani zobrazi (« Předchozí 1 2 3 Další ») ale kdyz
kliknu treba na 1 tak se sice do url prida ?page=1 ale to je tak vse …
poradil by mi prosim nekdo kde jsem zase udelal chybu?
tady je kod
presenter cs
<?php
public $page = '0';
public function renderDefault($table='clanky')
{
$this->template->title = "Hlavní strana";
$rowsPerPage = 1;
$numOfRows = dibi::select('count(*)')->from($table)->fetchSingle();
$numOfPages = (int) ceil($numOfRows / $rowsPerPage);
$this->page = max(0, min($this->page, $numOfPages - 1));
// paginator
if ($numOfPages > 1) {
$steps = range(max(0, $this->page - 3), min($numOfPages - 1, $this->page + 3));
$steps = array_merge($steps, range(0, $numOfPages - 1, (int) ceil($numOfPages / 5)));
$steps[] = $numOfPages - 1;
sort($steps);
$steps = array_unique($steps);
} else {
$steps = array();
}
// retrieving data
$query = dibi::select('*')
->from($table)
->offset($this->page * $rowsPerPage)
->limit($rowsPerPage)
->orderBy('id', Dibi::DESC);
$rowset = $query->execute();
$this->template->table = $table;
$this->template->currentPage = $this->page;
$this->template->numOfPages = $numOfPages;
$this->template->steps = $steps;
$this->template->clanky = $query;
$this->template->rows = $rowset->fetchAll();
$this->template->columns = $rowset->getColumnNames();
}
?>
a
default.phtml
<?php
{foreach $clanky as $clanek}
<div class="post">
<div class="postheader"><h1><a href="{plink Cs:clanky}{$clanek->id}">{$clanek->titulek}</a></h1></div>
<div class="postcontent">
{$clanek->datumpublikace|date:'%d.%m.%Y'}, zobrazeno {$clanek->zobrazeno}x
<br />
{$clanek->text}
<br />
</div>
<div class="postfooter"></div>
</div>
{/foreach}
{if $numOfPages > 1}
<div class="post">
<div class="postheader"></div>
<div class="postcontent">
<div class="paginator">
{if $currentPage > 0}
<a href="{link this, $table, 'page' => $currentPage - 1}">« Previous</a>
{else}
<span class="button">« Předchozí</span>
{/if}
{foreach $steps as $num}
{if isset($lastNum) && $num - $lastNum > 1}<span>…</span>{/if}
{if $num == $currentPage}
<span class="current">{$num + 1}</span>
{else}
<a href="{link this, $table, 'page' => $num}">{$num + 1}</a>
{/if}
{? $lastNum = $num }
{/foreach}
{if $currentPage < $numOfPages - 1}
<a href="{link this, $table, 'page' => $currentPage + 1}">Další »</a>
{else}
<span class="button">Další »</span>
{/if}
</div>
</div>
<div class="postfooter"></div>
</div>
{/if}
?>
dekuji za kazdou pripadnou odpoved :)
Editoval Maggot (29. 6. 2009 12:50)
- jasir
- Člen | 746
V rychlosti – myslím, že by jsi měl definovat dvě persistentní
proměnné presenteru
a změnit definici renderDefault().
Pročti si tvorbu odkazů
Jinak v quickstartu se paginace atd řeší.
<?php
class MyPresenter extends Presenter {
/** @persistent int */
public $page = 1;
/** @persistent string */
public $table = 'clanky';
public function renderDefault($table,$page) {
...
}
}
?>
Editoval jasir (29. 6. 2009 13:07)
- Maggot
- Člen | 18
ano do quickstartu jsem se dival… je to delane podle nej… ale nefaka to… :( kdyz jsem pridal to
<?php
public $page = 1;
/** @persistent string */
public $table = 'clanky';
public function renderDefault($table,$page)
?>
tak to hodilo chybu You have an error in your SQL syntax; check the
manual that corresponds to your MySQL server version for the right syntax to use
near ‚NULL LIMIT 1‘ at line 1 :(
jinak dekuji za radu ten clanek si urcite prectu ;)
- jasir
- Člen | 746
<?php
public $page = 1;
?>
Máš tam to @persistent? Protože:
<?php
// retrieving data
$query = dibi::select('*')
->from($table)
->offset($this->page * $rowsPerPage) //tady bereš proměnnou presenteru
->limit($rowsPerPage)
->orderBy('id', Dibi::DESC);
?>
bereš $this->page
. Aby se to this->page
naplnilo, musí být persistent.
- Ondřej Mirtes
- Člen | 1536
BTW: Doporučuju se juknout na třídu Nette\Paginator, která hezky zapouzdřuje tuhle častou práci :) (zjišťování počtu stránek, limit/offset pro SQL apod.)
- Jan Tvrdík
- Nette guru | 2595
Maggot napsal(a):
j pouzivam debuger , presne to pise
DibiDriverException #1064You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‚NULL LIMIT 1‘ at line 1
Postni sem ten (vygenerovaný) pokažený SQL dotaz.
- Maggot
- Člen | 18
jeste mam jeden dotaz – a sice kdyz mam v url napr ?page=1 a pak pomoci
{plink 'Cs:clanek', $clanek->id}
presmeruji na jednotlivy clanek tak tak mi to ?page=1 tak zustane a pak vznikne url typu cs/clanek/5/?page=1 :( ne ze by mi to tam nejak vadilo ve funkcnosti ale rad bych to tam nemel … nevite jak to odstranit??
diky predem za kazdou odpoved :)
Editoval Maggot (30. 6. 2009 13:44)
- romansklenar
- Člen | 655
Maggot napsal(a):
…
{plink 'Cs:clanek', $clanek->id}
…
Jen dodám, že v revizích r378 až r397 už se destination neuvozuje, takže by mělo být jen
{plink Cs:clanek, $clanek->id}
aby to nedělalo později neplechu po updatu Nette.
EDIT:
Od revize r398 už se zase uvozovat dá.