Created
January 20, 2015 20:19
-
-
Save AndrianD/9d1706d5a8cbef29269f to your computer and use it in GitHub Desktop.
the famous php bag
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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éférence <span style="font-weight: bold;">WATCA0-<?= $detailCommande ["id_commande"] ?></span> sur notre site WATCHLUX. <br /> | |
<em>Les détails de vos achats sont figuré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écapitulatif de votre commande:</h2> | |
</td> | |
</tr> | |
<tr> | |
<td> | |
<table id="tableCommande"> | |
<tr> | |
<th class="productName">Produit</th> | |
<th>Quantité</th> | |
<th>Prix (en €)</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 €)</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é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