Avatar
Michal Kuba
Redaktor
Avatar
Michal Kuba:

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
IT Man
Redaktor
Avatar
Nahoru Odpovědět 29.7.2015 18:14
Když nevíš jak dál, podá ti ruku někdo, od koho by jsi to nečekal. A tu šanci musíš přijmout!
Avatar
IT Man
Redaktor
Avatar
Odpovídá na Michal Kuba
IT Man:

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
Když nevíš jak dál, podá ti ruku někdo, od koho by jsi to nečekal. A tu šanci musíš přijmout!
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na IT Man
Michal Kuba:

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
IT Man
Redaktor
Avatar
Odpovídá na Michal Kuba
IT Man:

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
Když nevíš jak dál, podá ti ruku někdo, od koho by jsi to nečekal. A tu šanci musíš přijmout!
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na IT Man
Michal Kuba:

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
IT Man
Redaktor
Avatar
Odpovídá na Michal Kuba
IT Man:

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
Když nevíš jak dál, podá ti ruku někdo, od koho by jsi to nečekal. A tu šanci musíš přijmout!
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na IT Man
Michal Kuba:

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
Redaktor
Avatar
Odpovídá na IT Man
Michal Kuba:

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
IT Man
Redaktor
Avatar
Odpovídá na Michal Kuba
IT Man:

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
Když nevíš jak dál, podá ti ruku někdo, od koho by jsi to nečekal. A tu šanci musíš přijmout!
Avatar
IT Man
Redaktor
Avatar
Odpovídá na Michal Kuba
IT Man:

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
Když nevíš jak dál, podá ti ruku někdo, od koho by jsi to nečekal. A tu šanci musíš přijmout!
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Michal Kuba
David Čápka:

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  +3 29.7.2015 21:09
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na David Čápka
Michal Kuba:

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
Redaktor
Avatar
Odpovídá na David Čápka
Michal Kuba:

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 Čápka
Tým ITnetwork
Avatar
Odpovídá na Michal Kuba
David Čápka:

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

Nahoru Odpovědět 29.7.2015 21:25
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
IT Man
Redaktor
Avatar
Odpovídá na Michal Kuba
IT Man:

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

Nahoru Odpovědět 29.7.2015 21:25
Když nevíš jak dál, podá ti ruku někdo, od koho by jsi to nečekal. A tu šanci musíš přijmout!
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na David Čápka
Michal Kuba:

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
Odpovídá na Michal Kuba
Ondřej Štorc:

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:

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