Paginator, počet výpisů na první straně

Dvory59
Člen | 40
+
0
-

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
+
0
-

Ř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 | 8129
+
+2
-

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
+
0
-

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)

Šaman
Člen | 2635
+
+1
-

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á.

Polki
Člen | 553
+
0
-

Š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

premek_k
Člen | 172
+
+1
-