[PHP] Système de "Portfolio" avec trie par catégorie

Westiix

Fortnite Player || PHP & VB.NET
Premium
Inscription
5 Octobre 2011
Messages
2 219
Réactions
88
Points
12 753
=========================================
Introduction
=========================================
Dans ce tutoriel, je vais vous apprendre à crée
un système de portfolio avec trie par catégorie (de la création de la base de donnée à la création de class PHP pour gérer le système) .

=========================================
Requis
=========================================


Pour ce tutoriel, vous aurez besoin :
- d'un éditeur de code HTML/PHP etc.. (NotePad++ peut très bien faire l'affaire, perso j'utilise )
- d'une plateforme de développement WEB (
; etc... , perso j'utilise WampServer)
- d'une base de donnée MYSQL

Pour ce tutoriel, J'ai utilisé le css de bootstrap et le template


=========================================
Base de donnée
=========================================
Commencé par crée notre base de donnée :
1) Rendez-vous sur
votre phpMyAdmin (pour ma part localhost/phpmyadmin/) et identifiez-vous
2) Crée une nouvelle base de donnée (pour ma part je vais mettre portfolio)
a39d6306a4684dfdbb2d1c28a6f09c82.png


3) Crée une nouvelle table et appelé la
categories , avec 2 colonnes comme ci-dessous :
c7634558a82d4b56bd0209ce7ba28c38.png


4) Crée une nouvelle table et appelé la creations , avec 4 colonnes comme ci-dessous :

d534f19ddb7544bea767fa2c590154e6.png




5) Insérer plusieurs entrés (catégories) via phpMyAdmin dans la table categories
6de6d744d37341d1a097838528c66332.png


5) Insérer plusieurs entrés (creations) via phpMyAdmin dans la table creations


=========================================
Codons notre script
=========================================
1) On commence par
la connexion à la base de donnée (pour le tuto, je le met tout en haut de la page, celle où il y aura les créations) :
d65545afd1a04223a9f33c0416062463.png
PHP:
<?php
    $pdo = new PDO('mysql:host=localhost;dbname=portfolio', 'root', 'root');
?>
2) Pour nous facilité le travail, on va se crée des class , une class qui se chargera de gérer les catégories et une class qui se chargera de gérer les créations .



Dans votre dossier class (si vous n'en avez pas, je vous conseil de le crée pour bien s'y retrouver) , on va crée un nouveau fichier appelé categories.class.php et crée la structure de base de la class :
6e5ec8ca3469466db6e3900f8892a2e2.png


Dans cette class, on effectuera des requêtes à notre base de donnée donc il faut récupérer la connexion à notre base de donnée :
4992da941c2c42d095a9e61d91aeca20.png
PHP:
<?php
    class categories{

        private $PDO;

        /**
         * Récupère la connexion à notre base de donnée directement quand on instancie la class en faisant :
         * $categorie = new categories($pdo) | "$pdo" contiens la connexion à notre base de donnée, sur la page où on a crée la connexion à PDO

         private $PDO récuperera notre connexion PDO via le constructeur de la class
         */
        public function __construct($pdo){
            $this->PDO = $pdo;
        }


On va crée une fonction qui permettra de récupérer la connexion à PDO , celle que l'on aura stocké dans "private $PDO;" via le constructeur de la class :
67959566c28547aba68c6abfffcd4537.png
PHP:
<?php
    class categories{

        private $PDO;

        /**
         * Récupère la connexion à notre base de donnée directement quand on instancie la class en faisant :
         * $categorie = new categories($pdo) | "$pdo" contiens la connexion à notre base de donnée, sur la page où on a crée la connexion à PDO

         private $PDO récuperera notre connexion PDO via le constructeur de la class
         */
        public function __construct($pdo){
            $this->PDO = $pdo;
        }

        /**
         * Permet de retourné l'instance PDO (connexion à la base de donnée) stocké dans notre "private $PDO;"
         */
        private function getPDO(){
            return $this->PDO;
        }
    }
Maintenant on rentre dans le vif du sujet, on va crée une fonction qui va s'occuper de récupérer nos catégories :
fdbc7e48e4bc4587971e83e2f36935b9.png
PHP:
/**
         * Récupère toutes mes catégories sous forme de bouton (envoie des données par $_GET)
         *
         * Utilisation : getCategories('categorie');
         *     Rendu de l'URL : mapage.php?categorie=X;
         *
         * Exemple : getCategories('type');
         *     Rendu de l'URL : mapage.php?type=X;
         */
        public function getCategories($keyGET){
            $req = $this->getPDO()->query("SELECT * FROM categories"); // On récupère toutes nos catégories
            $nbCategories = $req->rowCount(); // On compte le nombre de ligne il y a (donc le nombre de catégories)

            if($nbCategories > 0){
            // SI $nbCategories est SUPERIEUR à 0 , on affiche le bouton pour enlever le filtre (enlevé le $_GET)

                // SI on a un $_GET['categorie'] dans l'URL (donc mapage.php?$keyGET=X) ALORS on affiche le bouton pour enlever le filtre actuel, sinon le bouton n'est pas générer
                if(isset($_GET[$keyGET]) && !empty($_GET[$keyGET])){
                    echo "<a href='index.php' class='btn btn-warning' style='margin-bottom: 25px;'>Retour</a> ";
                }

                // SI $nbCategories est SUPERIEUR à 0 (donc qu'il y a au moins 1 catégorie) , on affiche les boutons pour filtré les créations
                while ($infosCategories = $req->fetch()) {
                    echo "<a href='?{$keyGET}={$infosCategories['name_categories']}' class='btn btn-primary' style='margin-bottom: 25px;'>Trié par {$infosCategories['name_categories']}</a> ";
                }
            }
            /*
            else {
                SI il y a aucune catégorie, on execute ce code (dans notre cas, sa ne sert à rien)
            }
            */
        }
Dans votre dossier class , dupliquer votre class categories.class.php et renommer le fichier (celui que vous avez obtenu en dupliquant la class categories.class.php) en creations.class.php

Ensuite ouvrez-le, modifier le nom de la class (dans le fichier) :
5754816d94cc418cb0690e06c66accbe.png


Maintenant
on efface la fonction qui concerne les catégories (puisque la on est dans la class qui gères les créations) :
7192a57556c34b2eb1fa6e2273f10d99.png


Il y a plus cas
crée la fonction qui récupères les créations :​
PHP:
public function getCreations($keyGET){
            if(isset($_GET[$keyGET]) && !empty($_GET[$keyGET])){
            // Si le $_GET[$keyGET] existe dans l'URL et qu'il est remplit, on va vérifier que la catégorie existe bien

                $recupGET = $this->getPDO()->prepare("SELECT * FROM categories WHERE name_categories = ?");
                $recupGET->execute(array($_GET[$keyGET]));

                // On regarde si on a une ligne qui a pour name_categorie = $keyGET
                $retourCategorie = $recupGET->rowCount();
                if($retourCategorie === 1){
                // Si la catégorie existe, on continue notre script et on récupère les créations comportant le nom de la catégorie
                    $recupCreationsCategorie = $this->getPDO()->prepare("SELECT * FROM creations WHERE categorie_creations = ?");
                    $recupCreationsCategorie->execute(array($_GET[$keyGET]));

                    // On regarde combien il  y a de création avec le nom de la catégorie passé en $_GET (dans l'URL)
                    $nbCreationsCategorie = $recupCreationsCategorie->rowCount();
                    if($nbCreationsCategorie > 0){
                        // Si on a au moins 1 creations dans la catégorie passé en $_GET, on l'affiche
                   
                        // On fait une boucle pour afficher toutes les créations comportant le nom de la categorie passé en $_GET (dans l'URL)
                        while ($infosCreationsCategorie = $recupCreationsCategorie->fetch()) {
                            echo "<div class='col-md-2 portfolio-item'>";
                                echo "<img class='img-responsive' src='{$infosCreationsCategorie['url_creations']}'>";
                            echo "</div>";
                        }

                    } else {
                        // SI on a aucune creations de cette catégorie,  on affiche un message disant qu'il n'y aucune création dans cette catégorie
                        echo "<div class='alert alert-danger'>Aucune création dans cette catégorie pour le moment</div>";
                    }

                } else {
                    // Si la catégorie n'existe pas, on affiche un message et redirige au bout de X secondes
                    echo "<div class='alert alert-danger'>
                            <b>Cette catégorie n'existe pas !</b> <br />
                            Vous allez etre rediriger dans <b>3 secondes</b> .
                        </div>";
                    echo "<meta http-equiv='refresh' content='3;url=index.php' />";

                }

            } else {
                // Si il y a aucun $_GET ALORS

                $recupCreations = $this->getPDO()->query("SELECT * FROM creations");

                // On regarde combien il  y a de création avec le nom de la catégorie passé en $_GET (dans l'URL)
                $nbCreations = $recupCreations->rowCount();
                if($nbCreations > 0){
                    while ($infosCreations = $recupCreations->fetch()) {
                        echo "<div class='col-xs-2 portfolio-item'>";
                            echo "<img class='img-responsive' src='{$infosCreations['url_creations']}'>";
                        echo "</div>";
                    }
                } else {
                    // SI on a aucune creations,  on affiche un message disant qu'il n'y aucune création
                    echo "<div class='alert alert-danger'>Aucune création</div>";
                }
            }
        }
On retourne sur notre page où il y aura les catégories et les créations et tout en haut du code, on va inclure et instanciés nos class fraîchement crée :
50f263330dd9403e9abe3241ac2b7ebd.png
PHP:
<?php
    // On crée une connexion vers notre base de donnée
    $pdo = new PDO('mysql:host=localhost;dbname=portfolio', 'root', 'root');

    // On demande a inclure notre class "categories"
    require('class/categories.class.php');

    // On demande a inclure notre class "creations"
    require('class/creations.class.php');

    // On instancie notre class "categories" en récupérant la connexion vers notre base de donnée
    $categories = new categories($pdo);

    // On instancie notre class "creations" en récupérant la connexion vers notre base de donnée
    $creations = new creations($pdo);
?>

Puis là où vous voulez afficher vos boutons (pour filtré par catégorie) et vos créations, il vous suffit de faire :
PHP:
<?php
    /* On récupère nos boutons pour filtré par catégories
    *
    *$keyGET = le nom du $_GET
Exemple :
$exKeyGET = 'type';
Resultat = $_GET['type'];
    */
$keyGET = 'categorie';
    $categories->getCategories($keyGET);

    // On récupère nos créations
    $creations->getCreations($keyGET);
?>
Voilà, c'est tout pour ce tutoriel !

=========================================
Résultat final
=========================================

1474803632-tuto-rgfr-portfolio-westiix.gif
 
Dernière édition:

Louki

Ancien staff
Inscription
12 Mars 2021
Messages
7 536
Réactions
4 583
Points
10 116
Sinon en CSS/JS c'est simple aussi :trollface:

Merci du tuto, super ! Par contre, éviter de centrer les balises code ::p:
 
Haut