Potíž s VisualPaginatorem

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

Dobrý den,
rád bych Vás poprosil o radu, jak zprovoznit VisualPaginator, zkoušel jsem nějaké návody tady na fóru , ale už se mi to pár hodin nedaří dát dohromady.

V Presenteru mám tuto metodu:

<?php
    public function renderChciPujcku($param) {
        $dataSource = dibi::query('SELECT * FROM [chcipujcku] ORDER BY [date]'); // vyhodi chybu :Call to undefined method DibiResult::applyLimit().

        $dataSource = $this->db->select('*')->from('chcipujcku'); // vyhodi MySQL dotaz : SELECT * FROM `chcipujcku` APPLY LIMIT 1 0 , ktery je v MySQL spatne

                //->orderBy('date')->desc()
                //->execute()
                //;

        $paginator = $this['page']->paginator;
        $paginator->itemsPerPage = 1;
        $paginator->itemCount = count($dataSource);

        $dataSource->applyLimit($paginator->length, $paginator->offset);

        $this->template->articles = $dataSource->fetchAll();
}

protected function createComponentPage() {
        return new VisualPaginator;
}
?>

snazim se pomoci dibi ziskat data z MySQL tabulky chcipujcky, bohuzel oba moje pokusy jak ziskat data skonci chybou (chyby pisu v kodu, jsou zakomentovane za obema pokusy jak ziskat data z DB).

Nejsem si uplne jisty na jaky format dat muzu pouzit metodu ApplyLimit.

Diky za pomoc.
Jarda

JakubKohout
Člen | 92
+
0
-

Například takto

	$dataSource = dibi::select('[b.date],[b.main],[u.nick],[u.id] as [subject_id]')
			->from('[users_book] b')
			->innerJoin('[users] u')->on('[b.user_id] = [u.id]')
			->where('[b.subject_id] = %i',$id)
			->orderBy('[b.date] DESC');
			//->toDataSource();
$this['visualPaginator']->paginator->itemsPerPage    = 10; //nastavíme zobrazení deseti položek na stránku
$this['visualPaginator']->paginator->itemCount       = $dataSource->count(); //řekneme paginátoru kolik máme celkem položek

$template->messages = $dataSource->Limit($this['visualPaginator']->paginator->offset . ','. $this['visualPaginator']->paginator->itemsPerPage)
									->fetchAll(); //získáme požadovaná data

Je to poupravené aby to nevyužívalo DataSource, protože když jsem ho použil tak jsem měl problém s pořadím (teď si nejsem jistej jestli to nebyla podmínka WHERE).

Ondřej Mirtes
Člen | 1536
+
0
-

Já bych to udělal takto:

public function renderChciPujcku($param) {
        $dataSource = dibi::dataSource('SELECT * FROM [chcipujcku] ORDER BY [date]');

        $paginator = $this['page']->paginator;
        $paginator->itemsPerPage = 1;
        $paginator->itemCount = count($dataSource);

        $dataSource->applyLimit($paginator->length, $paginator->offset);

        $this->template->articles = $dataSource->fetchAll();
}

Ty chyby ti dibi vyhazuje, protože ho špatně používáš :) dibi::query ti vrací objekt DibiResult (což není DibiDataSource), který metodu applyLimit nemá.

neologyc
Člen | 13
+
0
-

Ahoj Ondro,

dekuji za radu, kazdopadne stale nemuzu prijit na chybu, udelal jsem to podle tveho navodu a stale se mi vypisuje chyba:
Call to undefined method dibi::datasource()

Coz je divne, protoze, podle API dibi , by dibi:: melo mit metodu dataSource() – https://api.dibiphp.com/1.3/dibi.html#…

}

<?php

    public function renderChciPujcku($param)
    {
        dibi::connect(Environment::getConfig('database'));
        $dataSource = dibi::dataSource('SELECT * FROM [chcipujcku] ORDER BY [date]');

        $paginator = $this['page']->paginator;
        $paginator->itemsPerPage = 1;
        $paginator->itemCount = count($dataSource);

        $dataSource->applyLimit($paginator->length, $paginator->offset);

        $this->template->articles = $dataSource->fetchAll();

    }
?>

napadá tě jak tohle vyřešit?

Ondřej Mirtes napsal(a):

Já bych to udělal takto:

public function renderChciPujcku($param) {
        $dataSource = dibi::dataSource('SELECT * FROM [chcipujcku] ORDER BY [date]');

        $paginator = $this['page']->paginator;
        $paginator->itemsPerPage = 1;
        $paginator->itemCount = count($dataSource);

        $dataSource->applyLimit($paginator->length, $paginator->offset);

        $this->template->articles = $dataSource->fetchAll();
}

Ty chyby ti dibi vyhazuje, protože ho špatně používáš :) dibi::query ti vrací objekt DibiResult (což není DibiDataSource), který metodu applyLimit nemá.

Ondřej Mirtes
Člen | 1536
+
0
-

Netuším, nemáš nějakou prehistorickou verzi?

Tip: rozhodně se nepřipojuj k databázi v render* metodě, dej to aspoň do bootstrapu.

neologyc
Člen | 13
+
0
-

Ondřej Mirtes napsal(a):

Netuším, nemáš nějakou prehistorickou verzi?

Tip: rozhodně se nepřipojuj k databázi v render* metodě, dej to aspoň do bootstrapu.

Prvne dekuji za namet se starou knihovnou, nevim jak to , ale mel jsem minified verzi dibi knihovny z ledna 2009, nova verze uz tento problem vyresila.

Ohledne pripojeni k DB, to jsem jen prihodil k render metode, aby slo videt, jak se pripojuju k DB, samozrejme dam do bootstrapu.

Dekuju jeste jednou, Jarda