6. diel - Ners - Editor článkov v PHP
V minulej lekcii, Ners - Registrácia užívateľov v PHP , sme dokončili administračné stránku jednoduchého redakčného systému. V dnešnom PHP tutoriálu pridáme prihlasovanie.
Prihlasovanie
Vytvoríme skript prihlaseni.php. Jeho HTML časť bude nasledujúce:
<!DOCTYPE html> <html lang="cs-cz"> <head> <meta charset="utf-8" /> <link rel="stylesheet" href="styl.css" type="text/css" /> <title>Přihlášení do administrace</title> </head> <body> <article> <div id="centrovac"> <header> <h1>Přihlášení do administrace</h1> </header> <section> <?php if (isset($zprava)) echo('<p>' . $zprava . '</p>'); ?> <form method="post"> Jméno<br /> <input type="text" name="jmeno" /><br /> Heslo<br /> <input type="password" name="heslo" /><br /> <input type="submit" value="Přihlásit" /> </form> <p>Pokud ještě nemáte účet, <a href="registrace.php">zaregistrujte se</a>.</p> </section> <div class="cistic"></div> </div> </article> </body> </html>
Vidíme PHP direktívu pre výpis chybové správy (ak existuje) a formulár s menom a heslom. Kód je takmer totožný s tým u registračného formulára a mal by byť teda zrozumiteľný.
Nad HTML vložíme nasledujúce PHP blok:
<?php session_start(); require('Db.php'); Db::connect('127.0.0.1', 'ners_db', 'root', ''); if (isset($_SESSION['uzivatel_id'])) { header('Location: administrace.php'); exit(); } if ($_POST) { $uzivatel = Db::queryOne(' SELECT uzivatele_id, admin, heslo FROM uzivatele WHERE jmeno=? ', $_POST['jmeno']); if (!$uzivatel || !password_verify($_POST['heslo'], $uzivatel['heslo'])) $zprava = 'Neplatné uživatelské jméno nebo heslo'; else { $_SESSION['uzivatel_id'] = $uzivatel['uzivatele_id']; $_SESSION['uzivatel_jmeno'] = $_POST['jmeno']; $_SESSION['uzivatel_admin'] = $uzivatel['admin']; header('Location: administrace.php'); exit(); } } ?>
Prvé riadky nám sprístupní session a pripojí sa k databáze. Ak je používateľ prihlásený, tak mu prihlasovaciu stránku zobrazovať nebudeme a presmerujeme ho rovno na administráciu a skript zastavíme.
Ak bol odoslaný formulár, vyberieme z databázy informácie o
užívateľovi podľa zadaného mena a skontrolujeme, či sa zadané heslo
zhoduje s odtlačkom hesla. To docielime funkcií
password_verify()
, ktoré zadáme ako parametre heslo a jeho
odtlačok. Funkcia nám následne vráti true / false, podľa toho, či heslo
súhlasí, alebo nie. Ak používateľa nenájdeme alebo bolo zadané nesprávne
heslo, uložíme chybovú hlášku. V prípade úspechu uložíme načítané
informácie o užívateľovi do session a tým ho prihlásime. Ďalej ho
presmerujeme na administráciu.
Môžete sa skúsiť prihlásiť. Ak ste ešte prihlásenie z registrácie, tak sa odhláste a prihláste znova.
Pridelenie role administrátora
V našom systéme máme u každého používateľa stĺpec admin. Ten bude nadobúdať hodnoty 0 alebo 1 podľa toho, či je používateľ administrátor. Túto hodnotu môže nastaviť novo registrovanému užívateľovi iba administrátor webu pomocou phpMyAdmin. Presunieme sa teda do phpMyAdmin a prepneme hodnotu admin u nášho účtu na 1 (na políčko stačí len poklikat a hodnotu prepísať).
Teraz sa odhláste a prihláste.
Editor článkov
Prejdime k editoru článkov. Vytvorme súbor editor.php a vložme doň HTML blok:
<!DOCTYPE html> <html lang="cs-cz"> <head> <meta charset="utf-8" /> <link rel="stylesheet" href="styl.css" type="text/css" /> <title>Editor článků</title> </head> <body> <article> <div id="centrovac"> <header> <h1>Editor článků</h1> </header> <section> <?php if (isset($zprava)) echo('<p>' . $zprava . '</p>'); ?> <form method="post"> <input type="hidden" name="clanky_id" value="<?= htmlspecialchars($clanek['clanky_id']) ?>" /><br /> Titulek<br /> <input type="text" name="titulek" value="<?= htmlspecialchars($clanek['titulek']) ?>" /><br /> URL<br /> <input type="text" name="url" value="<?= htmlspecialchars($clanek['url']) ?>" /><br /> Popisek<br /> <input type="text" name="popisek" value="<?= htmlspecialchars($clanek['popisek']) ?>" /><br /> Klíčová slova<br /> <input type="text" name="klicova_slova" value="<?= htmlspecialchars($clanek['klicova_slova']) ?>" /><br /> <textarea name="obsah"><?= htmlspecialchars($clanek['obsah']) ?></textarea> <input type="submit" value="Odeslat" /> </form> </section> <div class="cistic"></div> </div> </article> <script type="text/javascript" src="//tinymce.cachefly.net/4.0/tinymce.min.js"></script> <script type="text/javascript"> tinymce.init({ selector: "textarea[name=obsah]", plugins: [ "advlist autolink lists link image charmap print preview anchor", "searchreplace visualblocks code fullscreen", "insertdatetime media table contextmenu paste" ], toolbar: "insertfile undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image", entities: "160,nbsp", entity_encoding: "named", entity_encoding: "raw" }); </script> </body> </html>
Kód obsahuje opäť len jednoduchý HTML formulár a výpis chybové správy. Dáta sa do formulárových polí vypisujú z poľa $ clanek. Formulár má ešte jednu zvláštnosť a tou je skryté pole s ID daného článku. Podľa tohto poľa spoznáme, či vkladáme nový článok (bude prázdne) alebo či editujeme existujúce (bude v ňom ID tohto článku).
Zaujímavý je JavaScript na konci súboru, v ktorej načítame WYSIWYG editor TinyMCE. To je editor vzhľadovo podobný napr. MS Worde, ktorý nám generuje HTML kód podľa toho, čo v ňom naklikáte.
Prvý skript je odkaz na online úložiska, z ktorého si prehliadač TinyMCE stiahne. Druhý skript obsahuje nastavenia editora, zvolíme, že editor chceme vytvoriť z textarea s názvom obsah. Ďalšie riadky nastavujú pluginy a vypínajú prevod slovenskej diakritiky na entity, čo je inak pomerne nepríjemná záležitosť.
Nad HTML kód dodajme obslužný PHP blok:
<?php session_start(); if (empty($_SESSION['uzivatel_admin'])) die('Nedostatecna opravneni'); require('Db.php'); Db::connect('127.0.0.1', 'ners_db', 'root', ''); $clanek = array( 'clanky_id' => '', 'titulek' => '', 'obsah' => '', 'url' => '', 'popisek' => '', 'klicova_slova' => '', ); if ($_POST) { if (!$_POST['clanky_id']) { Db::query(' INSERT INTO clanky (titulek, obsah, url, popisek, klicova_slova) VALUES (?, ?, ?, ?, ?) ', $_POST['titulek'], $_POST['obsah'], $_POST['url'], $_POST['popisek'], $_POST['klicova_slova']); } else { Db::query(' UPDATE clanky SET titulek=?, obsah=?, url=?, popisek=?, klicova_slova=? WHERE clanky_id=? ', $_POST['titulek'], $_POST['obsah'], $_POST['url'], $_POST['popisek'], $_POST['klicova_slova'], $_POST['clanky_id']); } header('Location: index.php?clanek=' . $_POST['url']); exit(); } else if (isset($_GET['url'])) { $nactenyClanek = Db::queryOne(' SELECT * FROM clanky WHERE url=? ', $_GET['url']); if ($nactenyClanek) $clanek = $nactenyClanek; else $zprava = 'Článek nebyl nalezen'; } ?>
Ak používateľ nie je administrátor, zastavíme celý skript s chybovým hlásením. Pre kontrolu prihlásenie administrátora nám nestačí isset (), ale musíme použiť empty (). V session totiž môže existovať kľúč 'uzivatel_admin', ale môže mať hodnotu 0.
Ďalej sa pripojíme k databáze a do premennej $ clanek si pripravíme pole s prázdnymi hodnotami. To aby sa do formulára nič nevypísala a zároveň nám PHP neohlásilo chybu s neexistujúce premennou.
Ak bol odoslaný formulár, pozrieme sa do skrytého poľa. Ak je prázdne, vložíme nový článok do databázy. Pokiaľ je v skrytom poli nejaká hodnota, updatuje článok s týmto ID. SQL príkaz UPDATE sme si ešte nepredstavovali, ale je veľmi jednoduchý. Pomocou SET jednoducho nastavíme polia ktorá potrebujeme. Čo je dôležité je nezabudnúť na klauzulu WHERE, kde určíme ktoré riadky sa majú takto updatovať. Bez nej by sa updatoval všetky články na tieto hodnoty!
Po pridaní alebo editáciu článku na neho presmerujeme.
Ak nebol odoslaný formulár, pozrieme sa, či nemáme v GET url článku. To by znamenalo, že chceme nejaký editovať a preto sa do poľa $ clanek pokúsime nahrať dáta z článku s týmto URL. Dáta sa potom predvyplní do polí formulára. Pri neúspechu vypíšeme chybovú hlášku.
Teraz si editor spustite a vložte si článok s URL "uvod". To bude hlavná stránka nášho webu:
Článok uložte do databázy. Pokračovať budeme zas v budúcej lekcii, Ners - Výpis článkov v PHP .