Skip to content

Instantly share code, notes, and snippets.

@AndrianD
Created January 20, 2015 20:19
Show Gist options
  • Save AndrianD/9d1706d5a8cbef29269f to your computer and use it in GitHub Desktop.
Save AndrianD/9d1706d5a8cbef29269f to your computer and use it in GitHub Desktop.
the famous php bag
<?php
/**
* Class PanierController
*
* Voir le panier
* Ajouter au panier
* Vider le panier
* Retirer du panier
* Valider le panier
*/
class PanierController
{
private $id;
public function __construct()
{
$this->id = filter_input(INPUT_POST, 'id', FILTER_SANITIZE_SPECIAL_CHARS);
}
/**
* Ajout d'une montre au panier
* url : /panier/ajout/{id_produit}
*
* @param bool $sessionMembre Si un membre est connecté ou non
* @param bool $sessionAdmin Si un admin est connecté ou non
* @return array La vue du panier (via la méthode panier)
*/
public function ajoutPanier($sessionMembre, $sessionAdmin)
{
// Récupération de l'id de la montre
//$id = filter_input(INPUT_POST, 'id', FILTER_SANITIZE_SPECIAL_CHARS) ;
$qte = filter_input(INPUT_POST, 'qte', FILTER_VALIDATE_INT);
if (empty($this->id)) {
return $this->panier($sessionMembre, $sessionAdmin);
}
// Récupération du contenu de la montre correspondant à l'id
$produit = (new ProduitModel)->montreUniqueAVendre($this->id);
if (empty($produit)) {
return array(
'erreur',
array(
'titre' => 'Produit Introuvable',
'message' => 'Le produit demandé n\'a pas pu être ajouté au panier.'
)
);
}
// Ajout des données de la montre à la session
$_SESSION['panier'][$produit['id_produit']] = array(
'id' => $produit['id_produit'],
'url' => $produit['url'],
'marque' => $produit['marque'],
'nom' => $produit['nom'],
'genre' => $produit['genre'],
'style' => $produit['style'],
'couleur' => $produit['couleur'],
'prix-unitaire' => $produit['prix'],
'prix' => $produit['prix'] * $qte,
'qte' => $qte
);
return $this->panier($sessionMembre, $sessionAdmin);
}
/**
* Voir le panier plein / vide
* url : /panier
*
* @param bool $sessionMembre Si un membre est connecté ou non
* @param bool $sessionAdmin Si un admin est connecté ou non
* @return array La vue du panier ou panier vide, ainsi que le contenu à y faire passer
*/
public function panier($sessionMembre, $sessionAdmin)
{
// Jeton de Sécurisation
$render['jeton'] = (new Jeton)->getJetonActuel();
// Données Panier
if (!empty($_SESSION['panier'])) {
$render['panier'] = $_SESSION['panier'];
$totalfinal = 0;
foreach ( $render['panier'] as $p ) {
$totalfinal += ($p['prix']);
}
$render['totalfinal'] = $totalfinal;
// Verification de l'existence d'une éventuelle promo
if(isset($_SESSION['promo'])):
//var_dump($_SESSION['promo']);
$reductionpromo = intval($_SESSION['promo']['reduction_promo']);
$render['codepromo'] = $_SESSION['promo']['code_promo'];
$render['reductionpromo'] = $reductionpromo;
$render['totalfinalavecreduction'] = $totalfinal - ($totalfinal* (int)$reductionpromo / 100 );
endif;
// Vue
$vue[] = 'panier';
} else {
// Vue
$vue[] = 'panier, paniervide';
}
// CSS
$render['css'][] = 'panier';
return array($vue, $render);
}
/**
* Validation de la commande
* url : /panier/valider
*
* @param bool $sessionMembre Si un membre est connecté ou non
* @param bool $sessionAdmin Si un admin est connecté ou non
* @return array La vue du panier (via la méthode panier)
*/
public function validerPanier($sessionMembre, $sessionAdmin)
{
// Vérification de connexion
if (empty($sessionMembre) || empty($_SESSION['utilisateur'])) {
return array('erreur, pasconnectermembre', false);
}
// Session dans une variable pour l'envoi par email
$utilisateur = $_SESSION['utilisateur'];
$panier = $_SESSION['panier'];
$render['utilisateur'] = $utilisateur;
$render['panier'] = $panier;
$totalfinal = 0;
foreach ( $render['panier'] as $p ) {
// insertion prix total en BDD
if(!empty($_SESSION['promo'])):
$reductionpromo = intval($_SESSION['promo']['reduction_promo']);
$totalfinal += ($p['prix'] - ( $p['prix'] * $reductionpromo / 100 ) );
else:
$totalfinal += ($p['prix']);
endif;
}
$render['totalfinal'] = $totalfinal;
// Model Produit
$produitModel = (new ProduitModel);
// Les Items commandés
$item = array();
// Message d'erreur informatif
$erreur = array();
// Préparation des données panier en fonction de la quantité
foreach ( $panier as $produit ):
$p = $produitModel->content($produit['id']);
if (!empty($p) && $produit['qte'] <= $p['stock']) {
//récupération du nouveau stock après la soustraction
$nouveauStock = (int)$p['stock'] - (int)$produit['qte'];
// Mise à jour du produit en base
$verif = $produitModel->modifier($produit['id'], array('stock' => $nouveauStock));
// Vérification
if (!empty($verif)) {
// Le produit commandé (pour le mail)
$item[$produit['id']] = $produit;
//$render['produit'] = $item[$produit['id']];
// Effacer le produit du panier
unset($_SESSION['panier'][$produit['id']]);
}
} else {
if (!empty($p['stock']) && $p['stock'] > 0 && $produit['qte'] >= $p['stock']) {
$erreur[$produit['id']] =
'Le produit : ' . $p['nom'] . ' de la marque : ' . $p['marque'] . ' n\'a pas pu être commandé. <br />Il ne reste plus suffisamment de montre en stock : ' . $p['stock'] . ' élément(s)';
} else {
$erreur[$produit['id']] =
'Le produit : ' . $p['nom'] . ' de la marque : ' . $p['marque'] . ' n\'a pas pu être commandé. <br />Il n\'est plus en stock.';
}
}
endforeach;
// vue pour le debug UNIQUEMENT
$vue[] = ('panier, contenu-panier');
// return array($vue,$render);
// Voilà, sauf bug au faute de frappe :
// Ne restera dans le panier que les produits qui n'ont pas pu être commandé.
// Et tu peux éventuellement afficher le message d'erreur correspondant à ton produit, je les ai écrit au dessus.
//-------------------------------------------------------------------------
## À FAIRE ##
// Inscription de la commande dans les tables Commande / Détail Commande
/*
EX :
$donnees = (new CommandeModel)->validerCommande( $utilisateur , $panier ) ;
*/
if (!empty($utilisateur)):
(new CommandeModel)->validerCommande($utilisateur['id_membre'], $totalfinal);
$detailCommande = (new CommandeModel)->recupIDCommande();
$commande_id = $detailCommande ["id_commande"];
foreach ( $render['panier'] as $monpanier ):
$id_produit = $monpanier['id'];
$url = $monpanier['url'];
$marque = $monpanier['marque'];
$nom = $monpanier['nom'];
$genre = $monpanier['genre'];
$style = $monpanier['style'];
$couleur = $monpanier['couleur'];
$quantite = $monpanier['qte'];
$prix = $monpanier['prix'];
$insertDetail = new DetailCommandeModel;
$insertDetail->detailCommande(
$commande_id,
$id_produit,
$url,
$marque,
$nom,
$genre,
$style,
$couleur,
$quantite,
$prix
);
endforeach;
// echo "<hr/><pre>";
// var_dump($commande_id, $render['panier']); echo "</pre>";exit;
//-----------------------------------------------------------------
else:
$render['titre'] = "ERREUR — COMMANDE";
$render['message'] =
"Une erreur est survenue lors de l'enregistrement de la commande.<br />Veuillez nous excuser pour la gène occasionnée.";
return array('erreur', $render);
endif;
//var_dump($render['panier']);exit;
// EMAIL : envoi client / boutique
$to = $_SESSION['utilisateur']['email'];
$subject = "Validation de votre commande REF: WATCA0-".$detailCommande ["id_commande"]."";
$message = '';
ob_start(); ?>
<html>
<head>
<style type="text/css">
table#tableCommande{
text-align: center;
border: 1px solid #ddd;
width: 100%;
min-height: 450px;
}
table#tableCommande th.productName{
width: 50%;
}
table#tableCommande tr.titreCommande{
border: 1px solid #6D0019;
}
table#tableCommande td.prixTotal{
background: linear-gradient(#980118 15%, #7F0114 100%);
color: #fff;
font-weight: bold;
}
div.msgThanks{
border: 1px solid #DEDEDE;
border-radius: 2px;
padding: 5px;
}
</style>
</head>
<body>
<table id="contentCommande">
<tr>
<td>
<img src="http://watchlux.zandriana.fr/www/images/logo.png" alt="logo-watchlux" width="30%">
</td>
</tr>
<tr>
<td>
<div class="msgThanks"> Nous vous remercions de votre achat portant la r&eacute;f&eacute;rence <span style="font-weight: bold;">WATCA0-<?= $detailCommande ["id_commande"] ?></span> sur notre site WATCHLUX. <br />
<em>Les d&eacute;tails de vos achats sont figur&eacute;s ci-dessous.</em>
<h3>Adresse de livraison:</h3>
<p><?= $utilisateur['nom']?> <?=$utilisateur['prenom'] ?></p>
<p><?= $utilisateur['adresse'] ?></p>
<p><?= $utilisateur['cp'] ?> - <?= $utilisateur['ville'] ?></p>
</div>
</td>
</tr>
<tr>
<td>
<h2>R&eacute;capitulatif de votre commande:</h2>
</td>
</tr>
<tr>
<td>
<table id="tableCommande">
<tr>
<th class="productName">Produit</th>
<th>Quantit&eacute;</th>
<th>Prix (en &euro;)</th>
</tr>
<? $ttc = 0; foreach($render['panier'] as $mypanier):?>
<tr>
<td style="text-align: center"><?= strtoupper($mypanier['nom'] )?></td>
<td style="text-align: center"><?= $mypanier['qte'] ?></td>
<td style="text-align: center"><?= $mypanier['prix'] ?></td>
<? $ttc += $mypanier['prix'] ?>
</tr>
<? endforeach; ?>
<tr>
<td colspan="2" class="prixTotal" style="text-align: right;">TOTAL TTC (en &euro;)</td>
<td class="prixTotal" style="text-align: center; font-weight: bold;"><? $ttc = (isset($_SESSION['promo'])) ? $ttc - $ttc * $_SESSION['promo']['reduction_promo'] / 100 : $ttc; echo $ttc; ?>
</td>
</tr>
<tr>
<td colspan="3">
<p><? $msguser = (isset($_SESSION['promo'])) ? "Sur cet achat vous avez promu d'une r&eacute;duction de ".$_SESSION['promo']['reduction_promo'] ." %" : "" ; echo $msguser; ?></p>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>
<? $recupInfo = ob_get_contents(); ob_get_clean();
$message .= $recupInfo ;
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
$headers .= 'From: Watchlux <[email protected]>' . "\r\n";
//Envoi du mail récapitulatif à l'utilisateur
mail($to,$subject,$message, $headers);
// Vider le panier
unset($_SESSION['panier']);
// Vider la session promo et renvoie l'Etat-promo à 0 (0 = inactif)
if(!empty( $_SESSION['promo'])){
$updatePromo = (new PromoModel)->updateEtatPromo($_SESSION['promo']['code_promo']);
if($updatePromo){
unset( $_SESSION['promo']);
}else{
return "Erreur de suppression du code promo";
}
}
// Message commande réussie
return array('panier, commandereussie', $render);
}
/**
* Vider le panier
* url : /panier/vider
*
* @param bool $sessionMembre Si un membre est connecté ou non
* @param bool $sessionAdmin Si un admin est connecté ou non
* @return array La vue du panier (via la méthode panier)
*/
public function viderPanier($sessionMembre, $sessionAdmin)
{
unset($_SESSION['panier']);
return $this->panier($sessionMembre, $sessionAdmin);
}
/**
* Retirer une montre du panier
* url : /panier/retirer/{id_produit}
*
* @param bool $sessionMembre Si un membre est connecté ou non
* @param bool $sessionAdmin Si un admin est connecté ou non
* @return array La vue du panier (via la méthode panier)
*/
public function retirerPanier($sessionMembre, $sessionAdmin)
{
$id = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_SPECIAL_CHARS);
if (!empty($id)) {
unset($_SESSION['panier'][$id]);
}
return $this->panier($sessionMembre, $sessionAdmin);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment