Jak se odkazovat na předchozí a následující příspěvek

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čí.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.

Tato stránka používá Akismet k omezení spamu. Podívejte se, jak vaše data z komentářů zpracováváme..