V tomto příspěvku mi nejde o klasické stránkování, které se dá snadno vyřešit pomocí klauzule LIMIT v MySQL.
Nejde mi ani o seznamy, které se dají jednoduše a striktně seřadit podle velikosti (číslo, čas), ale jde mi o případ, kdy máme například seznam článků seřazených podle jména a chceme jednoduše přecházet na další či předchozí. Tady řazení podle operátorů <, > nebude to pravé.
Vyřešit se to dá následovně (vykopírováno z NETTE aplikace s použitou knihovnou DIBI):
// funkce zobrazuje objednávku dle ID, pokud ji pošleme parametr KAM, tak se zpracuje a funkce se zavolá znova jen s konkrétní ID public function renderDetail($id, $kam = '') { if ($kam == '') { $this->template->rows = dibi::fetchAll('SELECT * FROM [objednavka_polozky] [o] JOIN [w_zbozi] USING ([kod_zbozi]) JOIN [objednavka_hlavicka] USING ([id_objednavka]) WHERE [id_objednavka] = %i GROUP BY [kod_zbozi]', $id); } elseif ($kam == 'PREV') { dibi::query('SET @poradi:=0, @poradinow:=0, @idprev:=0, @idnext:=0;'); dibi::query('SELECT @poradi:=@poradi+1, IF(id_objednavka=%i, @poradinow:=@poradi, 0) FROM [objednavka_hlavicka] [oh] ORDER BY [cas] DESC', $id); dibi::query('SET @poradi:=0;'); dibi::query('SELECT @poradi:=@poradi+1, IF(@poradinow-1=@poradi, @idprev:=id_objednavka, 0), IF(@poradinow+1=@poradi, @idnext:=id_objednavka, 0) FROM [objednavka_hlavicka] [oh] ORDER BY [cas] DESC'); $row = dibi::fetch('SELECT @poradinow, @idnext AS next, @idprev AS prev;'); if ($row['prev'] == 0) { $this->flashMessage('Nelze se již posunout na předchozí objednávku.', 'info'); $this->redirect('Admin:detail', array('id' => $id)); } $this->redirect('Admin:detail', array('id' => $row['prev'])); } elseif ($kam == 'NEXT') { dibi::query('SET @poradi:=0, @poradinow:=0, @idprev:=0, @idnext:=0;'); dibi::query('SELECT @poradi:=@poradi+1, IF(id_objednavka=%i, @poradinow:=@poradi, 0) FROM [objednavka_hlavicka] [oh] ORDER BY [cas] DESC', $id); dibi::query('SET @poradi:=0;'); dibi::query('SELECT @poradi:=@poradi+1, IF(@poradinow-1=@poradi, @idprev:=id_objednavka, 0), IF(@poradinow+1=@poradi, @idnext:=id_objednavka, 0) FROM [objednavka_hlavicka] [oh] ORDER BY [cas] DESC'); $row = dibi::fetch('SELECT @poradinow, @idnext AS next, @idprev AS prev;'); if ($row['next'] == 0) { $this->flashMessage('Nelze se již posunout na následující objednávku.', 'info'); $this->redirect('Admin:detail', array('id' => $id)); } $this->redirect('Admin:detail', array('id' => $row['next'])); } else { //chyba $this->redirect('Admin:objednavky'); } } |
Příklad není úplně přehledný, protože jsem ho vykopíroval z hotové aplikace a aplikační logika není úplně čistá, ale pro demonstraci to doufám stačí.