PHP orienté objet. Class Caddie, comment récupérer "tous" les articles - PHP - Programmation
Marsh Posté le 17-03-2003 à 00:33:43
Pourquoi "tous" les caddies ? A priori, il n'y en aura qu'un par connexion (par session) ?
Marsh Posté le 17-03-2003 à 00:40:42
ben... oui.
mais je veux recupérer tous les articles du caddie et là.. je ne récupère que le dernier..
je ne comprend pas comment terminer le script.. je suis tout embrouillé..
Marsh Posté le 17-03-2003 à 00:57:59
Pour l'affichage, il faut que tu parcours tous le tableau "article".
C'est là que sont stockés les informations. article[n] contient la quantité de l'article n°n commandée.
Marsh Posté le 17-03-2003 à 01:05:34
Oui mais la je lis un objet non?
Page voir caddie..
$Panier_unserialize=unserialize($Panier_serialize);
$Panier_unserialize->afficher();
//========================================================
Il faudrait que je parcour le tableau avant donc.. ici?
Page ajouter article.
$Panier=new Caddie;
$Panier->ajouter("$id_article", $quantite);
echo "<table><tr><td>";
foreach(get_object_vars($Panier) as $key=>$val)
{
print("<center>$key=$val<BR></center></td><td>" );
}
echo "</td></tr></table><br>";
$Panier_serialize=serialize($Panier);
session_register("Panier_serialize" );
//==========================================================
je ne comprend pas ca:
$Autre_Panier=new Panier;
$Autre_Panier->ajouter("$id_article", $quantite);
ca ne peux marcher qu'avec deux articles! (je me doute ke non mais bon)
Marsh Posté le 17-03-2003 à 01:26:19
A priori, unserialize, c'est pour reconstruire un objet sauvegardé (par la méthode serialize()).
Au début de ton script, tu relis l'objet sauvegardé, t'y apporte les modifications (ajout d'éléments, affichage du panier, suppression d'éléments...). Et tu le réenregistre à la fin du script pour ne pas perdre les modifications.
Tu ne fais le : $panier = new Panier; que pour créer le panier lorsqu'un client commence sa commande. Ensuite, il ne faut plus créer un panier, mais relire celui qui existe dans la session.
Marsh Posté le 17-03-2003 à 01:37:58
mrBebert
A priori, unserialize, c'est pour reconstruire un objet sauvegardé (par la méthode serialize()).
je sais a quoi ca sert C pour transformer en chaine de caractère pour pouvoir transmettre par la session.
mrBebert
Tu ne fais le : $panier = new Panier; que pour créer le panier lorsqu'un client commence sa commande. Ensuite, il ne faut plus créer un panier, mais relire celui qui existe dans la session.
ben oui ! alors
$Autre_Panier=new Panier;
$Autre_Panier->ajouter("$id_article", $quantite);
ca serai pour prendre la commande d'un autre client..
Au début de ton script, tu relis l'objet sauvegardé, t'y apporte les modifications (ajout d'éléments, affichage du panier, suppression d'éléments...). Et tu le réenregistre à la fin du script pour ne pas perdre les modifications.
et donc...
il faudrai modifier dans la page d'ajout d'article:
$Panier=new Caddie;
$Panier->ajouter("$id_article", $quantite);
ou dans la page de visualisation de tous le article avec une boucle? :
$Panier_unserialize=unserialize($Panier_serialize);
$Panier_unserialize->afficher();
Marsh Posté le 17-03-2003 à 01:53:44
Je vois pas où est le problème Si tu as un autre client, il aura une autre session. Tu as toujours un seul panier par client
En particulier, dans la page d'ajout d'un article, il ne faut pas créer de nouvel objet panier, mais toujours utiliser celui qui est dans la session (donc, celui qui est rattaché au client).
Pour l'affichage, c'est dans la fonction Panier->afficher().
Marsh Posté le 17-03-2003 à 02:00:19
C'est ce ke je me suis dit donc G fais un truc du style:
function afficher_caddie()
{
echo "$this->article";
}
et
function afficher_caddie()
{
echo "$this->article[$id_article]";
}
mais dans les deux cas ca ne marchera pas même si je fais une boucle car C du n'importe quoi !!
Marsh Posté le 17-03-2003 à 02:02:57
Ben si, avec une boucle (comme le foreach que t'as mis plus haut), ca devrait marcher
Marsh Posté le 17-03-2003 à 02:09:23
il fo ke je fasse une boucle sur :
$this->date_jour
$this->quantite
$this->libelle_article
non?
ca:
echo "$this->article[$id_article]";
Ca ca va pas me rammener mes données.?;:,/..?
Marsh Posté le 17-03-2003 à 10:47:44
Code :
|
normalment, tu n'as plus besoin du serialize/unserialize.
Marsh Posté le 17-03-2003 à 13:30:47
vu com tu l'as écrit, ça me parait un peu + clair..
merci je V essayer ce soir
Marsh Posté le 17-03-2003 à 19:28:47
Chrono a écrit : il fo ke je fasse une boucle sur : |
D'après ce que j'ai compris, si
$this->article[$id_article] contient le nombre d'exemplaires demandés pour l'article $id_article.
$id_article n'est pas qu'un numéro de case du tableau, mais aussi l'identifiant d'un article.
Par exemple, si le client veut 2 exemplaires de l'article 12 et 7 de l'article 23, ton tableau aura 2 cases :
- $this->article[12] qui contient 2
- $this->article[23] qui contient 7
En PHP, on peut avoir 2 cases, numérotées 12 et 23, sans les valeurs intermédiaires
Marsh Posté le 18-03-2003 à 01:02:22
et je fais ma boucle comment alors?
combien d'occurences???
je taf sur 2 choses en même temps et l'objet commence sérieusement à me .....
Je comprend pas comment faire ma boucle pour récupérer tous les articles...
Marsh Posté le 18-03-2003 à 11:37:32
Chrono a écrit : vu com tu l'as écrit, ça me parait un peu + clair.. |
ce que j'essayais de te faire comprendre, c'est que tes attributs sont dans des tableaux, or toi tu essaye de les afficher comme s'ils étaient des simples variables.
tu as au minimum besoin d'un
Code :
|
ou d'un
Code :
|
Marsh Posté le 21-03-2003 à 09:55:22
Fatal error: Unknown(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition caddie of the object you are trying to operate on was loaded _before_ the session was started in /home/www/bonvivre/caddie/voir_caddie.php on line 33
Apparement G besoin de sérializer...
Marsh Posté le 21-03-2003 à 14:05:59
Je vais pleurer, je n'arrive pas à afficher tous les articles du panier, je ne récupère que le dernier inséré..
MA PAGE PANIER.PHP CONTENANT LA CLASS CADDIE
<?
//==============================================================
require("conf.php" );
$reqnom=mysql_db_query(genobacces,"SELECT Libelle_Article FROM Articles WHERE Id_Article='$id_article'",$db_link);
$resnom=mysql_fetch_array($reqnom);
$libelle_article=$resnom['Libelle_Article'];
//==============================================================
class Caddie
{ //====================================1
var $date_jour;
var $libelle_article;
var $quantite;
var $id_article;
var $article;
function Caddie()
{
$this->date_jour = date("d/m/Y" );
$this->libelle_article = $GLOBALS['libelle_article'];
$this->quantite = $GLOBALS['quantite'];
$this->id_article = $GLOBALS['id_article'];
}
function ajouter ($id_article, $quantite)
{
$this->article[$id_article] += $quantite;
}
function supprimer ($id_article, $quantite)
{
if ($this->article[$id_article] > $quantite)
{
$this->article[$id_article] -= $quantite;
return TRUE;
}
else
{
return FALSE;
}
}
function afficher_caddie()
{
foreach($this->article as $key=>$val)
{
echo "$key $val<br>";
echo "<table width='100%' border='1' bgcolor='#FFEFD5' bordercolorlight='#CD5C5C' bordercolordark='#DC1436'>";
echo "<tr>";
echo "<td align='center' width='30%'><b><i>Date </b></i></td>";
echo "<td align='center' width='10%'><b><i>Quantité </b></i></td>";
echo "<td align='center' width='60%'><b><i>Libellé </b></i></td>";
echo "</tr><tr>";
echo "<td align='center' width='30%'><b><i>$this->date_jour</b></i></td>";
echo "<td align='center' width='10%'><b><i>$this->quantite</b></i></td>";
echo "<td align='center' width='60%'><b><i>$this->libelle_article</b></i></td>";
echo "</tr>";
echo "</table><br>";
}
}
} //=====================================1
mysql_close($db_link);
?>
MA PAGE CADDIE.PHP QUI PERMET D'AJOUTER UN ARTICLE
<?
session_name('PHPSESSID';
session_start();
$nameses=session_name();
$idses=session_id();
$ip=$REMOTE_ADDR;
session_register("nameses" );
session_register("idses" );
session_register("ip" );
//==============================================================
require("conf.php" );
$reqnom=mysql_db_query(genobacces,"SELECT Libelle_Article FROM Articles WHERE Id_Article='$id_article'",$db_link);
$resnom=mysql_fetch_array($reqnom);
$libelle_article=$resnom['Libelle_Article'];
//==============================================================
if(($id_article=="" ) || ($quantite=="" ))
{
echo"<center><h2>Veuillez saisir la quantité désirée svp. </h2><br>
<a href= 'offre.php'>Retour à la liste des produits. </a></center>";
exit();
}
else
{
require("panier.php" ); // Class Caddie
echo"<center><h4>Class Caddie disponible</h4></center><br><br>";
}
// session_register("Id_Utilisateur" );
//==========================================================
if (!is_object($Caddie))
{
$Panier=new Caddie;
$Panier->ajouter("$id_article", $quantite);
$Panier->afficher_caddie();
$Panier_serialize=serialize($Panier);
session_register("Panier_serialize" );
}
//==========================================================
// on ajoute sur le même objet ou on crée un new ??
//if (!is_object($Panier))
//{
//$Autre_Panier= new Panier();
if(session_is_registered("Panier_serialize" ))
{
echo"OK <br><br>";
$Autre_Panier= new Caddie();
$Autre_Panier->ajouter("$id_article", $quantite);
$Autre_Panier->afficher_caddie();
$Autre_Panier_serialize=serialize($Autre_Panier);
session_register("Autre_Panier_serialize" );
}
else
{
echo"PAS OK";
}
//}
//===========================================================
echo "<table width='100%' border='1' bgcolor='#FFEFD5' bordercolorlight='#CD5C5C' bordercolordark='#DC1436'><tr><td>";
foreach(get_object_vars($Panier) as $key=>$val)
{
print("<center>$key=$val<BR></center></td><td>" );
}
echo "</td></tr></table><br>";
//===========================================================
echo "<center><br><br><a href='offre.php'><i><b>Ajouter un article au caddie</a><br>
<br><a href='del_article.php'>Retirer un article du caddie</a><br>
<br><a href='voir_caddie.php'>Voir le contenu du caddie</b></i></a></center><br>";
?>
MA PAGE VOIR_CADDIE.PHP
<?
if($PHPSESSID)
{
session_start ($PHPSESSID);
echo"<center><h4>Session ouverte</h4></center><br>";
}
else
{
echo"<center>Pas de session ouverte<br><br>";
echo"<a href='offre.php'>Retour à la liste des articles</a></center>";
exit();
}
if ($ip==$REMOTE_ADDR)
{
require("panier.php" ); // Class Caddie
echo"<center><h4>Class Caddie disponible</h4></center><br><br>";
}
else
{
echo"<center><h4>Class Caddie indisponible</h4></center><br><br>";
}
//==============================================================
$Panier_unserialize=unserialize($Panier_serialize);
$Panier_unserialize->afficher_caddie();
$Autre_Panier_unserialize=unserialize($Autre_Panier_serialize);
$Autre_Panier_unserialize->afficher_caddie();
//==============================================================
echo"<center><br><a href='out.php'>Fermer la session</b></i></a></center><br>";
?>
Ce n'est pas de la mauvaise volonté mais je crack la...
Marsh Posté le 21-03-2003 à 14:08:45
Chrono a écrit : Je vais pleurer, je n'arrive pas à afficher tous les articles du panier, je ne récupère que le dernier inséré.. |
Marsh Posté le 21-03-2003 à 15:28:53
Je met bien tous les articles d'un même client dans le même objet non?
Ou bien il faut que j'en crée un nouveau à chaque fois?
Marsh Posté le 21-03-2003 à 18:17:42
J'ai retapé tout le code différement mais rien à faire, je n'affiche que le dernier article inséré au caddie..
J'ai essayé de voir les scripts existants mais ils sont énormements longs et je n'arrive pas à trouver ce ke je cherche.
Quelqu'un pourait il m'éclairer?
Marsh Posté le 21-03-2003 à 19:18:16
J'ai l'impression que tu en recrée un nouveau à chaque fois que tu veux ajouter un article
Il faut que tu relises dans la session celui qui existe. Je vois pas où tu fais ca
Marsh Posté le 21-03-2003 à 20:21:16
dans ma dernière version, je n'utilise qu'un seul objet.
- j'ai une page "offre" : je click sur l'article choisi
- je saisi une qté et fais "Ok"
- j'arrive sur la page "Caddie" qui permet de créer l'objet s'il n'existe pas.. et d'ajouter l'article choisi..
Cette page appelle la class Caddie (fonction afficher article choisi et ajouter..)
Toujours sur cette page, G le choix d'ajouter un article ou bien visualiser le caddie.
Si j'ajoute, je retombe sur la page "offre"..
-Enfin, si je click sur visualiser le caddie, je ne vois que le dernier article inséré.
Ma page caddie..
if (!is_object($Caddie))
{
$Panier=new Caddie;
echo"<center><h4>Le Caddie est bien instancié</h4></center><br><br>";
}
$Panier->ajouter("$id_article", $quantite);
$Panier->afficher_caddie();
$Panier_serialize=serialize($Panier);
session_register("Panier_serialize" );
C pas bon ca??
Marsh Posté le 21-03-2003 à 21:04:33
Si tu fais :
$Panier_serialize=serialize($Panier);
session_register("Panier_serialize" );
je pense qu'il devrait y avoir quelque part un truc du genre :
$Panier = unserialise($Panier_serialize);
Pour en être sur, mets un :
echo "Creation d'un nouvel objet";
dans la partie :
if (!is_object($Caddie))
{
...
}
pour voir ce que fais le script, s'il recrée un nouvel objet ou pas.
Marsh Posté le 21-03-2003 à 21:23:06
La page qui permet la visualisation (voir_caddie.php)
session_start ($PHPSESSID);
require("panier.php" ); // Class Caddie
$Panier_unserialize=unserialize($Panier_serialize);
$Panier_unserialize->afficher_caddie();
La fonction afficher_caddie (panier.php : class caddie)
function afficher_caddie()
{
foreach($this->article as $key=>$val)
{
echo "$key $val<br>";
echo "$this->date_jour";
echo "$this->quantite";
echo "$this->libelle_article";
}
}
et ca marche pas... donc ca viens peut être de la fonction ajouter qui écraserai l'ancien article non?
Page Caddie.php
if (!is_object($Caddie))
{
$Panier=new Caddie;
}
$Panier->ajouter("$id_article", $quantite);
$Panier_serialize=serialize($Panier);
session_register("Panier_serialize" );
Page Panier.php : class Caddie..
function ajouter ($id_article, $quantite)
{
$this->article[$id_article] += $quantite;
}
Marsh Posté le 21-03-2003 à 21:40:33
Ce que je vois, c'est que dans la page Caddie.php, tu crées un nouvel objet
Mets des echo "" partout pour voir où il va et où il ne va pas.
Marsh Posté le 21-03-2003 à 22:31:22
Bon G réussi en partie...
Je n'arrive qu'a voir $key et $val..
soit id_article et quantité avec dans la fonction visualiser_article:
foreach($this->article as $key=>$val)
Marsh Posté le 21-03-2003 à 22:36:48
C'est bien ce que tu voulais, non
Tu arrives à avoir plusieurs articles ?
Marsh Posté le 21-03-2003 à 22:49:17
oui mais comment avoir le detail...
cad..
function afficher_caddie()
{
//foreach(get_object_vars($this) as $key=>$val)Marche pas ca..
foreach($this->article as $key=>$val)
{
echo "$key $val<br>";
echo"$this->article[$key]"; // ok
echo"$this->article[$val]"; // ok
echo "<table width='100%' border='1' bgcolor='#FFEFD5' bordercolorlight='#CD5C5C' bordercolordark='#DC1436'>";
echo "<tr>";
echo "<td align='center' width='30%'><b><i>Date </b></i></td>";
echo "<td align='center' width='10%'><b><i>Quantité </b></i></td>";
echo "<td align='center' width='60%'><b><i>Libellé </b></i></td>";
echo "</tr><tr>";
echo "<td align='center' width='30%'><b><i>$this->date_jour</b></i></td>";
echo "<td align='center' width='10%'><b><i>$this->quantite</b></i></td>";
echo "<td align='center' width='60%'><b><i>$this->libelle_article</b></i></td>";
// ca ca marche pas...
echo "</tr>";
echo "</table><br>";
}
}
Marsh Posté le 21-03-2003 à 22:54:43
non, quand tu fais foreach($this->article as $key=>$val), ca suffit pour parcourir tout le tableau. $key, c'est l'indice du tableau (ici, le produit), $val le contenu (ici, le nombre de produits demandés)
Donc :
echo "pour le produit $key, il y a $val unités commandées<br>";
c'est pareil que :
echo "pour le produit $key, il y a $this->article[$key] unités commandées<br>";
(dans la boucle foreach())
Le foreach() parcourt tous les couples indice/valeur du tableau.
Marsh Posté le 21-03-2003 à 23:20:12
Pkoi avec ca je n'arrive pas à avoir ce ke je veux?
Ca m'affiche N fois le premier article ajouté au caddie..
foreach(get_object_vars($this) as $key=>$val)
{
print("<center>$key=$val<BR></center></td><td>" );
}
Marsh Posté le 21-03-2003 à 23:38:20
Ma fonction "ajouter" est elle complète?
function ajouter ($id_article, $quantite)
{
$this->article[$id_article] += $quantite;
}
pour afficher :
function afficher_caddie()
{
foreach($this->article as $key=>$val)
{
echo "$key $val<br>";
}
echo "<table width='100%' border='1' bgcolor='#FFEFD5' bordercolorlight='#CD5C5C' bordercolordark='#DC1436'>";
echo "<tr>";
echo "<td align='center' width='30%'><b><i>Date </b></i></td>";
echo "<td align='center' width='10%'><b><i>Quantité </b></i></td>";
echo "<td align='center' width='60%'><b><i>Libellé </b></i></td>";
echo "</tr><tr>";
foreach($this->date_jour as $key3=>$val3)
{
echo "$key3 $val3<br>";
//echo "<td align='center' width='30%'><b><i>$this->date_jour</b></i></td>";
}
foreach($this->date_jour as $key4=>$val4)
{
echo "$key4 $val4<br>";
//echo "<td align='center' width='10%'><b><i>$this->quantite</b></i></td>";
}
foreach($this->date_jour as $key5=>$val5)
{
echo "$key5 $val5<br>";
//echo "<td align='center' width='60%'><b><i>$this->libelle_article</b></i></td>";
}
echo "</tr>";
echo "</table><br>";
}
qui ne marche pas d'ailleur..
Marsh Posté le 21-03-2003 à 23:38:57
get_object_vars, ca mets toutes les variables de l'objet sous forme de tableau. C'est pas ce que tu veux
Pour l'ajout, oui, ca devrait suffire.
C'est quoi ce tableau date_jour (que tu parcours 3 fois ) ???
function afficher_caddie()
{
foreach($this->article as $key=>$val)
{
echo "Le produit $key est commandé en $val exemplaires<br>";
}
}
et puis c'est tout. Tu affineras quand ca marchera.
Marsh Posté le 21-03-2003 à 23:52:53
Mais ca marche ca...!!!
mais ma classe est comme ca:
class Caddie
{ //====================================1
var $date_jour;
var $libelle_article;
var $quantite;
var $id_article;
var $article;
function Caddie()
{
$this->date_jour = date("d/m/Y" );
$this->libelle_article = $GLOBALS['libelle_article'];
$this->quantite = $GLOBALS['quantite'];
$this->id_article = $GLOBALS['id_article'];
}
function ajouter ($id_article, $quantite)
{
$this->article[$id_article] += $quantite;
}
donc je veux la date et le libelle de l'article correspondant...
Marsh Posté le 21-03-2003 à 23:59:32
Elle correspond à quoi cette date
Si tu veux garder la date à laquelle un élément à été ajouté, tu peux utiliser un autre tableau, de la même manière que "article".
Il suffirait de modifier la fonction "ajouter" :
function ajouter ($id_article, $quantite)
{
$this->date_jour[$id_article] = date("d/m/Y" );
$this->article[$id_article] += $quantite;
}
Pour les libellés, tu peux construire le tableau complet dès la construction de l'objet.
Marsh Posté le 22-03-2003 à 00:03:52
Ce que tu cherches à me dire, C que dans un objet on ne pas mettre plus qu'un couple de valeurs?
je peux pas mettre la date, le libelle, l'id et la quantité????
Ca fais une semaine que je me casse les couilles pour rien???
Bref en utilisant ta méthode, je dois faire 3 tableaux.. ca me convient et ca doit marcher mais je voyais pas cela comme ça...
C ptêtre pour ça que je voyais rien du tout...
je me doutais quand même qu'il manquait qqch dans la fonction ajouter..
Marsh Posté le 22-03-2003 à 00:06:38
"article", c'est un tableau, pas un objet
Mais tu peux mettre plusieurs tableaux (ou autres variables) dans l'objet Caddie.
A la rigueur, tu peux faire un tableau d'objets, mais ca me parait plus simple d'utiliser plusieurs tableaux.
Marsh Posté le 22-03-2003 à 00:10:36
oui je m'étais mal exprimmé.. je connais la différence entre tableau et objet qd même..
Et bien ta méthode est cool.. je te remerci grace à toi je V pouvoir commencer à taffer un peu..
Marsh Posté le 16-03-2003 à 23:49:35
PHP orienté objet.. j'utilise une Class Caddie, mais comment récupérer "tous" les caddies??
class Caddie
{ //====================================1
var $date_jour;
var $libelle_article;
var $quantite;
var $id_article;
var $article;
function Caddie()
{
$this->date_jour = date("d/m/Y" );
$this->libelle_article = $GLOBALS['libelle_article'];
$this->quantite = $GLOBALS['quantite'];
$this->id_article = $GLOBALS['id_article'];
}
function ajouter ($id_article, $quantite)
{
$this->article[$id_article] += $quantite;
} Ici j'utilise un tableau mais comment le recupérer? je ne dois pas recupérer un objet?
function supprimer ($id_article, $quantite)
{
if ($this->article[$id_article] > $quantite)
{
$this->article[$id_article] -= $quantite;
return TRUE;
}
else
{
return FALSE;
}
}
function afficher()
{
echo "<table width='100%' border='1' bgcolor='#FFEFD5' bordercolorlight='#CD5C5C' bordercolordark='#DC1436'>";
echo "<tr>";
echo "<td align='center' width='30%'><b><i>Date </b></i></td>";
echo "<td align='center' width='10%'><b><i>Quantité </b></i></td>";
echo "<td align='center' width='60%'><b><i>Libellé </b></i></td>";
echo "</tr><tr>";
echo "<td align='center' width='30%'><b><i>$this->date_jour</b></i></td>";
echo "<td align='center' width='10%'><b><i>$this->quantite</b></i></td>";
echo "<td align='center' width='60%'><b><i>$this->libelle_article</b></i></td>";
echo "</tr>";
echo "</table><br>";
}
Page ajouter article.
$Panier=new Caddie;
$Panier->ajouter("$id_article", $quantite);
/*
$Autre_Panier=new Panier;
$Autre_Panier->ajouter("$id_article", $quantite);
*/ C ou qu'il faut faire ca??
echo "<table width='100%' border='1' bgcolor='#FFEFD5' bordercolorlight='#CD5C5C' bordercolordark='#DC1436'><tr><td>";
foreach(get_object_vars($Panier) as $key=>$val)
{
print("<center>$key=$val<BR></center></td><td>" );
}
echo "</td></tr></table><br>";
$Panier_serialize=serialize($Panier);
session_register("Panier_serialize" );
Page voir caddie..
$Panier_unserialize=unserialize($Panier_serialize);
$Panier_unserialize->afficher();
Apparement C ici aussi que je ne comprend pas le mécanisme qu'il manque..
Message édité par chrono le 17-03-2003 à 00:58:38