Diskuze: Paginace v MVC
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 19 zpráv z 19.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
To co je dole máš v indexu? Pokud ano, třídy k těmto proměnným nemají
přístup, takže $strana a $stran jsou vlastně nulové. 
Nefunguje to tak, že se na to nedá kliknout a nezobrazuje to ta čísla.. Takže mám ty proměnné přesunout někam?
Definuj je v metodě zpracuj(). Předtím si je ale nastav v celé
té třídě (třeba jako public).
//EDIT: a piš jenom v jednom jazyce. 
Trošku jsem si s tím hrál, ale bez úspěchu
Upravil jsem to do podoby takto, ale
stránka nenaskakuje 
class InzeratyKontroler extends Kontroler{
public $strana;
public $stran;
public function zpracuj($parametry){
if (isset($_GET['strana']))
$this->strana = $_GET['strana'];
else
$strana = 1;
$naStranu = 2;
$automobily = vratAutomobily($strana, $naStranu);
$stran = ceil(vratPocetAutomobilu() / $naStranu);
Nějaké nápady ještě? 
Musíš používat všude $this->strana, $this->stran! 
To je základ OOP. Odkazuješ na proměnnou třídy.
Já to nechci cpát uplně všude, to je smrt ne?
Chybí to ted nekde
ocividne?
Jenže furt nevím, čím to zase rozchodit.. this mám u obou, ale furt špatný.. Ještě jsem vrtal předtím do správce inzerátů, když jsem vracel inzeráty tak tam bylo napřed jen $parametry, jenže jsem teď tam za to přidal ještě $strana, $naStranu a to sem možná podělal..
To není smrt, to je OOP. U některých proměnných, které používáš v
celé třídě, se to takhle dělá.
Bez $this je to jiná proměnná - proměnná metody. Doporučuji ti
si zopakovat OOP.
Používáš to i v tý druhý metodě? Tam si to třeba přehoď:
$strana = $this->strana;
Stejně je ten kód divný. Oprav si to a pak pošli celý kontroler znova.

Paginace se dělá v MVC úplně jinak, fakt se nevkládá do kontroleru. Je to ukázané v tutoriálech, minimálně je použita v e-shopu.
Dobře, tak já od té svojí upravené upustím a projedu si eshopy
Díky
Koukám dobře, že v tutoriálech na eshop, kterých je přes 40, tak tam ta
paginace někde je? Nechci vypadat vyčůraně, ale kdybych věděl, ve kterých
dílech se věnuješ právě stránkování? Upřímně, tolik bodů si naráz
kupovat nechci 
Podpora paginace se do MVC e-shopu přidává již v 9. dílu.
Nejde si koupit jen určitý článek v seriálu. Tam musíš postupně. 
A je výrazně odlišná od klasické? Resp., když si pročtu ten seriál do cca 10. dílu, zvládnu v OOP udělat paginaci?
No když ten seriál je udělanej aby tě něco naučil a ty to byl pak schopný použít, tak ano když si ho přečteš budeš toho schopnej...
Tak zdravím, všimol som si túto tému až teraz. Ja som riešil podobný problém a keďže som nikde nenašiel a v slovenčine alebo češtine tak som prehľadal aj anglické stránky v MVC je paginácia trochu inak, ale oprášil som jeden kód, ktorý som vytvoril podobným spôsobom ako ty a bol funkčný.
Kontroler:
<?php
class uvodController extends Controller
{
//inicializácia premenných
public $strana;
public $naStranu;
public $stran;
//metóda na nahradenie retazca v url
function urlStrany($url, $strana)
{
return str_replace('{strana}', $strana, $url);
}
//metóda pre vytvorenie paginácie
function paginace($strana, $stran, $url)
{
$polomer = 5; // Polomer oblasti okolo aktuálnej stránky
$html = '<nav class="centrovany"><ul class="paginace">';
// Šípka vľavo
if ($strana > 1)
$html .= '<li><a href="' . $this->urlStrany($url, $strana - 1) . '">«</a></li>';
else
$html .= '<li class="neaktivni">«</li>';
$left = $strana - $polomer >= 1 ? $strana - $polomer : 1;
$right = $strana + $polomer <= $stran ? $strana + $polomer : $stran;
// Poloha jednotky
if ($left > 1)
$html .= '<li><a href="' . $this->urlStrany($url, 1) . '">1</a></li>';
// tri bodky vľavo
if ($left > 2)
$html .= '<li class="neaktivni">…</li>';
// zobrazené čísla stránok
for ($i = $left; $i <= $right; $i++)
{
if ($i == $strana) // aktívna stránka
$html .= '<li class="aktivni">' . $i . '</li>';
else
$html .= '<li><a href="' . $this->urlStrany($url, $i) . '">' . $i . '</a></li>';
}
// tri bodky vpravo
if ($right < $stran - 1)
$html .= '<li class="neaktivni">' . '…' . '</li>';
// Poloha poslednej stránky
if ($right < $stran)
$html .= '<li><a href="' . $this->urlStrany($url, $stran) . '">' . $stran . '</a></li>';
// Šípka vpravo
if ($strana < $stran)
$html .= '<li><a href="' . $this->urlStrany($url, $strana + 1) . '">»</a></li>';
else
$html .= '<li class="neaktivni">«</li>';
$html .= '</ul></nav>';
return $html;
}
//metóda na spracovanie získanie dát na základe url
public function treat($params)
{
$automobilManager = new AutomobilManager();
if (isset($_GET['strana']))
$this->strana = $_GET['strana'];
else
$this->strana = 1;
$this->naStranu = 15;
$automobily = $automobilManager->vratAutomobily($this->strana, $this->naStranu);
$this->stran = ceil($automobilManager->vratPocetAutomobilu() / $this->naStranu);
$this->data['automobily'] = $automobily;
$this->view = 'uvod';
}
}
?>
model:
<?php
class AutomobilManager
{
function vratAutomobily($strana, $naStranu)
{
return Db::queryAll('SELECT * FROM automobil ORDER BY vyrobeno DESC LIMIT ?, ?', ($strana - 1) * $naStranu, $naStranu);
}
function vratPocetAutomobilu()
{
return Db::querySingle('SELECT COUNT(*) FROM automobil');
}
}
?>
Db.php je použité to isté ako v clanku o paginaci.
view:
<h1>Automobily</h1>
<table class="tabulka">
<tr>
<th>Značka</th>
<th>SPZ</th>
<th>Barva</th>
<th>Vyrobeno</th>
</tr>
<?php foreach ($automobily as $automobil) : ?>
<tr>
<td><?= $automobil['znacka'] ?></td>
<td><?= $automobil['spz'] ?></td>
<td><?= $automobil['barva'] ?></td>
<td><?= date('j.n. Y', strtotime($automobil['vyrobeno'])) ?></td>
</tr>
<?php endforeach ?>
</table>
<?= $this->paginace($this->strana, $this->stran, '?strana={strana}'); ?>
rozlozenie:
<!DOCTYPE html>
<html lang="cs-cz">
<head>
<meta charset="utf-8" />
<title>Automobily</title>
<link rel="stylesheet" href="styl.css" type="text/css"/>
</head>
<body>
<?php $this->controller->showView(); // vloženie aktuálneho pohľadu do šablóny ?>
</body>
</html>
a smerovač a kontroler mám prakticky rovnaký ako v článku jednoduchý CMS MVC. Prakticky celý tento kód je vyskladaný na základe tutoriálu jednoduchý redakčný systém v MVC a paginace v php. Robil som do toho len malé zásahy, nakoľko som chcel vyskúšať, či je to takto možné.
Zobrazeno 19 zpráv z 19.
