Page 1 sur 1

Donner un identifiant à une instance de class ?

Posté : 02 août 2009, 00:57
par chrislabricole
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

Re: Donner un identifiant à une instance de class ?

Posté : 02 août 2009, 01:22
par thehawk
'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

Re: Donner un identifiant à une instance de class ?

Posté : 02 août 2009, 01:43
par chrislabricole
Salut :)

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

Merci d'avance !

Re: Donner un identifiant à une instance de class ?

Posté : 02 août 2009, 01:50
par thehawk
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

Re: Donner un identifiant à une instance de class ?

Posté : 02 août 2009, 01:55
par chrislabricole
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 :)

Re: Donner un identifiant à une instance de class ?

Posté : 02 août 2009, 14:03
par FuZZyLine
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.

Re: Donner un identifiant à une instance de class ?

Posté : 04 août 2009, 11:23
par Hywan
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'  => …
) 

Re: Donner un identifiant à une instance de class ?

Posté : 04 août 2009, 20:29
par globule
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...

Re: Donner un identifiant à une instance de class ?

Posté : 05 août 2009, 10:38
par Hywan
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.

Re: Donner un identifiant à une instance de class ?

Posté : 06 août 2009, 14:00
par chrislabricole
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 :)

Re: Donner un identifiant à une instance de class ?

Posté : 06 août 2009, 14:03
par Sékiltoyai
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 ? :)

Re: Donner un identifiant à une instance de class ?

Posté : 10 août 2009, 21:28
par momox
Le multiton serait je crois assez adapté a ce petit travail non ?

Re: Donner un identifiant à une instance de class ?

Posté : 11 août 2009, 12:20
par Hywan
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.