Stránkování

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

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
+
0
-

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
+
0
-

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
+
0
-
<?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
+
0
-

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.)

Maggot
Člen | 18
+
0
-

mam tam presne tohle

<?php
    /** @persistent int */
    public $page = 1;

    /** @persistent string */
    public $table = 'clanky';
?>

na tu tridu se mrknu ;)

jasir
Člen | 746
+
0
-

Maggot napsal(a):
mam tam presne tohle:

A definice renderDefault()? Pouzivas debugger?

Maggot
Člen | 18
+
0
-

j pouzivam debuger , presne to pise
DibiDriverException #1064

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

Jan Tvrdík
Nette guru | 2595
+
0
-

Maggot napsal(a):

j pouzivam debuger , presne to pise
DibiDriverException #1064

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

Postni sem ten (vygenerovaný) pokažený SQL dotaz.

Maggot
Člen | 18
+
0
-

aha uz jsem to nasel…

SELECT count(*)
FROM NULL
LIMIT 1

je jasny nesmysl…, ale proc je to NULL kdyz tomu jasne predavam ze to ma byt tabulka clanky?!

Editoval Maggot (29. 6. 2009 14:23)

rokerkony
Člen | 122
+
0
-

zkus v dotazu zmenit $table za $this->table …

Maggot
Člen | 18
+
0
-

super vali to :) diky moc chlapi

Maggot
Člen | 18
+
0
-

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)

Panda
Člen | 569
+
0
-

Pokud máš parametr $page jako persistentní, tak by mělo pomoci jej v odkazu nastavit na NULL:

{plink Cs:clanek, 'id' => $clanek->id, 'page' => NULL}
Maggot
Člen | 18
+
0
-

to je ono :) diky moc

romansklenar
Člen | 655
+
0
-

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á.

cuga
Člen | 210
+
0
-

a neni nejake sikovnejsi reseni, nez nastavit ‚page‘ ⇒ NULL, protoze bych musel menit na hodne mistech a nejak se mi to nezda :)