Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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.

Prihlasovanie užívateľov v PHP - Databázy v PHP pre začiatočníkov

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

Administrátorské práva v phpMyAdmin - Databázy v PHP pre začiatočníkov

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:

Editor článkov TinyMCE v PHP - Databázy v PHP pre začiatočníkov

Článok uložte do databázy. Pokračovať budeme zas v budúcej lekcii, Ners - Výpis článkov v PHP .


 

Predchádzajúci článok
Ners - Registrácia užívateľov v PHP
Všetky články v sekcii
Databázy v PHP pre začiatočníkov
Preskočiť článok
(neodporúčame)
Ners - Výpis článkov v PHP
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
1 hlasov
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity