NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Paginace v MVC

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Michal Kuba
Tvůrce
Avatar
Michal Kuba:29.7.2015 18:09

Ahoj.
Po delší době mimo civilizaci sedám zpátky ke svému projektu a chci docílit vytvoření paginace, aby se z databáze vypisovaly vždy jen kousky a ne všechna data.

Podle zdejších tutoriálů jsem část kodu použil v InzeratyKontro­ler.php:

public function zpracuj($parametry){
         function urlStrany($url, $strana)
{
        return str_replace('{strana}', $strana, $url);
}

function paginace($strana, $stran, $url)
{
        $polomer = 3; // Polom�r oblasti kolem aktu�ln� str�nky
        $html = '<nav class="centrovany"><ul class="paginace">';
        // �ipka vlevo
        if ($strana > 1)
                $html .= '<li><a href="' . urlStrany($url, $strana - 1) . '">&laquo;</a></li>';
        else
                $html .= '<li class="neaktivni">&laquo;</li>';
        $left = $strana - $polomer >= 1 ? $strana - $polomer : 1;
        $right = $strana + $polomer <= $stran ? $strana + $polomer : $stran;
        // Um�st�n� jedni�ky
        if ($left > 1)
                $html .= '<li><a href="' . urlStrany($url, 1) . '">1</a></li>';
        // Te�ky vlevo
        if ($left > 2)
                $html .= '<li class="neaktivni">&hellip;</li>';
        // Str�nky v radiusu
        for ($i = $left; $i <= $right; $i++)
        {
                if ($i == $strana) // Aktivn� str�nka
                        $html .= '<li class="aktivni">' . $i . '</li>';
                else
                        $html .= '<li><a href="' . urlStrany($url, $i) . '">' . $i . '</a></li>';
        }
        // Te�ky vpravo
        if ($right < $stran - 1)
                $html .= '<li class="neaktivni">' . '&hellip;' . '</li>';
        // Um�st�n� posledn� str�nky
        if ($right < $stran)
                $html .= '<li><a href="' . urlStrany($url, $stran) . '">' . $stran . '</a></li>';
        // �ipka vpravo
        if ($strana < $stran)
                $html .= '<li><a href="' . urlStrany($url, $strana + 1) . '">&raquo;</a></li>';
        else
                $html .= '<li class="neaktivni">&laquo;</li>';
        $html .= '</ul></nav>';
return $html;}

do modelu inzeraty.phtml jsem vložil pouze toto:

<?= paginace($strana, $stran, '?strana={strana}') ?>

do SpravceImzeratu.php toto:

function vratInzeraty($strana, $naStranu)
{
        return Db::dotazVsechny('SELECT * FROM inzeraty ORDER BY datum_vlozeni DESC LIMIT ?, ?', ($strana - 1) * $naStranu, $naStranu);
}

function vratPocetInzeratu()
{
        return Db::dotazVsechny('SELECT COUNT(*) FROM inzeraty');
}

a ještě jsem ve správci udělal toto:

public function vratInzerat($parametry,$strana, $naStranu)
        {
                $ress= Db::dotazVsechny('
                        SELECT *
                        FROM inzeraty
                        WHERE upresneni=?
                        ORDER BY datum_vlozeni DESC
    ',array($parametry));
                return $ress;
        }

a v indexu.php mám tento kód:

if (isset($_GET['strana']))
        $strana = $_GET['strana'];
else
        $strana = 1;
$naStranu = 2;
$automobily = vratAutomobily($strana, $naStranu);
$stran = ceil(vratPocetAutomobilu() / $naStranu);

Je mi jasný, že jsem něco pokazil ale nevím přesně co. Na stránce to vypadá např. takto: http://mainos.cz/…moto/motorky

Poradí mi někdo? :)

 
Odpovědět
29.7.2015 18:09
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovídá na Michal Kuba
Jan Lupčík:29.7.2015 18:14

A co ti nefunguje? :D

Nahoru Odpovědět
29.7.2015 18:14
TruckersMP vývojář
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovídá na Michal Kuba
Jan Lupčík:29.7.2015 18:27

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é. :)

Editováno 29.7.2015 18:27
Nahoru Odpovědět
29.7.2015 18:27
TruckersMP vývojář
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Jan Lupčík
Michal Kuba:29.7.2015 18:56

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?

 
Nahoru Odpovědět
29.7.2015 18:56
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovídá na Michal Kuba
Jan Lupčík:29.7.2015 18:58

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. ;)

Editováno 29.7.2015 19:00
Nahoru Odpovědět
29.7.2015 18:58
TruckersMP vývojář
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Jan Lupčík
Michal Kuba:29.7.2015 20:49

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ě? :)

 
Nahoru Odpovědět
29.7.2015 20:49
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovídá na Michal Kuba
Jan Lupčík:29.7.2015 21:00

Musíš používat všude $this->strana, $this->stran! :D
To je základ OOP. Odkazuješ na proměnnou třídy.

Editováno 29.7.2015 21:01
Nahoru Odpovědět
29.7.2015 21:00
TruckersMP vývojář
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Jan Lupčík
Michal Kuba:29.7.2015 21:01

Já to nechci cpát uplně všude, to je smrt ne? :D Chybí to ted nekde ocividne?

 
Nahoru Odpovědět
29.7.2015 21:01
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Jan Lupčík
Michal Kuba:29.7.2015 21:05

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

 
Nahoru Odpovědět
29.7.2015 21:05
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovídá na Michal Kuba
Jan Lupčík:29.7.2015 21:05

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.

Nahoru Odpovědět
29.7.2015 21:05
TruckersMP vývojář
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovídá na Michal Kuba
Jan Lupčík:29.7.2015 21:07

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. :)

Editováno 29.7.2015 21:08
Nahoru Odpovědět
29.7.2015 21:07
TruckersMP vývojář
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Michal Kuba
David Hartinger:29.7.2015 21:09

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.

Nahoru Odpovědět
29.7.2015 21:09
New kid back on the block with a R.I.P
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na David Hartinger
Michal Kuba:29.7.2015 21:10

Dobře, tak já od té svojí upravené upustím a projedu si eshopy :) Díky

 
Nahoru Odpovědět
29.7.2015 21:10
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na David Hartinger
Michal Kuba:29.7.2015 21:21

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 :)

 
Nahoru Odpovědět
29.7.2015 21:21
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Michal Kuba
David Hartinger:29.7.2015 21:25

Podpora paginace se do MVC e-shopu přidává již v 9. dílu.

Nahoru Odpovědět
29.7.2015 21:25
New kid back on the block with a R.I.P
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovídá na Michal Kuba
Jan Lupčík:29.7.2015 21:25

Nejde si koupit jen určitý článek v seriálu. Tam musíš postupně. :D

Nahoru Odpovědět
29.7.2015 21:25
TruckersMP vývojář
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na David Hartinger
Michal Kuba:30.7.2015 17:50

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?

 
Nahoru Odpovědět
30.7.2015 17:50
Avatar
Ondřej Štorc
Tvůrce
Avatar
Odpovídá na Michal Kuba
Ondřej Štorc:30.7.2015 18:53

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

Nahoru Odpovědět
30.7.2015 18:53
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
Marián
Člen
Avatar
Odpovídá na Michal Kuba
Marián:10.11.2016 9:48

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) . '">&laquo;</a></li>';
        else
                $html .= '<li class="neaktivni">&laquo;</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">&hellip;</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">' . '&hellip;' . '</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) . '">&raquo;</a></li>';
        else
                $html .= '<li class="neaktivni">&laquo;</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é.

 
Nahoru Odpovědět
10.11.2016 9:48
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 19 zpráv z 19.