visual paginator → stranky = pocet novinek

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
mordare
Začátečník | 117
+
0
-

Nzdar lidi už si tu připadadám jako pravidelný přispivatel, ale s NETTE teprve začínám. No proste vypisuju novinky (viz kod) z databaze a chtel sem aby když jich bude moc se to rozdělilo na stranky. použil sem visual paginator a dopadlo to že počet stranek = počrt novinek a navic na každe strance jsou všechny novinky.
Kod je zde můžete někdo poradit ať je to správně? Tedy na každe strance jen určity počet novinek (zatim sem to schvalne nastavoval na 1 aŤ můžu vyskoušet jestli to jede)?

Quinix
Člen | 108
+
0
-

V presenteru máš

$model->findNews($paginator->offset, $paginator->itemsPerPage);

ale ta metoda v modelu ty parametry nemá uvedené, ani dotaz který posíláš nemá LIMIT.

mordare
Začátečník | 117
+
0
-

tedy to má být jak? s visual paginatorm pracuju po prve takže vubec netušim. co mám tedy přidat do modelu?

westrem
Člen | 398
+
0
-

V prvom rade zbytocne kladies query naviac aj v actionNews, celu tu metodu mozes zmazat.

K render metode, oprav ju takto:

public function renderNews()
 {
     $model = new DatabaseManager;
     $vp = $this['vp'];
     $paginator = $vp->paginator;
     $paginator->itemsPerPage = 6; // istotne nie 1 .. to by ti davalo jednu novinku na stranu .. daj si tam ake cislo chces
     $paginator->itemCount = $model->countNews();
     $news = $model->findNews($paginator->offset, $paginator->itemsPerPage);

     $this->template->news = $news;
 }

A modelova metoda:

public function findNews($offset, $limit)
{
  return dibi::query("SELECT * FROM news ORDER BY id DESC LIMIT %i OFFSET %i", $limit, $offset)->fetchAll();
}

Este pre istotu, neviem ako vyzera tabulka s novinkami, ale radsej zistuj pocet takto:

public function countNews()
{
  return dibi::fetchSingle("SELECT COUNT(*) FROM news");
}
toka
Člen | 253
+
0
-

Tuším, že fetchAll() přímo podporuje LIMIT a OFFSET, takže lze zapsat takto:

public function findNews($offset, $limit)
{
  return dibi::query("SELECT * FROM news ORDER BY id DESC")->fetchAll($limit, $offset);
}

A countNews je také zbytečné – lze použít $count = count($result), kde $result je výsledek dotazu bez aplikace limitu a offsetu :-D

Editoval toka (22. 11. 2010 23:58)

mordare
Začátečník | 117
+
0
-

Diky lidi už to funguje

westrem
Člen | 398
+
0
-

toka napsal(a):

Tuším, že fetchAll() přímo podporuje LIMIT a OFFSET, takže lze zapsat takto:

public function findNews($offset, $limit)
{
  return dibi::query("SELECT * FROM news ORDER BY id DESC")->fetchAll($limit, $offset);
}

A countNews je také zbytečné – lze použít $count = count($result), kde $result je výsledek dotazu bez aplikace limitu a offsetu :-D

Mal to dobre tak ako to mal, resp. ako som to upravil. Pouzitie ->fetchAll($limit, $offset) je imho jedna z mala nepeknych veci, ktore v dibi su a radsej by byt nemali.

V tomto pripade sa ti totiz spravy select na vsetko a az v PHPku sa ti v dibi odseparuje to co chces, ziaden limit a offset do DB nejde = massive overhead na prenasanie dat z DB.

Preto je lepsie polozit separatny dotaz s COUNT(*) a potom ten, co realne v query vyuziva limit a offset – naplno vyuzivas silu DB a jej indexov a klucov a neprenasas overhead na PHP.