Diskuze: Paginace v MVC
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Tvůrce
Zobrazeno 19 zpráv z 19.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
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.