Page 1 sur 1

[aide] panier de commande avec variable

Posté : 12 juil. 2012, 10:46
par dyislive
Bonjour, voila j'ai un site web codé en xhtml et je voudrais y ajouter un panier de commande.

Ce panier ne serais que pour l'achat d' un seul produit, avec différentes colories.
Et le soucis le plus gros est que le prix de ce produit varie celons la quantité.

1 sachet = 4,99 euros
2 sachets = 9,98 euros
3 sachets = promo 15,00 12,00 euros
Au delà de 3 sachets, le sachet supplémentaire est à 4,00 euros

Il faudrait en faite que les clients puissent choisir de cette façon:
Sachet:
[transparent] 0
[blanc ] 2
[réglisse ] 0
[rose pastelle] 3
[rose] 4
[bleu ] 0
[violet] 0
[jaune] 0

Par la suite le panier afficherait le prix directement.
Donc il faudrait que le panier calcule seul le prix et l'affiche pour le client, et ensuite lorsque le client confirme la commande, il soit rediriger sur la page de paiement et que la commande détailler avec le nombre de sachet et la colorie nous soit envoyer par e-mail.

Merci d'avance. Si vous voulez plus de détail ou que mon explication n'est pas très claire, demandez moi.

Re: [aide] panier de commande avec variable

Posté : 13 juil. 2012, 11:35
par sadeq
Bonjour, voici une fonction qui détermine le prix selon la quantité conformément aux règles que tu veux:
<?php
# prix par Qtés
/*
1 sachet = 4,99 euros
2 sachets = 9,98 euros
3 sachets = promo 15,00 12,00 euros
Au delà de 3 sachets, le sachet supplémentaire est à 4,00 euros 
*/
function getPrix($qte)
{
	if ($qte <1) return 0;
	elseif ($qte ==1) return 4.99;
	elseif ($qte ==2) return 9.98;
	elseif ($qte ==3) return 12.00; #promo
	elseif ($qte >3) return 4.00*($qte-3)+getPrix(3); #pour qte suppl.
}
# test d'usage de la fonction
echo "Prix pour qte <1: ",getPrix(-1),"<br>";
echo "Prix pour qte =1: ",getPrix(1),"<br>";
echo "Prix pour qte =2: ",getPrix(2),"<br>";
echo "Prix pour qte =3: ",getPrix(3),"<br>";
echo "Prix pour qte >3 (10): ",getPrix(10),"<br>";
?>
Tu peux utiliser cette fonction dans ton panier pour calculer le prix de chaque quantité achetée.

Re: [aide] panier de commande avec variable

Posté : 13 juil. 2012, 14:32
par dyislive
Je teste sa et je vois si cela marche.
En vous remerciant pour votre réponse

Edit

J'ai essayer de le mettre en place mais je n'y arrive pas.
Y aurais-t-il la possibilité de m'aider a faire un code fonctionnel? Avec une ligne envoyant un message a mon adresse de la commande indiquant la couleur et la quantité de chaque sachets et le prix, et dans un autre temps, rediriger le client sur la page de paiement.

En vous remerciant d'avance

Re: [aide] panier de commande avec variable

Posté : 14 juil. 2012, 15:30
par moogli
salut,

pour le taff fait à ta place c'est le forum "recrutement".

si tu nous montre ce que tu as fait et nous dit ce qui ne vas pas on peu surement t'aider.

Mais tu a déja eu une bonne partie du code tout cuit c'est déja pas mal ;)

l'envoie de mail c'est avec la fonction mail

@+

Re: [aide] panier de commande avec variable

Posté : 15 juil. 2012, 17:07
par sadeq
Bonjour, comme j'ai l'habitude d'aider par l'exemple, je continue jusqu'au bout et je vous présente l'exemple suivant d'un panier d'achat de sachets colorés dont le prix est fixé selon la quantité achetée.


Fichier principal : catalogue.php
<style>
	.info { display:block; }
	.catalogue { display:block; width:100%; }
	.produit { display:inline-block; text-align:center; border-radius:5px; border:solid black 1px; margin:2px;}
</style>

<!-- debut ruban d'information -->
<div class="info">
	<h1>Prix</h1>
	<ul>
		<li>1 sachet = 4,99 euros</li>
		<li>2 sachets = 9,98 euros</li>
		<li>3 sachets = promo 15,00 12,00 euros</li>
		<li>Au delà de 3 sachets, le sachet supplémentaire est à 4,00 euros</li>
	</ul>
</div>
<!-- fin ruban d'information -->

<!-- debut panier -->
<div class="panier"><?php include('panier.php');?></div>
<!-- fin panier -->

<!-- debut catalogue -->
<div class="catalogue"><h1>Catalogue</h1>
<?php
# afficher la liste des produits du catalogue
# données visibles : Photo -- Designation
# données cachées : id_produit
# action : acheter (envoi l'id_produit au panier.php)

# constantes
define('DOSSIER_IMG', 'images/');

# obtenir les données à partir de la base catalogue
# 1. se connecter à mySQL et à la base
$connexion = @mysql_connect('localhost','root','') or die (mysql_errno().' : '.mysql_error());
@mysql_select_db('ecommerce_2', $connexion) or die (mysql_errno().' : '.mysql_error());

# 2. exécuter la requête
$sql = 'select * from catalogue';
$curseur = @mysql_query($sql, $connexion);
while(is_resource($curseur) && ($row=@mysql_fetch_assoc($curseur)))
{
	#
	$id_produit = $row['id'];
	$designation = $row['designation'];
	$photo = DOSSIER_IMG.$row['photo']; 
	# creation du fichier de la photo si n'existe pas
	if (!file_exists($photo)) {
		# si la copie du modele "Image_Vide.jpg" n'a pas reussi, il faut creer une image vide
		if (!file_exists(DOSSIER_IMG.'Image_Vide.jpg') || !copy(DOSSIER_IMG.'Image_Vide.jpg', $photo)) {creerImageVide($photo);}
	}
?>

<!-- modèle d'affichage d'un produit -->
<div class="produit">
	<form class="formAchat" name="formAchat" method="get" action="">
		<h2 class="designation"><?php echo isset($designation)?$designation:null;?></h2>
		<img class="photo" src="<?php echo isset($photo)?$photo:null;?>" />
		<input type="hidden" name="id_produit" value="<?php echo isset($id_produit)?$id_produit:null;?>" />
		<input type="hidden" name="designation" value="<?php echo isset($designation)?$designation:null;?>" />
		<input type="hidden" name="photo" value="<?php echo isset($photo)?$photo:null;?>" />
		<p><input type="submit" class="commande" name="acheter" value="Acheter" /></p>
	</form>
</div>
<!-- fin modèle d'affichage d'un produit -->
<?php
} # fin de la boucle WHILE

# 3. fermer la connexion
@mysql_close($connexion);
?>
</div>
<!-- fin catalogue -->

<?php 
#fonction de creation d'une image
function creerImageVide($nomFichier)
{
	// Création de l'image
	$largeur = 138;
	$hauteur = 152;
	$im= imagecreatetruecolor($largeur, $hauteur);

	// Couleurs
	$couleurFond = imagecolorallocate($im,255,0,0); // rouge
	$couleurTexte = imagecolorallocate($im,255,255,255 ); // blanc
	 
	// Création d'un rectangle
	imagefilledrectangle($im, 5, 5,$largeur-5,$hauteur-5,$couleurFond);
	 
	// Création d'une image vide et ajout d'un texte
	$texte = "Pas d'image";
	$taille_police = 6; 
	$posX_centreH = centrerH_texte($texte,$taille_police,$largeur);
	$posY_centreV = centrerV_texte($texte,$taille_police,$hauteur);
	imagestring($im,$taille_police,$posX_centreH,$posY_centreV,$texte,$couleurTexte); 
		
	// Sauvegarde de l'image sous le nom $nomFichier
	imagejpeg($im, $nomFichier);

	// Libération de la mémoire
	imagedestroy($im);
}
// Fonctions pour déterminer le centrage horizontal de texte dans un cadre
function centrerH_texte($texte,$taille_police,$largeur_cadre)
 {
	  // nombre de caractères dans le texte
	  $a = strlen($texte);
	  // taille d'un caractère par rapport à la taille de la police
	  $b = imagefontwidth($taille_police);
	  // taille en pixel du texte  
	  $c = $a*$b;
	  // position centre horizontal
	  return ($largeur_cadre-$c)/2;
 }
 // Fonctions pour déterminer le centrage vertical de texte dans un cadre
function centrerV_texte($texte,$taille_police,$hauteur_cadre)
 {
	  // hauteur du texte
	  $hauteur_police = imagefontheight($taille_police);
	  // position centre vertical
	  return ($hauteur_cadre/2)-($hauteur_police/2);
 }
?>
Fichier Panier.php
<style>
	.panier { display:block; text-align:center; float:right; border-radius:5px; border:solid black 1px; margin:2px;}
	.panier img { width:60px; }
	.panier .designation { font-size:0.7em; }
	.commande {  }
</style>

<center><button onclick="if (document.getElementById('panier').style.display=='none'){document.getElementById('panier').style.display='block';this.innerHTML='Fermer';} else {document.getElementById('panier').style.display='none';this.innerHTML='Afficher panier';}">Fermer</button></center>

<div id="panier"><h1>Votre panier</h1>
<?php
# afficher la liste des produits du panier
# données visibles : Photo -- Designation -- Prix -- Qté -- Total
# données cachées : id_produit
# actions : acheter, modifier la qté, supprimer un produit, valider le panier ou revenir au catalogue

# Démarrer la session
session_start();
#echo '<pre>'; print_r($_SESSION); echo '</pre>';

# la variable de session est : $_SESSION['panier']['contenu']=array('produit','qte','prix') dont: produit=array('id','designation','photo')
# sachant que le produit est unique dans le panier, donc le panier est indexé par id_produit : $_SESSION['panier']['contenu'][$id_produit]

##########################################
#	Règles determinant le prix par Qtés
##########################################
/*
1 sachet = 4,99 euros
2 sachets = 9,98 euros
3 sachets = promo 15,00 12,00 euros
Au delà de 3 sachets, le sachet supplémentaire est à 4,00 euros
*/
function getPrix($qte)
{
        if ($qte <1) return 0;
        elseif ($qte ==1) return 4.99;
        elseif ($qte ==2) return 9.98;
        elseif ($qte ==3) return 12.00; #promo
        elseif ($qte >3) return 4.00*($qte-3)+getPrix(3); #pour qte suppl.
}

##############################
#	TRAITEMENT DU PANIER
##############################
# initialiser total panier
if (!isset($_SESSION['panier']['total'])) { $_SESSION['panier']['total'] = 0; }

# Action = Acheter
if (isset($_GET['acheter']) && isset($_GET['id_produit'])){
	# variables de travail
	$id_produit 	= $_GET['id_produit'];
	$designation 	= $_GET['designation'];
	$photo 			= $_GET['photo'];
	
	# affectation du produit
	if (!isset($_SESSION['panier']['contenu'][$id_produit])){
		# nouveau produit
		$_SESSION['panier']['contenu'][$id_produit] = array(
			'qte'			=> 1,
			'id_produit' 	=> $id_produit,
			'designation' 	=> $designation,
			'prix'			=> getPrix(1),
			'photo'			=> $photo
		);
		# produit nouveau => mettre à jour total panier par prix
		$_SESSION['panier']['total'] += $_SESSION['panier']['contenu'][$id_produit]['prix'];
	}
	else {
		# produit existe => incrémentation de la qté
		$_SESSION['panier']['contenu'][$id_produit]['qte']++;
		# produit existe => mettre à jour total panier par prix
		$_SESSION['panier']['total'] -= $_SESSION['panier']['contenu'][$id_produit]['prix'];
		$_SESSION['panier']['contenu'][$id_produit]['prix'] = getPrix($_SESSION['panier']['contenu'][$id_produit]['qte']);
		$_SESSION['panier']['total'] += $_SESSION['panier']['contenu'][$id_produit]['prix'];
	}
}
# Action = Modifier
if (isset($_GET['modifier']) && isset($_GET['id_produit'])&& isset($_SESSION['panier']['contenu'][$_GET['id_produit']])){
	# variables de travail
	$id_produit = $_GET['id_produit'];
	$qte 		= $_GET['qte'];
	# modifier la qté
	$_SESSION['panier']['contenu'][$id_produit]['qte'] = $qte;
	# produit existe => mettre à jour total panier par prix
	$_SESSION['panier']['total'] -= $_SESSION['panier']['contenu'][$id_produit]['prix'];
	$_SESSION['panier']['contenu'][$id_produit]['prix'] = getPrix($qte);
	$_SESSION['panier']['total'] += $_SESSION['panier']['contenu'][$id_produit]['prix'];
}
# Action = Supprimer
if (isset($_GET['supprimer']) && isset($_GET['id_produit']) && isset($_SESSION['panier']['contenu'][$_GET['id_produit']])){
	# variables de travail
	$id_produit = $_GET['id_produit'];

	# produit existe => mettre à jour total panier par prix
	$_SESSION['panier']['total'] -= $_SESSION['panier']['contenu'][$id_produit]['prix'];
	# supprimer le produit
	unset($_SESSION['panier']['contenu'][$id_produit]);
}

# Action = Supprimer Panier
if (isset($_GET['supprimerPanier']) && isset($_SESSION['panier'])){
	unset($_SESSION['panier']);
	# rediriger vers le catalogue
	header('Location: catalogue.php');
	exit();
}

# Action = Valider : enregistrer le panier dans la base
if (isset($_GET['valider']) && isset($_SESSION['panier']) && count($_SESSION['panier']['contenu'])>0 && isset($_GET['email'])){
	# se connecter à mySQL et à la base
	$connexion = @mysql_connect('localhost','root','') or die (mysql_errno().' : '.mysql_error());
	@mysql_select_db('ecommerce_2', $connexion) or die (mysql_errno().' : '.mysql_error());
	
	# enregistrer commande
	$id_commande = date('Y-m-d-H-i-s').'-'.$_GET['email'];
	$sql = "INSERT INTO commande(id_commande,date_commande,email,total) VALUES ('$id_commande','".date('Y-m-d H:i:s')."','".$_GET['email']."',".$_SESSION['panier']['total'].")";
	@mysql_query($sql, $connexion);
	#
	foreach($_SESSION['panier']['contenu'] as $id_produit=>$contenu) # pour chaque ligne du panier
	{
		# variables de travail
		$id_produit = $contenu['id_produit'];
		$qte = $contenu['qte'];
		$prix = $contenu['prix'];
		
		# 2. exécuter la requête
		$sql = "INSERT INTO panier(id_commande,id_produit,qte,prix) VALUES ('$id_commande','$id_produit','$qte','$prix')";
		@mysql_query($sql, $connexion);
	}
	# 3. fermer la connexion
	@mysql_close($connexion);
	
	# envoyer un mail de confirmation au client : voir la fonction mail()
	
	# ecrire une trace
	$contenu_existant = file_get_contents('journal.txt');
	file_put_contents('journal.txt', $contenu_existant.'Date commande:'.date('Y-m-d').'; Email:'.$_GET['email'].'; Id Commande:'.$id_commande.'; Montant:'.$_SESSION['panier']['total']." euros.\n");
	
	#vider le panier
	unset($_SESSION['panier']);
	
	# rediriger vers le catalogue
	header('Location: catalogue.php');
	exit();
}

# Affichage du panier

if (isset($_SESSION['panier']['contenu']) && is_array($_SESSION['panier']['contenu']) && count($_SESSION['panier']['contenu'])>0){
	$total = $_SESSION['panier']['total'];	
	foreach($_SESSION['panier']['contenu'] as $id_produit=>$contenu) # pour chaque ligne du panier
	{
		# definir la variable qte pour le formulaire modif
		$id_produit 	= $contenu['id_produit'];
		$designation 	= $contenu['designation'];
		$photo 			= $contenu['photo'];
		$qte 			= $contenu['qte'];
		$prix 			= $contenu['prix'];
	?>
	
	<!-- modèle d'affichage d'un produit -->
	<div class="produit">
		<form class="formAchat" name="formAchat" method="get" action="">
			<h2 class="designation"><?php echo isset($designation)?$designation:null;?></h2>
			<img class="photo" src="<?php echo isset($photo)?$photo:null;?>" />
			
			<p>Qté : <input type="text" name="qte" value="<?php echo isset($qte)?$qte:0;?>" /></p>
			<p>Prix : <span class="prix"><?php echo isset($prix)?number_format($prix,2,',',' ').' &euro;':null;?></span></p>
			
			<input type="hidden" name="id_produit" value="<?php echo isset($id_produit)?$id_produit:null;?>" />
			<p><input type="submit" class="commande" name="modifier" value="Modifier" />
			<input type="submit" class="commande" name="supprimer" value="Supprimer" /></p>
		</form>
	</div>
	<!-- fin modèle d'affichage d'un produit -->
	
	<?php
	} # fin de la boucle FOREACH $_SESSION['panier']['contenu']
	?>
	<form class="formAchat" name="formAchat" method="get" action="">
		<p>Total : <span class="prix"><?php echo isset($total)?number_format($total,2,',',' ').' &euro;':null;?></span></p>
		<p>Votre Email : <input type="text" name="email" value="<?php echo isset($_GET['email'])?$_GET['email']:null;?>" /></p>
		
		<p><input type="submit" class="commande" name="valider" value="Valider votre panier" />
		<input type="submit" class="commande" name="supprimerPanier" value="Supprimer panier" /></p>
	</form>
<?php
} # fin de SI is_array($_SESSION['panier']['contenu']
else {
	# tableau panier est vide
	echo '<p class="message">Vide</p>';
}
?>
</div>
Ces programmes utilsent une base de données MySQL nommée = "ecommerce_2" qu'il faut créé dans PHPMyADMIN et créer son contenu par le script suivant:
-- phpMyAdmin SQL Dump
-- version 3.4.10.1
-- http://www.phpmyadmin.net
--
-- Client: localhost
-- Généré le : Ven 13 Juillet 2012 à 22:47
-- Version du serveur: 5.5.20
-- Version de PHP: 5.3.10


--
-- Base de données: `ecommerce_2`
--

-- --------------------------------------------------------

--
-- Structure de la table `catalogue`
--

CREATE TABLE IF NOT EXISTS `catalogue` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `designation` varchar(255) NOT NULL,
  `photo` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;

--
-- Contenu de la table `catalogue`
--

INSERT INTO `catalogue` (`id`, `designation`, `photo`) VALUES
(1, 'Sachet transparent', 'Sachet_transparent.jpg'),
(2, 'Sachet blanc', 'Sachet_blanc.jpg'),
(3, 'Sachet réglisse', 'Sachet_reglisse.jpg'),
(4, 'Sachet rose pastelle', 'Sachet_rose_pastelle.jpg'),
(5, 'Sachet rose', 'Sachet_rose.jpg'),
(6, 'Sachet bleu', 'Sachet_bleu.jpg'),
(7, 'Sachet violet', 'Sachet_violet.jpg'),
(8, 'Sachet jaune', 'Sachet_jaune.jpg');

-- --------------------------------------------------------

--
-- Structure de la table `commande`
--

CREATE TABLE IF NOT EXISTS `commande` (
  `id_commande` varchar(255) NOT NULL,
  `date_commande` datetime NOT NULL,
  `email` varchar(255) NOT NULL,
  `total` float NOT NULL DEFAULT '0',
  PRIMARY KEY (`id_commande`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Contenu de la table `commande`
--

INSERT INTO `commande` (`id_commande`, `date_commande`, `email`, `total`) VALUES
('[email protected]', '2012-07-13 21:36:50', '[email protected]', 76.95);

-- --------------------------------------------------------

--
-- Structure de la table `panier`
--

CREATE TABLE IF NOT EXISTS `panier` (
  `id_commande` varchar(255) NOT NULL,
  `id_produit` int(11) NOT NULL,
  `qte` int(11) NOT NULL,
  `prix` float NOT NULL,
  UNIQUE KEY `id_commande` (`id_commande`,`id_produit`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Contenu de la table `panier`
--

INSERT INTO `panier` (`id_commande`, `id_produit`, `qte`, `prix`) VALUES
('[email protected]', 1, 1, 4.99),
('[email protected]', 2, 1, 4.99),
('[email protected]', 3, 3, 12),
('[email protected]', 4, 1, 4.99),
('[email protected]', 6, 2, 9.98),
('[email protected]', 8, 10, 40);

Ces fichiers doivent être logés dans un dossier de projet nommé "panier" qui contient un sous-dossier nommé "images" pour les images des produits vendus.

J'espère que ça va aider.