Řazení názvu podle abecedy

tomas_straka
Člen | 32
+
0
-

Ahoj, prosim o nasmerovani nebo napad. Mam udelat v PHP(nette) rovnaní podle abecedy. Když uživatel klikne na a-z nebo z-a tak by se měla tabulka srovnat. Mam FirmyPresenter, ktery vezme firmy z DB a posle je do sablony. A v sablone by mela byt moznost a-z nebo z-a. Chtěl bych volat defaultni metodu renderFirmy jako predtim, ale aby mi dala srovnane nazvy. Jak na to, prosim? díky

<?php


namespace App\Presenters;

use App\Model\FirmyRepository;
use Nette;


class FirmyPresenter extends Nette\Application\UI\Presenter
{

    /** @var FirmyRepository */
    private $firmyRepository;

    private Nette\Database\Explorer $database;

    public function __construct(FirmyRepository $firmyRepository)
    {
        $this->firmyRepository = $firmyRepository;
    }

    public function renderFirmy(int $page = 1)
    {
        $firmyCount = $this->firmyRepository->getPublishedArticlesCount();
        $paginator = new Nette\Utils\Paginator();
        $paginator->setItemCount($firmyCount);
        $paginator->setItemsPerPage(10);
        $paginator->setPage($page);
        $firmy = $this->firmyRepository->findPublishedArticles($paginator->getLength(), $paginator->getOffset());
        $this->template->firmy = $firmy;
        $this->template->paginator = $paginator;
    }


}
{block content}
<h1>Články</h1>
<a n:href="Firmy:desc">a-z</a> nebo <a n:href="Firmy:desc">z-a</a>
<div class="articles">
	{foreach $firmy as $firma}
		<h2>{$firma->nazev}</h2>

	{/foreach}
</div>

<div class="pagination">
	{if !$paginator->isFirst()}
		<a n:href="default, 1">První</a>
		&nbsp;|&nbsp;
		<a n:href="default, $paginator->page-1">Předchozí</a>
		&nbsp;|&nbsp;
	{/if}

	Stránka {$paginator->getPage()} z {$paginator->getPageCount()}

	{if !$paginator->isLast()}
		&nbsp;|&nbsp;
		<a n:href="firmy, $paginator->getPage() + 1">Další</a>
		&nbsp;|&nbsp;
		<a n:href="firmy, $paginator->getPageCount()">Poslední</a>
	{/if}
</div>
Šaman
Člen | 2635
+
+3
-
  1. Musí to umět metoda $firmyRepository->findPublishedArticles(). Musí být schopná akceptovat nějaký parametr řazení.
  2. public function renderFirmy(int $page = 1, string $sort = 'ASC') – tím zajistíš, že render metoda bude schopná přijmout parametr o řazení. Obecně by možná bylo lepší použít bool a zpracovat to trochu univerzálně, ale celý ten kód je jednoduchý, tak by tohle mohlo stačit.
  3. Informaci o řazení si předáš do šablony $this->template->sort = $sort;
  4. Do odkazů ke změně řazení přidáš natvrdo parametr. <a n:href="Firmy:firmy, page: 1, sort: ASC">a-z</a>
  5. Do odkazů ke stránkování přidáš aktuální řazení, které šabloně předal presenter <a n:href="firmy, $paginator->getPage() + 1", $sort>Další</a>
  • Změna řazení takhle vynuluje stránkování, což je asi dobře (pokud se změní řazení, je irelevantní na které stránce jsme byli).
  • K udržení informaci o řazení se dá využít perzistentní parametr, ale pro začátek si můžeš tuto informaci předávat takto sám, aspoň pochopíš jak to funguje. Žádná magie.
  • Ideální je tohle dělat ajaxově, ale to vše taky až pochopíš jak a proč to funguje tímto způsobem. Ajax je další level ve složitosti.
  • Prakticky jsou na tohle ale už hotové Datagridy, které za tebe udělají strašně moc otrocké práce.

Editoval Šaman (13. 1. 2021 7:05)

David Matějka
Moderator | 6445
+
0
-

Jen doplním, že

Do odkazů ke stránkování přidáš aktuální řazení, které šabloně předal presenter <a n:href=„firmy, $paginator->getPage() + 1“, $sort>Další</a>

není potřeba. jelikož je ten parametr uveden v signatuře té render metody, tak je persistentní pro danou akci.

Na druhou stranu bych pro přehlednost (aby to nebylo pozičně závislé) používal pojmenované parametry pro stránky:

<a n:href="this page: $paginator->getPage() + 1">Další</a>
Kamil Valenta
Člen | 762
+
0
-

David Matějka napsal(a):
jelikož je ten parametr uveden v signatuře té render metody, tak je persistentní pro danou akci.

Tý jo, tohle jsem sám netušil. Je to někde zdokumentováno?

David Matějka
Moderator | 6445
+
+3
-

@KamilValenta nevím, možná, že neni. jo zapomněl jsem zmínit, že je potřeba odkazovat přes this a ne přes název akce.

Kamil Valenta
Člen | 762
+
0
-

David Matějka napsal(a):

@KamilValenta nevím, možná, že neni. jo zapomněl jsem zmínit, že je potřeba odkazovat přes this a ne přes název akce.

Aha, tak to pak jo. S this ano.

tomas_straka
Člen | 32
+
0
-

Diky vsem za rady, funguje. Jeste bych mel dotaz…kdyz inicializuji promennou v hlavicce metody napr. "public function renderFirmy(int $page = 1), tak kdyz do te metody poslu neco jineho, tak se tam misto $page= 1 vlozi treba 4? Neprepise se mi to? Diky

Šaman
Člen | 2635
+
+2
-

Jasně že nepřepíše. Je to defaultní hodnota, která se použije, když nepošleš nic. Takže odkaz na /firmy bude fungovat. Odkaz na /firmy/4 nastaví čtvrtou stranu.

To je ale obecné php, nikoliv Nette.

tomas_straka
Člen | 32
+
0
-

Diky. A jeste bych se zeptal, proc do te sablony posilas $this->template->sort = $sort; ? Nevidim pro to vyuziti.

Šaman
Člen | 2635
+
0
-

Bod 5. Předávám ten parametr při stránkování.