8. diel - Výpis článkov z databázy v PHP (MVC)
V minulej lekcii, Databázový wrapper , sme si vytvorili databázový wrapper nad PHP ovládačom PDO. Databáze máme už tiež pripravenú, nič nám nebráni s ňou komunikovať.
Pripojenie
Ako prvé sa musíme k databáze pripojiť. To vykonáme v index.php, tesne pred vytvorením smerovača:
// Připojení k databázi Db::pripoj("127.0.0.1", "root", "", "mvc_db");
Údaje si samozrejme zmeňte podľa svojho webhostingu, takto sú vyplnené pre localhost. Databáze máme v aplikácii prístupnú, poďme sa ju na niečo opýtať.
Model - Správca článkov
Vytvoríme triedu s logikou ohľadom práce s článkami, ktorá bude obsahovať jednotlivé SQL dotazy. Trieda bude samozrejme v modeloch a vymenovať sa bude SpravceClanku. Pre každú databázovú entitu si v našom systéme vytvoríme nejakú podobnú triedu. SpravceClanku bude mať nasledujúce podobu:
<?php // Třída poskytuje metody pro správu článků v redakčním systému class SpravceClanku { // Vrátí článek z databáze podle jeho URL public function vratClanek($url) { return Db::dotazJeden(' SELECT `clanky_id`, `titulek`, `obsah`, `url`, `popisek`, `klicova_slova` FROM `clanky` WHERE `url` = ? ', array($url)); } // Vrátí seznam článků v databázi public function vratClanky() { return Db::dotazVsechny(' SELECT `clanky_id`, `titulek`, `url`, `popisek` FROM `clanky` ORDER BY `clanky_id` DESC '); } }
Trieda má celkom 2 metódy:
- vratClanek () vracia jeden článok z databázy podľa jeho URL. Získavanie dát od užívateľa nie je záležitosť modelu, všimnite si, že URL mu jednoducho príde v argumentu metódy a nerieši odkiaľ sa vzalo. Do podmienky SQL dotazu premennú nevložíte priamo, ale namiesto jej hodnoty vložíme zástupný znak (otáznik). Všetky parametre SQL dotazu následne odovzdáme databázu ako hodnoty v poli, ona si ich do dotazu sama a bezpečne dosadí.
- vratClanky () vracia zoznam všetkých článkov (bez ich obsahu). Články sú zoradené zostupne podľa ID, teda od najnovších po najstaršie. Všimnite si, že nevyberáme ich obsah, metódu budeme používať iba pre výpis zoznamu.
Pohľady
Budeme potrebovať 2 pohľady. Jeden pre článok a druhý pre zoznam článkov.
Clanek.phtml
Pri článku vypíšeme nadpis a potom jeho obsah. Pohľad bude nasledujúci:
<header> <h1><?= $titulek ?></h1> </header> <section> <?= $obsah ?> </section>
Druhý pohľad necháme na koniec lekcie.
Kontrolér
Máme model, máme pohľad, zostáva náš známy prostredník - kontrolér, ktorý všetko spojí dohromady. ClanekKontroler bude mať nasledujúce podobu:
class ClanekKontroler extends Kontroler { public function zpracuj($parametry) { // Vytvoření instance modelu, který nám umožní pracovat s články $spravceClanku = new SpravceClanku(); // Získání článku podle URL $clanek = $spravceClanku->vratClanek($parametry[0]); // Pokud nebyl článek s danou URL nalezen, přesměrujeme na ChybaKontroler if (!$clanek) $this->presmeruj('chyba'); // Hlavička stránky $this->hlavicka = array( 'titulek' => $clanek['titulek'], 'klicova_slova' => $clanek['klicova_slova'], 'popis' => $clanek['popis'], ); // Naplnění proměnných pro šablonu $this->data['titulek'] = $clanek['titulek']; $this->data['obsah'] = $clanek['obsah']; // Nastavení šablony $this->pohled = 'clanek'; } }
Kontrolér si vytvoria model a získa od neho článok podľa URL adresy. Pokiaľ článok nebol nájdený, vyhodnotí sa premenná s ním ako false a presmerujeme na ChybaKontroler. Hlavičku stránky nastavíme podľa článku, ďalej pohľadu odovzdáme titulok a obsah, aby článok mohol vypísať. Nakoniec nastavíme pohľad na clanek.phtml.
Poďme si všetko vyskúšať. Keď aplikáciu zapneme, uvidíme vypísaný úvodný článok:
Môžete si skúsiť zadať URL neexistujúceho článku, budete presmerovaní na chybovú stránku.
Clanky.phtml
Zoznam článkov bude o niečo zložitejšie, pretože potrebujeme vypísať ich zoznam z poľa článkov, ktoré dostaneme od databázy. Ako že to ale urobíme, keď zatiaľ vieme vypisovať len jednotlivé premenné a tu potrebujeme vypísať obsah kolekcie? Poďme si rozšíriť naše vedomosti o PHP syntax, presnejšie o šablónové verzii cyklov.
Šablónová syntaxe PHP
Okrem direktívy <? = Nám PHP ponúka šablónové ekvivalenty najbežnejších konštrukcií jazyka. Môžeme tak do pohľadu (šablóny) vložiť minimálnu časť logiky, ktorá nebude znepřehledňovat HTML kód. Tieto šablónové ekvivalenty nám totiž umožňujú vkladať PHP do HTML.
Bez znalosti šablónové syntaxe PHP by výpis zoznamu článkov do tabuľky vyzeral asi takto:
<h1>Seznam článků</h1> <table> <?php foreach ($clanky as $clanek) { echo('<tr><td><h2> <a href="clanek/' . $clanek['url'] . '"> ' . $clanek['titulek'] . '</a> </h2>' . $clanek['popisek']); echo('</td></tr>'); } ?> </table>
HTML je nezvyrazneny, šablóna neprehľadná., Strácame sa v úvodzovkách ako reťazca spájame. Poďme kód previesť do šablónové verzia:
<h1>Seznam článků</h1> <table> <?php foreach ($clanky as $clanek) : ?> <tr> <td> <h2><a href="clanek/<?= $clanek['url'] ?>"><?= $clanek['titulek'] ?></a></h2> <?= $clanek['popisek'] ?> </td> </tr> <?php endforeach ?> </table>
Všimnite si, že cyklus foreach má za sebou napísanú dvojbodku a potom sa ukončí PHP direktíva. Toto je šablónová verzia foreach, ktorá pre každý prvok vyechuje HTML kód, ktorý je napísaný pod ním a to až do značky endforeach. Podobne možno prepísať aj cykly for a while alebo podmienky if. HTML je zapísané ako HTML, nie ako string. Premenné vložíme do HTML pomocou <? =, Ako sme zvyknutí. Súbor clanky.phtml si s týmto obsahom v priečinku pohľady vytvorte.
Pozn .: V šablónach stále neošetrujeme HTML entity a vystavujeme sa tak útoku XSS. Napravíme to hneď v budúcom dieli.
Úprava ClanekKontroler
Zoznam článkov bude vypisovať ClanekKontroler a to v prípade, keď mu nezadáme žiadny parameter. Kontrolér jednoducho podmienkou rozpolíme na dve časti. Jedna vypisuje konkrétny článok a druhá zoznam. Pre tieto akcie by sa dali použiť 2 kontrolery, ale zvyčajne sa zapisujú do jedného, keď spolu úzko súvisia. Metódu spracuj () upravíme do nasledujúcej podoby:
public function zpracuj($parametry) { // Vytvoření instance modelu, který nám umožní pracovat s články $spravceClanku = new SpravceClanku(); // Je zadáno URL článku if (!empty($parametry[0])) { // Získání článku podle URL $clanek = $spravceClanku->vratClanek($parametry[0]); // Pokud nebyl článek s danou URL nalezen, přesměrujeme na ChybaKontroler if (!$clanek) $this->presmeruj('chyba'); // Hlavička stránky $this->hlavicka = array( 'titulek' => $clanek['titulek'], 'klicova_slova' => $clanek['klicova_slova'], 'popis' => $clanek['popisek'], ); // Naplnění proměnných pro šablonu $this->data['titulek'] = $clanek['titulek']; $this->data['obsah'] = $clanek['obsah']; // Nastavení šablony $this->pohled = 'clanek'; } else // Není zadáno URL článku, vypíšeme všechny { $clanky = $spravceClanku->vratClanky(); $this->data['clanky'] = $clanky; $this->pohled = 'clanky'; } }
Teraz prejdime na kontrolér clanek a nezadáme URL článku, ktorý sa má zobraziť. Zobrazí sa zoznam všetkých článkov na webe:
V budúcej lekcii, Zabezpečenia šablón , sa budeme venovať zabezpečenia šablón proti XSS.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 1956x (15.08 kB)
Aplikácia je vrátane zdrojových kódov v jazyku PHP