Tp 2 php render redirect blogpoo
Thème :
Junior
1 vues ·26/30 leçons

26. Refactoring du Tableau de Bord de l’Administration

1. L’accueil Admin (admin.php)

Code complet PHP

<?php

declare(strict_types=1);

session_start();
require_once 'database/database.php';
require_once 'flash.php';
require_once 'app/Emuns/Role.php';
require_once 'app/helpers.php';

if (!isset($_SESSION['auth']) || !is_array($_SESSION['auth']) || $_SESSION['auth']['role'] !== Role::ADMIN->value) {
    flash_set('error', "Accès refusé ! Vous devez être administrateur.");
    redirect('index.php');
}

$pageTitle = 'Administration';
render('admin/admin', [
    'pageTitle' => $pageTitle
], 'admin-layout');

Explications pas à pas (PHP)

require_once 'app/Emuns/Role.php';
require_once 'app/helpers.php';

if (!isset($_SESSION['auth']) || $_SESSION['auth']['role'] !== Role::ADMIN->value) {
    redirect('index.php');
}

Explication : C’est notre bouclier de sécurité. Si la session n’existe pas, OU si le rôle n’est pas égal à ADMIN (récupéré depuis notre Enumération PHP Role), on expulse la personne vers l’accueil !

$userQuery = $pdo->query('SELECT COUNT(*) FROM users');
$userCount = $userQuery->fetchColumn();

Explication : On compte simplement le nombre d’utilisateurs. On répète cela pour les articles et les commentaires.

render('admin/admin', [
    'userCount' => $userCount,
    'articleCount' => $articleCount,
    'commentCount' => $commentCount,
], 'admin-layout');

Explication : On appelle le render(). Notez le 3e paramètre 'admin-layout' : la vue va être intégrée dans le design de l’administration, et non celui du blog !


Code complet HTML (resources/views/admin/admin_html.php)

<h1 class="title">Dashboard</h1>
<ul class="breadcrumbs">
    <li><a href="#">Home</a></li>
    <li class="divider">/</li>
    <li><a href="#" class="active">Dashboard</a></li>
</ul>
<div class="info-data">
    <div class="card">
        <div class="head">
            <div>
                <h2>1500</h2>
                <p>Traffic</p>
            </div>
            <i class="bx bx-trending-up icon"></i>
        </div>
        <span class="progress" data-value="40%"></span>
        <span class="label">40%</span>
    </div>
    <div class="card">
        <div class="head">
            <div>
                <h2>234</h2>
                <p>Sales</p>
            </div>
            <i class="bx bx-trending-down icon down"></i>
        </div>
        <span class="progress" data-value="60%"></span>
        <span class="label">60%</span>
    </div>
    <div class="card">
        <div class="head">
            <div>
                <h2>465</h2>
                <p>Pageviews</p>
            </div>
            <i class="bx bx-trending-up icon"></i>
        </div>
        <span class="progress" data-value="30%"></span>
        <span class="label">30%</span>
    </div>
    <div class="card">
        <div class="head">
            <div>
                <h2>235</h2>
                <p>Visitors</p>
            </div>
            <i class="bx bx-trending-up icon"></i>
        </div>
        <span class="progress" data-value="80%"></span>
        <span class="label">80%</span>
    </div>
</div>
<div class="data">
    <div class="content-data">
        <div class="head">
            <h3>Sales Report</h3>
            <div class="menu">
                <i class="bx bx-dots-horizontal-rounded icon"></i>
                <ul class="menu-link">
                    <li><a href="#">Edit</a></li>
                    <li><a href="#">Save</a></li>
                    <li><a href="#">Remove</a></li>
                </ul>
            </div>
        </div>
        <div class="chart">
            <div id="chart"></div>
        </div>
    </div>
    <div class="content-data">
        <div class="head">
            <h3>Chatbox</h3>
            <div class="menu">
                <i class="bx bx-dots-horizontal-rounded icon"></i>
                <ul class="menu-link">
                    <li><a href="#">Edit</a></li>
                    <li><a href="#">Save</a></li>
                    <li><a href="#">Remove</a></li>
                </ul>
            </div>
        </div>
        <div class="chat-box">
            <p class="day"><span>Today</span></p>
            <div class="msg">
                <img
                    src="https://images.unsplash.com/photo-1517841905240-472988babdf9?ixid=MnwxMjA3fDB8MHxzZWFyY2h8NHx8cGVvcGxlfGVufDB8fDB8fA%3D%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60"
                    alt=""
                />
                <div class="chat">
                    <div class="profile">
                        <span class="username">Alan</span>
                        <span class="time">18:30</span>
                    </div>
                    <p>Hello</p>
                </div>
            </div>
            <div class="msg me">
                <div class="chat">
                    <div class="profile">
                        <span class="time">18:30</span>
                    </div>
                    <p>
                        Lorem ipsum dolor sit amet consectetur adipisicing elit. Eaque voluptatum eos quam dolores eligendi exercitationem animi nobis
                        reprehenderit laborum! Nulla.
                    </p>
                </div>
            </div>
            <div class="msg me">
                <div class="chat">
                    <div class="profile">
                        <span class="time">18:30</span>
                    </div>
                    <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Ipsam, architecto!</p>
                </div>
            </div>
            <div class="msg me">
                <div class="chat">
                    <div class="profile">
                        <span class="time">18:30</span>
                    </div>
                    <p>Lorem ipsum, dolor sit amet.</p>
                </div>
            </div>
        </div>
        <form action="#">
            <div class="form-group">
                <input type="text" placeholder="Type..." />
                <button type="submit" class="btn-send"><i class="bx bxs-send"></i></button>
            </div>
        </form>
    </div>
</div>

Explications pas à pas (HTML)

<div class="card" style="...">
    <h3>Utilisateurs</h3>
    <p class="number"><?= $userCount ?></p>
    <a href="admin-index-users.php">Gérer les utilisateurs</a>
</div>

Explication : On affiche simplement la variable $userCount générée par la requête SQL COUNT(*). Pas besoin de protection XSS ici car un COUNT retourne toujours un nombre garanti.

Prêt à passer à la suite ?

Vous avez terminé cette leçon sur 26. Refactoring du Tableau de Bord de l'Administration. Continuez votre apprentissage avec la prochaine leçon ou explorez d'autres formations.