Řazení názvu podle abecedy
- tomas_straka
- Člen | 32
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>
|
<a n:href="default, $paginator->page-1">Předchozí</a>
|
{/if}
Stránka {$paginator->getPage()} z {$paginator->getPageCount()}
{if !$paginator->isLast()}
|
<a n:href="firmy, $paginator->getPage() + 1">Další</a>
|
<a n:href="firmy, $paginator->getPageCount()">Poslední</a>
{/if}
</div>
- Šaman
- Člen | 2661
- Musí to umět metoda
$firmyRepository->findPublishedArticles()
. Musí být schopná akceptovat nějaký parametr řazení. 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žítbool
a zpracovat to trochu univerzálně, ale celý ten kód je jednoduchý, tak by tohle mohlo stačit.- Informaci o řazení si předáš do šablony
$this->template->sort = $sort;
- Do odkazů ke změně řazení přidáš natvrdo
parametr.
<a n:href="Firmy:firmy, page: 1, sort: ASC">a-z</a>
- 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
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 | 815
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
@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 | 815
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
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
- tomas_straka
- Člen | 32
Diky. A jeste bych se zeptal, proc do te sablony posilas $this->template->sort = $sort; ? Nevidim pro to vyuziti.