PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 12-01-2016 19:21:27

lemzo
Membre
Inscription : 12-01-2016
Messages : 3

Classe Panier et son manager en php orirnté Objet

Bonjour Messieurs,
je suis nouveau dans le domaine
mes preoccupations sont:

***Comment implémenter une classe panier avec attributs, setters, getters, constructeur ....?
***comment implémenter la classe qui gère cette classe panier?
***comment enregistrer les données dans la base de données?


j'ai un exemple de construction de panier que je comprends bien mais mon probleme est: Comment le transformer en programmation objet?
voici le script:

<?php
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/*                Fonctions de base de gestion du panier                   */
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */

/**
* Ajoute un article dans le panier après vérification que nous ne sommes pas en phase de paiement
*
* @param array  $select variable tableau associatif contenant les valeurs de l'article
* @return Mixed Retourne VRAI si l'ajout est effectué, FAUX sinon voire une autre valeur si l'ajout
*               est renvoyé vers la modification de quantité.
* @see {@link modif_qte()}
*/
function ajout($select)
{
    $ajout = false;
    if(!isset($_SESSION['panier']['verrouille']) || $_SESSION['panier']['verrouille'] == false)
    {
        if(!verif_panier($select['id']))
        {
            array_push($_SESSION['panier']['id_article'],$select['id']);
            array_push($_SESSION['panier']['qte'],$select['qte']);
            array_push($_SESSION['panier']['taille'],$select['taille']);
            array_push($_SESSION['panier']['prix'],$select['prix']);
            $ajout = true;
        }
        else
        {
            $ajout = modif_qte($select['id'],$select['qte']);
        }
    }
    return $ajout;
}

/**
* Modifie la quantité d'un article dans le panier après vérification que nous ne somme pas en phase de paiement
*
* @param String $ref_article    Identifiant de l'article à modifier
* @param Int $qte               Nouvelle quantité à enregistrer
* @return Mixed                 Retourne VRAI si la modification a bien eu lieu,
*                               FAUX sinon,
*                               "absent" si l'article est absent du panier,
*                               "qte_ok" si la quantité n'est pas modifiée car déjà correctement enregistrée.
*/
function modif_qte($ref_article, $qte)
{
    /* On initialise la variable de retour */
    $modifie = false;
    if(!isset($_SESSION['panier']['verrouille']) || $_SESSION['panier']['verrouille'] == false)
    {
        if(nombre_article($ref_article) != false && $qte != nombre_article($ref_article))
        {
            /* On compte le nombre d'articles différents dans le panier */
            $nb_articles = count($_SESSION['panier']['id_article']);
            /* On parcoure le tableau de session pour modifier l'article précis. */
            for($i = 0; $i < $nb_articles; $i++)
            {
                if($ref_article == $_SESSION['panier']['id_article'][$i])
                {
                    $_SESSION['panier']['qte'][$i] = $qte;
                    $modifie = true;
                }
            }
        }
        else
        {
            /* L'article est absent du panier, donc on ne peut pas modifier la quantité ou bien
            * le nombre est exactement le même et il est inutile de le modifier
            * Si l'article est absent, comme on a ni la taille  ni le prix, on ne peut pas l'ajouter
            * Si le nombre est le même, on ne fait pas de changement. On peut donc retourner un autre
            * type de valeur pour indiquer une erreur qu'il faudra traiter à part lors du retour d'appel
            */
            if(nombre_article($ref_article) != false)
            {
                $modifie = "absent";
            }
            if($qte != nombre_article($ref_article))
            {
                $modifie = "qte_ok";
            }
        }
    }
    return $modifie;
}

/**
* Supprimer un article du panier après vérification que nous ne somme pas en phase de paiement
*
* @param String     $ref_article numéro de référence de l'article à supprimer
* @return Mixed     Retourne TRUE si la suppression a bien été effectuée,
*                   FALSE sinon, "absent" si l'article était déjà retiré du panier
*/
function supprim_article($ref_article)
{
    $suppression = false;
    if(!isset($_SESSION['panier']['verrouille']) || $_SESSION['panier']['verrouille'] == false)
    {
        /* On vérifie que l'article à supprimer est bien présent dans le panier */
        if(nombre_article($ref_article) != false)
        {
            /* création d'un tableau temporaire de stockage des articles */
            $panier_tmp = array("id_article"=>array(),"qte"=>array(),"taille"=>array(),"prix"=>array());
            /* Comptage des articles du panier */
            $nb_articles = count($_SESSION['panier']['id_article']);
            /* Transfert du panier dans le panier temporaire */
            for($i = 0; $i < $nb_articles; $i++)
            {
                /* On transfère tout sauf l'article à supprimer */
                if($_SESSION['panier']['id_article'][$i] != $ref_article)
                {
                    array_push($panier_tmp['id_article'],$_SESSION['panier']['id_article'][$i]);
                    array_push($panier_tmp['qte'],$_SESSION['panier']['qte'][$i]);
                    array_push($panier_tmp['taille'],$_SESSION['panier']['taille'][$i]);
                    array_push($panier_tmp['prix'],$_SESSION['panier']['prix'][$i]);
                }
            }
            /* Le transfert est terminé, on ré-initialise le panier */
            $_SESSION['panier'] = $panier_tmp;
            /* Option : on peut maintenant supprimer notre panier temporaire: */
            unset($panier_tmp);
            $suppression = true;
        }
        else
        {
            $suppression == "absent";
        }
    }
    return $suppression;
}

/**
* Supprimer un article du panier : autre méthode.
*
* @param String     $ref_article numéro de référence de l'article à supprimer
* @param Boolean    $reindex : facultatif, par défaut, vaut true pour ré-indexer le tableau après
*                   suppression. On peut envoyer false si cette ré-indexation n'est pas nécessaire.
* @return Mixed     Retourne TRUE si la suppression a bien été effectuée,
*                   FALSE sinon, "absent" si l'article était déjà retiré du panier
*/
function supprim_article2($ref_article, $reindex = true)
{
    $suppression = false;
    if(!isset($_SESSION['panier']['verrouille']) || $_SESSION['panier']['verrouille'] == false)
    {
        $aCleSuppr = array_keys($_SESSION['panier']['id_article'], $ref_article);

        /* sortie la clé a été trouvée */
        if (!empty ($aCleSuppr))
        {
            /* on traverse le panier pour supprimer ce qui doit l'être */
            foreach ($_SESSION['panier'] as $k=>$v)
            {
                foreach($aCleSuppr as $v1)
                {
                    unset($_SESSION['panier'][$k][$v1]);    // remplace la ligne foireuse
                }
                /* Réindexation des clés du panier si l'option $reindex a été laissée à true */
                if($reindex == true)
                {
                    $_SESSION['panier'][$k] = array_values($_SESSION['panier'][$k]);
                }
                $suppression = true;
            }
        }
        else
        {
            $suppression = "absent";
        }
    }
    return $suppression;
}

/**
* Fonction qui supprime tout le contenu du panier en détruisant la variable après
* vérification qu'on ne soit pas en phase de paiement.
*
* @return Mixed    Retourne VRAI si l'exécution s'est correctement déroulée, Faux sinon et "inexistant" si
*                  le panier avait déjà été détruit ou n'avait jamais été créé.
*/
function vider_panier()
{
    $vide = false;
    if(!isset($_SESSION['panier']['verrouille']) || $_SESSION['panier']['verrouille'] == false)
    {
        if(isset($_SESSION['panier']))
        {
            unset($_SESSION['panier']);
            if(!isset($_SESSION['panier']))
            {
                $vide = true;
            }
        }
        else
        {
            /* Le panier était déjà détruit, on renvoie une autre valeur exploitable au retour */
            $vide = "inexistant";
        }
    }
    return $vide;
}

/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/*                 Fonctions annexes de gestion du panier                  */
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */

/**
* Vérifie la quantité enregistrée d'un article dans le panier
*
* @param String $ref_article référence de l'article à vérifier
* @return Mixed Renvoie le nombre d'article s'il y en a, ou Faux si cet article est absent du panier
*/
function nombre_article($ref_article)
{
    /* On initialise la variable de retour */
    $nombre = false;
    /* Comptage du panier */
    $nb_art = count($_SESSION['panier']['id_article']);
    /* On parcoure le panier à la recherche de l'article pour vérifier le cas échéant combien sont enregistrés */
    for($i = 0; $i < $nb_art; $i++)
    {
        if($_SESSION['panier']['id_article'][$i] == $ref_article)
        $nombre = $_SESSION['panier']['qte'][$i];
    }
    return $nombre;
}

/**
* Calcule le montant total du panier
*
* @return Double
*/
function montant_panier()
{
    /* On initialise le montant */
    $montant = 0;
    /* Comptage des articles du panier */
    $nb_articles = count($_SESSION['panier']['id_article']);
    /* On va calculer le total par article */
    for($i = 0; $i < $nb_articles; $i++)
    {
        $montant += $_SESSION['panier']['qte'][$i] * $_SESSION['panier']['prix'][$i];
    }
    /* On retourne le résultat */
    return $montant;
}

/**
* Vérifie la présence d'un article dans le panier
*
* @param String $ref_article référence de l'article à vérifier
* @return Boolean Renvoie Vrai si l'article est trouvé dans le panier, Faux sinon
*/
function verif_panier($ref_article)
{
    /* On initialise la variable de retour */
    $present = false;
    /* On vérifie les numéros de références des articles et on compare avec l'article à vérifier */
    if( count($_SESSION['panier']['id_article']) > 0 && array_search($ref_article,$_SESSION['panier']['id_article']) !== false)
    {
        $present = true;
    }
    return $present;
}

/**
* Fonction de verrouillage du panier pendant la phase de paiement.
*
*/
function preparerPaiement()
{
    $_SESSION['panier']['verrouille'] = true;
    header("Location: URL_DU_SITE_DE_BANQUE");
}

/**
* Fonction qui va enregistrer les informations de la commande dans
* la base de données et détruire le panier.
*
*/
function paiementAccepte()
{
    /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
    /*   Stockage du panier dans la BDD   */
    /* ajoutez ici votre code d'insertion */
    /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
    unset($_SESSION['panier']);
}

mon objectif est de comprendre le fonctionnement
comme je suis nouveau, je vous demanderais de rentrer dans les détails s'il vous plait .
je vous remercie d'avance.


Hors ligne

#2 19-01-2016 12:15:39

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 624
Site Web

Re : Classe Panier et son manager en php orirnté Objet

Bonjour,

Votre question couvre quasiment quelques chapîtres d'une bonne formation sur la programmation orientée objet.
En gros voici la structure de base


class monPanier{
   private $panier=array(); // variable qui va stocker ce que vous stockez actuellement en session : tableau multidimensionel
   
   public function add_item(array $item){
     // méthode pour ajouter un item $item à la variable $panier
  }

  // getter global pour votre panier.
  public function get_panier(){
      return $this->panier;
  }
}
 

Ceci n'est qu'un exemple très sommaire. Ensuite il vous faudra sérialiser votre classe en SESSION pour gérer la persistence de votre panier.

++


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#3 20-01-2016 02:07:39

lemzo
Membre
Inscription : 12-01-2016
Messages : 3

Re : Classe Panier et son manager en php orirnté Objet

voici un exemple de panier que j'ai touve sur le net.
Mais mon principal probleme est que je veux comprendre le mecanisme d'un site de commerce .
comment stocker les informations du panier dans la base de données?
la classe PanierManager qui gere la classe panier avec les methodes CRUD à quoi ressemble t elle ?
Pouvez vous m'indiquer un toto qui me permettra de maitriser la conception de site de vente en ligne .Merci
voici l'exemple:

<?php
class Panier
{   
    public $lignes;                          //Chaque Ligne de Panier est gardée dans un tableau associatif $this->lignes[$code] => $LignePanier
    public $nbProduits;

   
            function    __construct()   
            {   
                $this->nbProduits =    0;                                        //On commence avec zéro    produits dans le panier       
            }
           
            function ajouterProduit($code,$nom,$prix)   
            {   
                if($this->nbProduits==0)   
                {   
                    $prod=new Produit($code,$nom,$prix);   
                    $lp=new    LignePanier($prod);   
                    $this->lignes[$code]=$lp;                            //On va    créer le tableau lors de l’ajout du    premier    produit    au panier                                           
                    $this->nbProduits=1;
                    /*$this->lignes[$code]=new    LignePanier(new Produit($code,$nom,$prix));*/                   
                }
                else   
                {   
                    if(isset($this->lignes[$code]))                            //Pour ajouter,    on vérifie si le produit est déjà dans le panier
                    {   
                        $lp    = $this->lignes[$code];                            //S’il y est, on le récupère        
                        $qte=$lp->qte;                                        //et on met à jours la quantité
                        $lp->qte=$qte+1;   
                    }   
                    else                                                    //S’il    n’y    est    pas
                    {       
                        $prod=new Produit($code,$nom,$prix);                //on va y ajouter une nouvelle ligne de panier
                        $lp=new    LignePanier($prod);   
                                                               
                        $this->lignes[$code]=$lp;   
                        $this->nbProduits=$this->nbProduits    +1;   
                    }   
                }
           
                    if(isset($this->lignes[$code]))                            //On ne    supprime que si le produit est dans    le panier
                    {
                        $lp=$this->lignes[$code];                            //S’il y est, on le récupère
                        $lp->qte=$lp->qte-1;                                //et on met à jours la quantité en supprimant 1    unité
                       
                        if(    $lp->qte<1)                                        //Par contre, s’il ne reste    plus rien qte<1)
                        {   
                             unset($this->lignes[$code]);                    //on supprime la ligne de panier du    tableau
                             $this->nbProduits=$this->nbProduits-1;   
                        }   
                    }
            }
}

Hors ligne

#4 23-01-2016 12:39:21

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 624
Site Web

Re : Classe Panier et son manager en php orirnté Objet

Bonjour,

Essayons de répondre à vos questions

comment stocker les informations du panier dans la base de données?

Pour stocker les informations du panier dans la base de données, il faut d'abord créer votre base de données sur un serveur SGBDR (Serveur Général de bases de Données Relationnelles), apprendre à la modéliser, à y structurer vos données correctement et apprendre le SQL afin de pouvoir requêter vos données qui y sont stockées. Voilà dans un premier temps pour vous faire une idée.

la classe PanierManager qui gere la classe panier avec les methodes CRUD à quoi ressemble t elle ?

Avant de rentrer dans le code, sachez que cela dépends de l'architecture de votre application. Il y a plusieurs écoles.. En fait il y en a deux :
1) Applications qui pilotent les données au niveau serveur tiers (PHP,Node,Java,...) qui sont des serveurs de type objet.
2) Applications qui pilotent les données au plus proche des données, c'est à dire au niveau du SGBDR qui est un serveur de type relationnel.

1) Exemples : Tous les CMS du marché : WordPress, Prestashop, Magento, Joomla, etc, etc...
Avantages : La modélisation objet des données, permet de délivrer des applications toutes faites très rapidement (back office, etc...).
Inconvénients : 1) Le SGBDR n'est pas optimisé, et en général les CMS les utilisent pour "y faire de la persistence de classes".
                       2) L'application, du fait d'un SGBDR non optimisé, va perdre en performance au fur et à mesure, que la quantité de donnée augmente et que la charge augmente, et le rapport est loin d'être linéaire...
                       3) Pour vous en convaincre: Rechercher une ligne sur 1 million d'enregistrements peut prendre quelques millisecondes sur un SGBDR, tandis qu'en objet, il faut faire de l'itératif pour la trouver et cela peut prendre environ 20minutes....
                       4) Risques de bugs et de perte d'intégrité des données importante.

2) Aujourd'hui se sont des applications développées par des sociétés, en général en développement sur mesure. Si les solutions logicielles sont déjà faites dans ce contexte, il s'agit d'applications dans lesquelles la préservation, la qualité, la cohérence et l'intégrité des données est la priorité absolue. Je développe de telles applications. Pour ma part, j'estime que tel devrait être la priorité pour toutes les entreprises, et surtout dans la conjoncture actuelle. Or la conjoncture actuelle, fait, à tort, que l'aspect financier à court terme est privilégié et s'orientent plus facilement vers des CMS, et ça leur coûte le plus souvent leur société à terme.

Pour les processus de gestion
1er cas (cf ci-dessus), votre référentiel de données, lorsqu'il est chargé de la bases de données, sont les données de votre classe (vos classes).
Note: il vous faut travailler dans tous les cas de figure sur les identifiants techniques numériques de vos entités de données.
Sur l'ajout d'enregistrement: a) vous vérifiez que le produit à rajouter n'est pas présent dans votre cache de données (classe)
b) Si ce n'est pas le cas vous l'ajoutez à votre cache puis faites un insert en bases de données. Ou alors vous faites une mise à jour globale du cache en bases de données sur demande de sauvegarde de l'utilisateur (pas top).
c) S'il est présent, faut mettre à jour la quantité du produit concerné dans le cache, puis faites un update en bases de données.
Sur la modification d'enregistrement: a) Vérifiez que le produit à modifié est présent dans votre cache de données
b) Si ce n'est pas le cas vous l'ajoutez à votre cache ... (idem que pour l'ajout b)).
c) S'il est présent, faut mettre à jour toutes les informations se rapportant à l'article en cache, puis faire un update en bases de données pour cet article.
etc... pour les autres opérations CRUD

2e cas : pilotage des données en SGBDR
Note: vous avez le cache à jour des données affichées dans votre classe.
a) vérifiez toujours l'existence de vos données avant de faire quoi que ce soit.
b) Que ca soit pour un ajout, une mise à jour multiple, etc.., faites le d'abord en bases de données et uniquement sur les données concernées, et en cas de retour "OK" du SGBDR, mettez à jour votre cache dans votre/vos classes PHP, sinon retournez un message d'erreur et ne modifiez pas vos données sur votre serveur PHP.

Voilà, j'espère vous avoir aidé smile Bon week-end smile

Note: Pour interroger votre bases de données, et y effectuer toute opération CRUD, et d'autres, il vous faut passer par une couche dite "Modèle" à travers un outil tel que PDO (que je vous recommande fortement).

Dernière modification par Jc (23-01-2016 12:43:03)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#5 24-01-2016 03:07:33

lemzo
Membre
Inscription : 12-01-2016
Messages : 3

Re : Classe Panier et son manager en php orirnté Objet

Merci pour votre contribution.
Et je suis de votre avis
Seulement un petit exemple de panierManager avec la connexion PDO m'aiderai beaucoup car il ne faut pas perdre de vue que nous sommes des debutants
sans oublier de nous indiquer des tutos en la matière pour nous permettre de bien cerner le problème.
Encore une fois GRAND MERCI ET BON WEEK END à vous aussi

Hors ligne

#6 29-03-2016 14:33:43

carterspatacus
Membre
Inscription : 29-03-2016
Messages : 1

Re : Classe Panier et son manager en php orirnté Objet

bonjour svp plais je suis nouveau j'ai bien aimé la construction du panier alors je voudrais avoir le script pour enregistrer le panier dans une base de donnée.puisque dans la fonction :
function paiementAccepte()
{
    /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
    /*   Stockage du panier dans la BDD   */
    /* ajoutez ici votre code d'insertion */
    /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
    unset($_SESSION['panier']);
}
on ne met pas le script une voudrais s'il vous plait avoir ce scrript (Stockage du panier dans la BDD   */
    /* ajoutez ici votre code d'insertion */)
si quelqu'un vois ce message s'il vous plait qu'il reponde merci

Hors ligne

#7 12-04-2016 09:11:51

Jc2
Membre
Lieu : Zillisheim - Alsace
Inscription : 23-03-2016
Messages : 12
Site Web

Re : Classe Panier et son manager en php orirnté Objet

Bonjour,

Désolé mais conformément à la charte de ce forum, nous ne fournissons pas de scripts tout prêts, mais nous essayons de vous aider à construire le votre en vous aidant à comprendre ce que vous faites.

Bonne journée.

Hors ligne

Pied de page des forums