Paginator, počet výpisů na první straně
- Dvory59
- Člen | 40
Zdravím. Chtěl bych se zeptat, dá se nějak efektivně pomocí nastavení
paginatoru určit odlišný počet položek, které se vypisují jako
první?
Využívám paginator né přímo ke stránkování, ale k odhalování
článků pod sebou. Rád bych jich na začátku vypsal 5 a pak už jen
po 3.
Můj kód teď je v presenteru :
public function actionDefault($page=1){
$articlesCount = $this->model->dbBlogPostsCount()->where('page != ?','hr')->count();
$this->paginator = new Nette\Utils\Paginator;
$this->paginator->setItemCount($articlesCount); // celkový počet článků
$this->paginator->setItemsPerPage($this->isAjax() ? $page * self::POSTS_PER_PAGE : self::POSTS_PER_PAGE); // počet položek na stránce
$this->paginator->setPage($this->isAjax() ? 1 : $page); // číslo aktuální stránky
$this->posts = $this->model->dbBlogPosts($this->paginator->getLength(),$this->paginator->getOffset(),NULL,$this->language == "en");
}
public function renderDefault($page = 1)
{ $this->template->posts=$this->posts;
$this->template->paginator = $this->paginator;
$this->template->hrPostsNextPage = !$this->paginator->isLast();
$this->template->page = $page;
$this->template->perPage = self::POSTS_PER_PAGE;
if ($this->isAjax())
$this->redrawControl();
}
V šabloně pak kromě výpisu mám :
<div style="width:100%; padding:0px;" class="more blogVypis">
<a style="margin-bottom:0; width: 100%;" n:if="$hrPostsNextPage" class="ajax "
href="{link this,page => $page + 1}" title="Objevte více">{if $language=="cz"}Objevte
více {else} Read more{/if}</a>
</div>
pro zobrazení dalších článků.
Nevíte prosím někdo, jak to co nejefektivněji nastavit?
Děkuji moc za každou radu
- Polki
- Člen | 553
Řeším ten samý problém. Asi to nějak hacknu, pokud nenajdu radu.
Hack by mohl vypadat takto (bez použití paginatoru!!!):
model:
public function getPage(int $page = 1): array {
$selection = $db->table('name')->where('column', 'value')->order('column');
if ($page == 1) {
$selection->limit(5, 0);
} else {
$selection->limit(3, 5 + 3 * ($page - 2));
}
return $selection->fetchAll();
}
Osobně doufám, že to paginátor nějak umí, ale toto je jistota. Funkce vrátí jen buď prvních 5 řádků, nebo ty 3 následující.
Nechápu, proč ti ze všech těch guru tady za ty 3 měsíce aspoň někdo něco takovýho neporadil.
Edit 1:
A metoda pro získání počtu stránek například takto vypadá:
model:
public function getPageCount(): int {
$pageCount = $db->table('name')->where('column', 'value')->order('column')->count() - 2;
$pageCount /= 3;
if ($pageCount - ((int) $pageCount) > 0) {
$pageCount += 1;
}
return $pageCount;
}
Editoval Polki (11. 12. 2018 21:46)
- David Grudl
- Nette Core | 8239
Použij $db->table('name')->page($page, $itemsPerPage)
Pro zjištení čísla poslední stránky:
$db->table('name')->page($page, $itemsPerPage, $lastPage)
,
předá jej do proměnné $lastPage
.
- Polki
- Člen | 553
David Grudl napsal(a):
Použij
$db->table('name')->page($page, $itemsPerPage)
Pro zjištení čísla poslední stránky:
$db->table('name')->page($page, $itemsPerPage, $lastPage)
, předá jej do proměnné$lastPage
.
@DavidGrudl to ano, ale v tomto případě nelze u první stránky nastavit jiný počet $itemsPerPage ne?
Zadání, tedy alespoň u mě je, že na první stránce se má zobrazovat 7 článků z blogu a na každé další 6 následujících článků.
tedy pro $page == 1:
$itemsPerPage = 7;
pro $page != 1:
$itemsPerPage = 6;
tedy například pokud mám 20 článků číslovaných od 1, tak mi metoda
->page() vrátí pro $page == 1 tyto výsledky:
1, 2, 3, 4, 5, 6, 7
a pro $page == 2 vrátí:
7, 8, 9, 10, 11, 12
pro $page == 3:
13, 14, 15, 16, 17, 18
a pro $page == 4:
19, 20
toto chování ale není žádoucí, protože se na stránce 2 objeví article s číslem 7, který již je zobrazen na stránce 1. Nepletu se?
Edit 1:
Co v případě, že budu chtít na první stránce vypsat ještě více
článků.
Například na první stránce chci dejme tomu 15 příspěvků, ale na
dalších třeba jen po 10 příspěvcích. V DB je jich celkem 150…
Na první stránce, pokud to dobře chápu mi paginátor vrátí do proměnné $lastPage hodnotu 10, ale na stránce 2 – N mi vrátí hodnotu 15 nepletu se?
Editoval Polki (12. 12. 2018 21:01)
- Polki
- Člen | 553
Šaman napsal(a):
Asi bych to řešil vlastní komponentou. Možná poděděnou od paginatoru, spíš ale okopírovanou a pak upravenou podle sebe.
Ono to, co ty popisuješ, není to, co se očekává od komponenty nazvané „stránkovač“. I když vnitřní logika je podobná.
No vidíš. Udělat komponentu mě nenapadlo. Přitom se to využívá
i jinde.
Nějaké nápady na název této komponenty? :D