Donner un identifiant à une instance de class ?

Mammouth du PHP | 959 Messages

02 août 2009, 00:57

Bonsoir tout le monde :)

Je développe actuellement un panier, qui se porte très bien d'ailleurs :)
Mais je voudrais limiter son envergure sur le site :

C'est un site où il y a plusieurs galeries d'images, mais je voudrais que le panier porte seulement sur UNE galerie.
Or, ce n'est pas le cas, après moi je ne sais plus dans la quelle le client a cliqué sur "Ajouter au panier".
Inutile de me dire que j'ai qu'a rajouter l'identifiant de la galerie devant le nom de la photo par exemple ^^ Parce-que chaque client s'intéressera uniquement à une galerie et pourra remplir uniquement le panier avec leur galerie.
Donc c'est inutile d'étendre l'envergure du panier sur tout le site.

Se que j'ai pensé et se que j'aimerais bien faire, si c'est possible bien sûr, c'est de donner une sorte d'identifiant à chaque panier de chaque galerie.
Comment feriez vous ça ? Quelle est la meilleure méthode ?

Merci de vos réponses :)
PS: Bon travail sur le forum :) J'aime bien le fond d'écran Macintosh dans l'header xD

Mammouth du PHP | 991 Messages

02 août 2009, 01:22

'Jour
    public static function getInstance ($id ) {
        
		if(null === self::$_instance[$id])
            self::$_instance[$id] = new self($id);
        return self::$_instance[$id];
    }
	
Je dirais un truc du genre , apres tu construit la requete autour de l'id ^^

utilisation du genre : panier::getInstance('Gal_jaeur');

enfin t'etre que l'heure me rend confu mais t'etre une idée a creuser :)
Bye Hawk
DevOps, Symfony4, Hoa

Mammouth du PHP | 959 Messages

02 août 2009, 01:43

Salut :)

Je ne comprends où tu veux en venir avec ce bout de code, et comment l'exploiter :)

Merci d'avance !

Mammouth du PHP | 991 Messages

02 août 2009, 01:50

Sorry :=)

Alors je pensais :
Tu crée un singleton de ton panier que tu référence en fonction de ton instance.

Ensuite à chaque appel tu récupère le panier en question.

Tu ne vois pas ? peut être que j'ai faut , attend une réponse de pro ^^ :)

Bye Hawk
DevOps, Symfony4, Hoa

Mammouth du PHP | 959 Messages

02 août 2009, 01:55

Pour schématiser, comme on parle de "panier", voire même "caddie" sur certain sites, alors :

Imagine que tu es dans un magasin et que tu prends un panier par rayon (un rayon représente en fait une galerie sur mon site).
Et chacun de tes paniers sont indépendants les uns des autres :)
Et que par conséquent, tu ne peux pas donner tous tes paniers à une caissière.

Voilà, je pense que c'est beaucoup plus clair là, non ? :)

Bonne nuit :)

Eléphant du PHP | 369 Messages

02 août 2009, 14:03

Salut,
Pour schématiser, comme on parle de "panier", voire même "caddie" sur certain sites, alors :
Imagine que tu es dans un magasin et que tu prends un panier par rayon (un rayon représente en fait une galerie sur mon site). Et chacun de tes paniers sont indépendants les uns des autres :)
Et que par conséquent, tu ne peux pas donner tous tes paniers à une caissière.
Voilà, je pense que c'est beaucoup plus clair là, non ? :)
Bonne nuit :)
thehawk a tout à fait raison, une class Singleton est la meilleur solution pour ce que tu veux faire.
Le script ci-dessous en reprend l'idée générale, 'fin c'est pas une Singleton, il s'agit juste de l'idée.

Simple rappel: Une class = un fichier.
C'est juste une piste. J'ai fais quelques essais et que ca marchait mais comme je n'ai fais que "tester"
le principe il est possible qu'il y ait certain problème (il y en aura je te l'assure) mais la... Je te laisse faire ;)

Très peu de commentaires mais en même temps j'ai fais ca pour répondre à ton post... J'ai tenté
de faire ca vite lol
<?php
// J'ai essayé d'être parlant sur les noms et identités employés.
// Ca reste un exemple, pas très beau, pas optimise mais... 
// a toi de modifier selon tes besoins

// --------- Partie des class pour l'aggrégation dans FromPannier

/**
 * className: Surgeles
 * c'est avec ses éléments que tu joues: Quantités, prix etc...
 * A toi de créer les fonctions et variables etc...
 */
class Surgeles
{
  /**
   * Variable inutile, m'a juste servit pour les test.
   */
   private $_id = "Surgeles";
}

/**
 * className: Frais
 * c'est avec ses éléments que tu joues: Quantités, prix etc...
 * A toi de créer les fonctions et variables etc...
 */
class Frais
{
  /**
   * Variable inutile, m'a juste servit pour les test.
   */
   private $_id = "Frais";
}

/**
 * className: Vidéo
 * c'est avec ses éléments que tu joues: Quantités, prix etc...
 * A toi de créer les fonctions et variables etc...
 */
class Video
{
  /**
   * Variable inutile, m'a juste servit pour les test.
   */
   private $_id = "Video";
}

// --------- Partie gestion / admin / création: Placés selon ce script en ./aggregs/

/**
 * className: MainPannier
 * J'ai la fichue habitude de séparer la création de la gestion...
 * bref, on s'en fiche, fais ce qui te semble le plus natuel ;)
 */
class MainPannier
{
   protected function __construct()
   {
   }

   private function __clone()
   {
   }

   public function __destroy()
   {
   }
}

/**
 * className: FrontPannier
 * La class présente te permet la gestion des instances,
 * la gestion des aggregs etc...
 */
class FrontPannier extends MainPannier
{
   static private $_poolInstance = NULL;

   /**
   * Point d'aggreg 
   */
   public $_aggRayon = NULL;

   public function init($strName = false)
   {
      if (!is_string($strName)) die("Nom du pannier invalide !");
      if (isset(self::$_poolInstance[$strName])) die("Pannier deja declare !");

     /**
       * Flag boolean d'erreur
       */
      $bfError = false;

     /**
       * De même j'adore controler les variables d'ou le switch
       */
      switch($strName)
      {
         case surgeles:
         break;
         case frais:
         break;
         case video:
         break;

         default:
            $bfError = true;
      }
      if ($bfError) die("Traitement (aggrégation) impossible, nom invalide, class inéxistante !");

     /**
       * Chargement eventuel du fichier contenant la class
       * considère ca comme un "joke" c'est un exemple à toi de l'inclure d'ou il est placé...
       */
      if (!class_exists($strName))
      {
         if (file_exist("./aggregs/".$strName.".php")) die("Fichier ./aggregs/".$strName.".php introuvable !");
         require_once("./aggregs/".$strName.".php");
      }
     
      self::$_poolInstance[$strName] = new self;
      $inst  = self::$_poolInstance[$strName];

    /** 
      * Objet du nom du rayon...
      */
      $inst -> _aggRayon = new $strName();
      return $inst;
   }

   public function getInstance($strName = false)
   {
      if (!is_string($strName))                   die("Nom du pannier invalide !");
      if (!isset(self::$_poolInstance[$strName])) die("Aucun pannier declare a ce nom !");

     /**
      * Rend impossible l'appel dans le context présent, l'appel doit être fait 
      * de manière static
      */
      if ($this instanceof FrontPannier) die("Instance reservee, erreur !");
      return self::$_poolInstance[$strName];
   }

 /** 
   * Retourne un tableau comprenant tous les identifiants (noms) existants.
   */
   public function getPool()
   {
      $arrayList = Array();

      foreach(self::$_poolInstance AS $key => $value)
      {
         array_push($arrayList, $key);
      }
      return $arrayList;
   }
}

?>
Les class sont Inéxploitables telles qu'elles sont, à toi de jouer pour qu'elles le deviennent.
Je te rappel que c'était vraiment juste pour te donner un exemple alors: [*]Pas tappé, pas tappé ;)

Bon code @+ ;)

PS: [*] Je deconne, en tout cas j'espere que ca t'aurra fourni une piste.

ViPHP
ViPHP | 4674 Messages

04 août 2009, 11:23

Hey :-),

C'est moi ou la solution à ton problème s'appelle : « espace de noms de session » ? Comprendre, mettre un tableau en session. Et tu as un objet : Session_Namespace, qui travaille sur chacune des entrées du tableau. Exemple :
$tomate = new Session_Namespace('tomate'); 
va en réaliter chercher les données dans la session qui a cette forme :
array(
    'tomate' => …
    'autre'  => …
) 
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphanteau du PHP | 19 Messages

04 août 2009, 20:29

Hey :-),

C'est moi ou la solution à ton problème s'appelle : « espace de noms de session » ? Comprendre, mettre un tableau en session. Et tu as un objet : Session_Namespace, qui travaille sur chacune des entrées du tableau.
Ce que tu proposes, c'est une solution de stockage du panier, en l'occurence, un cookie.

Le problème posé est en amont, pour la modélisation du panier.

PS : si le visiteur passe sur un autre ordi (maison/travail) tu n'auras pas accès aux données si elles sont dans un cookie. Mieux vaut stocker le panier dans la BDD ou un fichier XML...
Celui qui recherche la vengeance devrait commencer par creuser 2 tomnes (Confucius)

ViPHP
ViPHP | 4674 Messages

05 août 2009, 10:38

Je crois que tu fais une confusion. Ne travaille pas sur un cookie (trop dangereux et trop limitataif) mais sur une session.

La session est stockée systématiquement sur le serveur.
L'identifiant de la session est stockée chez le client, soit en cookie (le meilleur compromis), soit en variable $_GET (le pire du pire).

Donc si le panier est stocké sur le serveur, l'utilisateur n'a qu'à se reconnecter pour récupérer son panier comme sur son ancienne machine. Tada.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Mammouth du PHP | 959 Messages

06 août 2009, 14:00

Merci à tous de vos réponses,
je pense que la solution de Hywan est la plus simple et la moins compliquée à mettre en œuvre :)

ViPHP
ViPHP | 5924 Messages

06 août 2009, 14:03

Merci à tous de vos réponses,
je pense que la solution de Hywan est la plus simple et la moins compliquée à mettre en œuvre :)
Pléonasme ? :)

Mammouth du PHP | 1511 Messages

10 août 2009, 21:28

Le multiton serait je crois assez adapté a ce petit travail non ?

ViPHP
ViPHP | 4674 Messages

11 août 2009, 12:20

Non, ce serait créer une redondance dû au caractère permanent des sessions. Quoi que :-k … pas forcément uè. On pourrait mais on n'aurait pas un gain énorme (voir mon premier argument).
Ce serait se compliquer la vie pour pas grand chose.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).