Forum Clubic

Affichage des détails d'une commande choissit auparavnt

Bonjour tout le monde,

Je réalise un site Web marchand(vente ded moto…)en PHP orienté objet avec une base de données MySql.

Lorsque le client s’enregistre, il peut consulter toute commande qu’il a effectué auparavant tout en cliquant sur le lien “Mon comptes”=>“Liste des commandes”. jusque la tout va bien.
Ensuite, si le client désir obtenir le détail de la commande (c’est à dire quel produit? à quel prix?..) il a juste à cliquer sur le lien “détail de la commande” mais malheureusement cela ne fonctionne pas c’est à dire j’obtien juste le nom des colonnes mais pas le contenu donc ce qui est à l’intérieur du foreach du code suivant :


<div align="center" class="contenu">
	D&eacute;tail de la commande num&eacute;ro : <?php echo $code_cmde; ?>
</div>
 
<table>
	<tr>
		<th><h4>Num&eacute;ro de la ligne</h4></th>
		<th><h4>Code de la cat&eacute;gorie</h4></th>
		<th><h4>Marque de l'article</h4></th>
		<th><h4>Mod&eacute;le de l'article</h4></th>
		<th><h4>Quantit&eacute; command&eacute;e</h4></th>
		<th><h4>Prix de l'article</h4></th>
	</tr>
	
	<?php
	foreach($MesLignesCmde as $ligne)
	{
		?>
			<tr>
				<td><div class="contenu"><?php echo $ligne->get_ligne(); ?></div></td>
				<td><div class="contenu"><?php echo $ligne->get_article()->get_lacategorie()->get_code(); ?></div></td>
				<td><div class="contenu"><?php echo $ligne->get_article()->get_marque(); ?></div></td>
				<td><div class="contenu"><?php echo $ligne->get_article()->get_modele(); ?></div></td>
				<td><div class="contenu"><?php echo $ligne->get_Qte(); ?></div></td>
				<td><div class="contenu"><?php echo $ligne->get_article()->get_prixHT(); ?></div></td>
			</tr>
		<?php
	}
	?>
</table>
<div align="center">
	<a href="index.php?action=liste_commande">Retour</a>
</div>

Voici le code du controle qui me permet d’alimenter le code ci-dessus : (donc la vue correspondant à l’affichage du détail de la commande choisit auparavant)

<?php
	// récupération du code de la commande
	$code_cmde = $_GET["code"];
	//$Client=DAO_Client::ChargerUnClient($_COOKIE['moto_28']);
	
	
	// création d'une instance de la classe commande
	$LaCom = DAO_Commande::ChargerUneCommande($code_cmde);
	
	$LaCom = DAO_Commande::TouteLignesCommandes($code_cmde);
	
	$Commande = new commande();
	$MesLignesCmde = $Commande->get_LesLignesCommandes()->getAll();
	require('Vues/V_listeCommande.php');
?>

Voici la classe commande :

<?php
class commande
{
	
	private $port=4;			 // Le port est une constante : 4 ¤ de frais de port pour chaque commande
	private $Int_numligne; 			 // Le numero de la ligne de commande
	private $Int_idCde;				 // Le numéro de la commande
	private $Date_DateCde;			 // La date de la commande
	private $Obj_client;			 // Objet client
   	private $Col_lesLignesCommandes; // Collection de LigneCommande
	private $Dec_prixHT;
	private $Dec_prixTVA;
	private $Dec_prixTTC;
	
	// Le constructeur
	public function commande( $leidCde=null, $leClient=null, $laDateCde=null, $lePrixHT=null, $lePrixTVA=null, $lePrixTTC=null)
	{
		$this->Int_numligne=1;
		$this->Int_idCde=$leidCde;
		$this->Date_DateCde = $laDateCde;
		$this->Obj_client = $leClient;
	  	$this->Col_lesLignesCommandes = new collection();
	  	$this->Dec_prixHT = $lePrixHT;
	  	$this->Dec_prixTVA = $lePrixTVA;
	  	$this->Dec_prixTTC = $lePrixTTC;
	}
	
	// Les getteurs
	public function get_idCde()
	{
		return $this->Int_idCde;
	}
	public function get_Date_Cde()
	{
		return $this->Date_DateCde;	
	}
 	public function get_client()
   	{
      return $this->Obj_client;
   	}	
 	public function get_LesLignesCommandes()
   	{
      return $this->Col_lesLignesCommandes;   
   	}
	public function get_numligne()
   	{
      return $this->Int_numligne;
   	}
   	public function get_prixHT()
   	{
   		return $this->Dec_prixHT;
   	}
   	public function get_prixTVA()
   	{
   		return $this->Dec_prixTVA;
   	}
   	public function get_prixTTC()
   	{
   		return $this->Dec_prixTTC;
   	}

   	

   	
	 // Les setteurs
	public function set_idCde($leidCde)
	{
		$this->Int_idCde =$leidCde;
	}
	public function set_Date_Cde($laDateCde)
	{
		$this->Date_DateCde =$laDateCde;
	}
	public function set_client($leClient)
	{
		$this ->Obj_client =$leClient;
	}
	public function set_lesLignesCommandes($lesLignes)
	{
		$Col_lesLignesCommandes = $lesLignes;
	}
	public function set_numligne($Numligne)
	{
		$this->Int_numligne=$Numligne;
	}
	public function set_prixHT($lePrixHT)
	{
		$this->Dec_prixHT=$lePrixHT;
	}
	public function set_prixTVA($lePrixTVA)
	{
		$this->Dec_prixTVA=$lePrixTVA;
	}
	public function set_prixTTC($lePrixTTC)
	{
		$this->Dec_prixTTC=$lePrixTTC;
	}

	
	// Méthodes : afficher
	public function Afficher() {
		$ch=$this->get_idCde()." ".$this->get_Date_Cde()." ".$this->get_client()." ".$this->get_montantTotal()->Afficher();
		return $ch;
	}
	
	// Méthodes : Ajouter une ligne de commande
	public function AjouterLigneCommande($Article, $Qte) {
		$ligneCde=new ligne_commande($this,$Article, $Qte, $this->get_numligne(), $Article->get_prixHT());
		//$this->set_numligne($this->Int_numligne+1);
		$this->Col_lesLignesCommandes->add($ligneCde);
	}
	

	// Méthodes : retourner les lignes de commandes
	public function retournerLesLignes() 
	{
		//retourne tout les objets contenu dans ligne de commande
		$tableau = $this->get_LesLignesCommandes()->getAll();
		return $tableau;
	}

	// Méthodes : retourner le nombre de ligne de commande
	public function retournerNombreLignes() {
		//retourne le nombre de ligne de commande
		$tableau = $this->get_lesLignesCommandes()->getAll();
		return count($tableau);	//on utilise la fonction count
	}

	// Méthodes : retourne la TVA
	public function retourneTVA(){
		$TauxVA=$this->retournePrixTotalHT();
		return $TauxVA;
	}

	// Méthodes : retourner le frais de port
	public function retourneFraisPort(){
		$FraisPort=$this->port;
		return $FraisPort;
	}

	// Méthodes : retourner le prix total Toute taxe comprise
	public function retournePrixTotalTTC(){
		$tableau=commande::retournerLesLignes();	
		$resultat=0;
		foreach($tableau as $o) {
			$resultat=$resultat + ($o->get_Article()->get_prixHT() * $o->get_Qte());
		}
		return $resultat;
	}

	// Méthodes : retourner le prix total hors taxe
	public function retournePrixTotalHT(){
		$PrixTTC=commande::retournePrixTotalTTC();
		$PrixHT=($PrixTTC*19.6)/100;
		return $PrixHT;
	}

	// Méthodes : retourner le prix total à payer
	public function retournePrixTotalAPayer(){
		$PrixTTC=$this->retournePrixTotalTTC();
		$resultat=$PrixTTC + $this->port;
		return $resultat;
	}
}
?>

Aidez-moi s’il vous plais car cela fai quelque temps que je cherche mais je trouve pas!!
Enfin je pense que mon problème vient peut-être au niveau de mon controle qui remplit pas ou mal ‘$MesLignesCommande’ ce qui est peut être du à mon instance de la classe ‘commande’ nommée ‘$Commande’ mais je voit pas comment faire pour régler mon problème!!

Merci d’avance
Edité le 22/12/2008 à 16:19

Je n’ai pas lu beaucoup du code source, mais :

$Commande = new commande();
$MesLignesCmde = $Commande->get_LesLignesCommandes()->getAll();

tu instancies un objet ($Commande), avec aucun paramètres.
Dans le constructeur : $this->Col_lesLignesCommandes = new collection();
(on ne connait pas la classe collection).

Puis un print_r($MesLignesCmde); juste avant le foreach devrait pas mal nous aider :wink:
(Est ce que c’est “vide” ? est ce que c’est les objets qui sont vides ?) …

Je suis d’accord avec toi, c’est pour cela que j’ai fais la chose suivante :

$Commande = new commande($code_cmde, $Client, $LaCom, "", "", "");

La classe collection existe, la voici :

<?php
	class collection {
		private $id;
		private $objets;
			
			// Constructeur de la classe collection
			public function collection(){
				$this->id=rand(1,1000);
				$this->objets = array();
			}
			
			// Fonction d'ajout d'un objet
			public function add($o) {
				array_push($this->objets,$o);
			}
			
			// Fonction getAlL qui retourne l'objet
			public function getAll() {
				return $this->objets;
			}
			
			// Fonction qui compte le nombre d'objet
			public function count(){
				return count($this->objets);
			}
	}
?>

Lorsque je fais cela :

<?php
	print_r($MesLignesCmde); 
	foreach($MesLignesCmde as $ligne)
	{
		?>
			<tr>
				<td><div class="contenu"><?php echo $ligne->get_ligne(); ?></div></td>
				<td><div class="contenu"><?php echo $ligne->get_article()->get_lacategorie()->get_code(); ?></div></td>
				<td><div class="contenu"><?php echo $ligne->get_article()->get_marque(); ?></div></td>
				<td><div class="contenu"><?php echo $ligne->get_article()->get_modele(); ?></div></td>
				<td><div class="contenu"><?php echo $ligne->get_Qte(); ?></div></td>
				<td><div class="contenu"><?php echo $ligne->get_article()->get_prixHT(); ?></div></td>
			</tr>
		<?php
	}
	?>.....

il m’affiche : Array()

Quelqu’un a t’il une idée?? car moi là je voit vraiment pas!!

Cordialement
Edité le 22/12/2008 à 17:12

public function collection(){
				$this->id=rand(1,1000);
				$this->objets = array();
			}

Lorsque tu instancies un objet collection, t’as deux objets : id et objets

public function getAll() {
				return $this->objets;
			}

tu retournes un tableau vide

Donc le problème doit venir de là … à aucun moment tu ne remplis le tableau ?

ben si je le remplit dans mon controle :

<?php
	// récupération du code de la commande
	$code_cmde = $_GET["code"];
	
	$Client=DAO_Client::ChargerUnClient($_COOKIE['moto_28']);
	
	$LaCom = DAO_Commande::ChargerUneCommande($code_cmde);
	
	$LaCom = DAO_Commande::TouteLignesCommandes($code_cmde);
	
	$Commande = new commande($code_cmde, $Client, $LaCom, "", "", "");
	$MesLignesCmde = $Commande->get_LesLignesCommandes()->getAll();
	require('Vues/V_listeCommande.php');
?>

mais malheureusement cela fonctionne pas c’est à dire que si je met un ‘echo ($MesLignesCmde);’ avant le ‘require(…);’ ben il m’affiche “Array”.

Donc je pense que le problème vient de la, non?? Mais pourquoi?? comment faire?? tel es la question si mon problème vient bien de la!!

Cordialement

fait un print_r ou un var_dump. Mais sans connaître tout ton code, je dirais que getAll() renvoie un tableau, ne correspondant pas à ce que tu veux.

Sinon :


$this->id=rand(1,1000);

Sauf si tu veux avoir un problème sans jamais pouvoir le résoudre, colle plutôt $this->id = null.

C ce que je vient de faire mais c’est toujours pareil.

C ce que j’ai fais tout t’a l’heure car manu2 me la demandé et comme j’ai dit cela me renvoie “Array()”.

Merci d’avance!!

désolé, je vois toujours pas où tu remplies le tableau “objets”.
Si c’est dans ces lignes :

$Client=DAO_Client::ChargerUnClient($_COOKIE['moto_28']);
$LaCom = DAO_Commande::ChargerUneCommande($code_cmde);
$LaCom = DAO_Commande::TouteLignesCommandes($code_cmde);

il y a peu de chance que ca “reste”, a moins que $objets soit un objet de type static !

class test {
		private $value = 0;

   public function change_value($new_value)
   {
        $this->value = $new_value;
   }
    public function print_value()
   {
        echo $this->value;
   }
}

//Code

$a = new test();
$a->print_value(); // Devrait afficher 0
$a->change_value(5);
$a->print_value(); // Devrait afficher 5

$b = new test();
$b->print_value(); // Devrait afficher 0 et non pas 5 !

Enfin c’est pas un très bon exemple, puis je sais pas si ton problème est a ce niveau là.
Mais je vois vraiment pas où tu remplis ton tableau.

Ok, merci pr ces explications.

Ben mon tableau se remplit sur cette ligne la :

$MesLignesCmde = $Commande->get_LesLignesCommandes()->getAll();

puis ensuite, dans ma vue, je fais appel à $MesLignesCmde via mon foreach.

Je voit pas ce que je peux dire d’autre, désolé!!

Comment feriez-vous pour remplir le tableau dans le controles?? Puis pour l’afficher dans la vue??

Cordialement


//Dans la classe collection
public function getAll() {
				return $this->objets;
			}

Donc ca retourne un tableau, qui s’il n’a pas été rempli, est vide.

la dessus, sui d’accord.

Mais comment faire alor pour qu’il soit remplit??

Cordialement

Ben je sais pas exactement ton code est structuré.

L’idée c’est de remplir le tableau après l’instance et avant l’affiche:

$Commande = new commande();
$Commande->load_commande($code_cmde);
$MesLignesCmde = $Commande->get_LesLignesCommandes()->getAll();

load_commande($i) étant une méthode récupérant les détails de la commande numéro $i dans une base de données ?

Ok. Je vais essayer de voir ca et je tiens au courant dans les jours à venir.

Mais par contre, je vais avoir un problème, justement c’est ca qui me bloque depuis le début je pense c’est que load_commande sera dans ma classe ‘DAO_Commande’ car c’est la classe qui permet d’accéder au données de ma base de données. Alors que ‘get_LesLignesCommande()’ apartien à la classe ‘Commande’ et il n’y a aucun héritage entre les 2 classes.

Comment faire dans ces cas là??

Cordialement!!

bonjour tout le monde,

voici la méthode ‘DétailComande()’ :

public static function DetailCommande($code)
		{
			$requete="SELECT LC.NUMLIGNE, LC.CODECAT, A_MARQUE, A_MODELE, Lc_QTE, Lc_PrixHT FROM ligne_commande as LC, commande as C, article as A WHERE C.ID_CDE=LC.ID_CDE AND (LC.CODECAT, LC.ID_ART)=(A.CODECAT, A.A_ID) AND C.ID_CDE=".$code;
			//echo $requete;
			$resultat = mysql_query($requete);
			
			$macol=new collection;
			
			while($row = mysql_fetch_array($resultat))
			{
				$macol->add($resultat);
			}
			return $macol->getAll();
			
		}

je sais pas si elle est bonne.
Lorsque dans mon constrole, je fais cela :

<?php
	// récupération du code de la commande
	$code_cmde = $_GET["code"];
$LaCom = DAO_Commande::DetailCommande($code_cmde);
$MesLignesCmde = $LaCom->get_LesLignesCommandes()->getAll();
	require('Vues/V_listeCommande.php');
?>

j’obtien l’erreur suivante : “Fatal error: Call to a member function get_LesLignesCommandes() on a non-object in C:\wamp\www\Moto_28(nouveau)\Controles\C_DetailsCommande.php on line 15” je pense que c’est dut au fait que ‘DétailComande()’ appartien à ma classe ‘DAO_Commande’ (car c’est la classe qui permet d’accéder au données de ma base de données.) alors que ‘get_LesLignesCommande()’ appartient à la classe ‘Commande’ et il n’y a aucun héritage entre les 2 classes.
Donc je vois pas trop comment je peux faire??

Merci d’avance!!

ben pour faire vite tu peux transmettre les infos au constructeur :

$info_commande = DAO_Commande::load_commande($id_cmd);

$info_commande étant un tableau contenant toutes les infos sur la commande en question

ensuite :

$Commande = new commande ( , , , $info_commande, , , , …);

en gros il faut passer les valeurs à l’objet Commande (constructeur)

Sinon, tu peux aussi faire $Commande->load_commande(DAO_Commande::load_commande($id_cmd));
Bref, t’as différente façons de t’y prendre, faut juste essayer de rester cohérent avec le reste de ton code.

j’ai donc suivi ton conseil c’est à dire fais cela :

<?php
	// récupération du code de la commande
	$code_cmde = $_GET["code"];

	$Info_Com = DAO_Commande::DetailCommande($code_cmde);
	
	$Commande = new commande($Info_Com['ID_CDE'], $Info_Com['IDclient'], $Info_Com['DateCmde'], $Info_Com['Co_MontantHT'], $Info_Com['Co_MontantTVA'], $Info_Com['Co_MontantTTC']);

	$MesLignesCmde = $Commande->get_LesLignesCommandes()->getAll();
	require('Vues/V_listeCommande.php');
?>

Mais malheureusement j’obtien toujours la même chose c’est à dire les noms des colonnes mais aucun contenu!!

Cordialement!!

Mh oui, mais c’est là que je comprend pas l’utilité de ta classe collection

public function commande( $leidCde=null, $leClient=null, $laDateCde=null, $lePrixHT=null, $lePrixTVA=null, $lePrixTTC=null)
	{
		$this->Int_numligne=1;
		$this->Int_idCde=$leidCde;
		$this->Date_DateCde = $laDateCde;
		$this->Obj_client = $leClient;
	 	$this->Col_lesLignesCommandes = new collection();
	 	$this->Dec_prixHT = $lePrixHT;
	 	$this->Dec_prixTVA = $lePrixTVA;
	 	$this->Dec_prixTTC = $lePrixTTC;
	}

les valeurs sont a présent dans l"objet $Commande.

public function get_LesLignesCommandes()
 	{
 return array('Int_numligne' => $this->Int_numligne, 'Int_idCde' => $this->Int_idCde, 'Date_DateCde' => $this->Date_DateCde);
 	}

La méthode get_LesLignesCommandes() pourrait directement te renvoyer le tableau sans passer par collection

ok, donc j’ai retiré la collection dans mon constructeur de ma classe ‘commande()’ et voici ce qu’est devenu ‘get_LesLignesCommandes()’ :

public function get_LesLignesCommandes()
 	{
 return array('Int_numligne' => $this->Int_numligne, 'Int_idCde' => $this->Int_idCde, 'Date_DateCde' => $this->Date_DateCde, '$Dec_prixHT' => $this->Dec_prixHT, '$Dec_prixTVA' => $this->Dec_prixTVA, '$Dec_prixTTC' => $this->Dec_prixTTC);
 	}

et donc mon controleur es le suivant :

<?php
	// récupération du code de la commande
	$code_cmde = $_GET["code"];

	$Info_Com = DAO_Commande::DetailCommande($code_cmde);
	
	$Commande = new commande($Info_Com['ID_CDE'], $Info_Com['IDclient'], $Info_Com['DateCmde'], $Info_Com['Co_MontantHT'], $Info_Com['Co_MontantTVA'], $Info_Com['Co_MontantTTC']);

	$MesLignesCmde = $Commande->get_LesLignesCommandes();
	require('Vues/V_listeCommande.php');
?>

mais maintenant voici l’erreur que j’obtient :

la ligne 20 correspond à

<td><div class="contenu"><?php echo $ligne->get_ligne(); ?></div></td>

de ma vue.
Lorsque je réalise

print_r($MesLignesCmde);

juste apré le ‘foreach’ (donc à l’intérieur) voici ce qu’il m’affiche :

Cordialement!!
Edité le 23/12/2008 à 17:14

oui car du coup $MesLignesCmde est un tableau.

Il faut aussi enlever le foreach.
Tu accèdes aux différents éléments : $MesLignesCmde[‘Int_numligne’] …

J’ai retiré le ‘foreach’ et donc ce qui me donne le code de la vue suivante :

<div align="center" class="contenu">
	D&eacute;tail de la commande num&eacute;ro : <?php echo $code_cmde; ?>
</div>

<table>
	<tr>
		<th><h4>Num&eacute;ro de la ligne</h4></th>
		<th><h4>Code de la cat&eacute;gorie</h4></th>
		<th><h4>Marque de l'article</h4></th>
		<th><h4>Mod&eacute;le de l'article</h4></th>
		<th><h4>Quantit&eacute; command&eacute;e</h4></th>
		<th><h4>Prix de l'article</h4></th>
	</tr>
	
			<tr>
				<td><div class="contenu"><?php echo $MesLignesCmde['Int_numligne']; ?></div></td>
				<td><div class="contenu"><?php echo $MesLignesCmde['LC.CODECAT']; ?></div></td>
				<td><div class="contenu"><?php echo $MesLignesCmde['A_MARQUE']; ?></div></td>
				<td><div class="contenu"><?php echo $MesLignesCmde['A_MODELE']; ?></div></td>
				<td><div class="contenu"><?php echo $MesLignesCmde['Lc_QTE']; ?></div></td>
				<td><div class="contenu"><?php echo $MesLignesCmde['Lc_PrixHT']; ?></div></td>
			</tr>
</table>
<div align="center">
	<a href="index.php?action=liste_commande">Retour</a>
</div>

Il m’affiche le bon numéro de la ligne mais c’est tout le reste non!!
Je pense que c’est du au faite que l’appel du constructeur de la classe ‘commande’ faite dans mon controle prend comme paramètre :

$Info_Com['ID_CDE'], $Info_Com['IDclient'], $Info_Com['DateCmde'], $Info_Com['Co_MontantHT'], $Info_Com['Co_MontantTVA'], $Info_Com['Co_MontantTTC']

alors que moi je souhaite afficher : Numéro de la ligne, le code de la catégorie, marque et modèle de l’article, la quantité commandé et le prix de l’article.
Donc en gros les résultats de la requête de ma fonction ‘DetailCommande($code)’ de la classe ‘DAO_Commande’. Comment puis-je faire dans ces cas la??

Cordialement!!
Edité le 23/12/2008 à 20:55