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étail de la commande numéro : <?php echo $code_cmde; ?>
</div>
<table>
<tr>
<th><h4>Numéro de la ligne</h4></th>
<th><h4>Code de la catégorie</h4></th>
<th><h4>Marque de l'article</h4></th>
<th><h4>Modéle de l'article</h4></th>
<th><h4>Quantité commandé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!!
$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
(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);
}
}
?>
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. 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.
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??
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 retiré le ‘foreach’ et donc ce qui me donne le code de la vue suivante :
<div align="center" class="contenu">
Détail de la commande numéro : <?php echo $code_cmde; ?>
</div>
<table>
<tr>
<th><h4>Numéro de la ligne</h4></th>
<th><h4>Code de la catégorie</h4></th>
<th><h4>Marque de l'article</h4></th>
<th><h4>Modéle de l'article</h4></th>
<th><h4>Quantité commandé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 :
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??