Mohl by (Visual)Paginator vracet offset bez nastaveneho itemCount?

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

Zdravím, mám jednu připomínku k (visual)paginatoru.

Všechny příklady užití paginatoru (např. https://doc.nette.org/…tion/routing) předpokládají, že model má jednu metodu na vracení celkového počtu výsledků a jednu na samotná, limitovaná, data. To ale není moc efektivní. Jsou to dva dotazy do databáze na informaci, která by se dala získat jedním dotazem.

Např. v MySQL existuje konstrukce „SELECT SQL_CALC_FOUND_ROWS …“ která jedním SELECTem získá data i celkový počet nalezených položek. Ale neomezoval bych model jen na databáze. Hodně používám v modelech Sphinx Search a tam je samozřejmostí, že součástí limitovaného výsledku je i celkový počet nalezených položek bez limitu.

Takže potřebuji modelu předat offset dříve, než paginatoru předám itemCount. Dokud ale paginatoru nedám itemCount, tak vrací v offsetu nulu. Takže začarovaný kruh. Přitom ten itemCount k výpočtu offsetu, podle mě, nepotřebuje. Může ho spočítat z itemsPerPage a čísla aktuální stránky.

Nebylo by možné, aby bez nastavení itemCount, byl paginator schopen vracet offset?

Tradicni pristup ke strankovani:

<?php
public function renderDefault()
{
	$vp = $this['vp'];
	$paginator = $vp->paginator;

	// 1. dotaz modelu
	$paginator->itemCount = $this->model->count();

	// Nastaveni limitu
	$this->model->setLimit($paginator->offset, $paginator->itemsPerPage);

	// 2. dotaz modelu
	$result = $this->model->data();
	...
	...
}
?>

A takhle by se mi to libilo:

<?php
public function renderDefault()
{
	$vp = $this['vp'];
	$paginator = $vp->paginator;

	// Nastaveni limitu (offset uz musi neco vracet)
	$this->model->setLimit($paginator->offset, $paginator->itemsPerPage);

	// Jediny dotaz modelu
	$result = $this->model->data();

	// Teprve nakonec nastavit itemCount, ktery uz se ale znovu
	// nepocita, je to jen ulozena informace ziskana predchozim dotazem
	$paginator->itemCount = $this->model->lastItemCount();
	...
	...
}
?>
hrach
Člen | 1838
+
0
-

Upravil VisualPaginator, aby jako paginator pouzival tohoto potomka:

<?php

/**
 * Umoznuje definovat pocet stran pozdeji, az po nahrati konkretnich dat
 * @author Jan Skrasek
 */
class LatePaginator extends Paginator
{

	protected $page;

	public function setPage($page)
	{
		$this->page = (int) $page;
		return $this;
	}

	protected function getPageIndex()
	{
		return max(0, $this->page - $this->base);
	}

}
?>

Editoval hrach (17. 1. 2011 21:47)

David Grudl
Nette Core | 8227
+
0
-

fixed