session_start();
, puis on utilise des variables n’importe où dans le script PHP avec le tableau $_SESSION['maVariableDeSession']
.token
de nom PHP_SESSION_ID
dans votre navigateur (client) lors de la commande session_start();
pour savoir à quel client est associé le tableau $_SESSION
.(à chaque nouvelle version de mozilla, ça change)
use Symfony\Component\HttpFoundation\Session\SessionInterface;
$this->monPanier
si il existe par celui en session. public $monPanier = [];
private $session;
public function __construct(SessionInterface $session)
{
$this->session = $session;
// $this->session->clear(); // permet d effacer le contenu de la session
if($this->session->has('monPanier')) {
$this->monPanier = $this->session->get('monPanier');
//dump($this->monPanier);
}
}
<div class="col-md-6" style="width: 60%">
<h3>Liste des produits dans mon panier</h3>
<a class="btn btn-primary" href="{#{ url('client_panierSession_vider') }#}">Éffacer tout</a>
<table class="table" style="border: solid #8959A8 1px ">
<tr>
<th>Nom</th>
<th>Quantité</th>
<th>Prix</th>
<th>Total</th>
<th>Action</th>
</tr>
{% for panier in monPanier %}
<tr style="border: solid #56a83e 2pxpx ">
<td>
{{panier.nom}}
</td>
<td>{{panier.qte}}</td>
<td>{{panier.prix}}</td>
<td>{{panier.prix_total}}</td>
<td>
<a href="{#{ url('client_panierSession_delete', {id: panier.id}#) }}">Supprimer</a>
</td>
</tr>
{% endfor %}
</table>
</div>
'monPanier' => $this->monPanier
dans la méthode showPanierSessionProduitsAjouter quelques méthodes avec leurs routes dans le contrôleur :
Créer une méthode ajouterPanier dans le contrôleur ProduitSessionController. Cette méthode utilise en annotation la route "/client/panier/ajouter/{id}"
de nom client_panierSession_ajouter. Le paramètre id requière un entier.
Créer une méthode supprimerPanier dans le contrôleur ProduitSessionController. Cette méthode utilise en annotation la route "/client/panier/supprimer/{id}"
de nom client_panierSession_supprimer. Le paramètre id requière un entier.
// rechercher avec l'identifiant du produit dans la base de données doctrine le produit à ajouter
$tmp=["id"=>$id,"qte"=>1, "nom"=> $produit->getNom(),"prix"=>$produit->getPrix(),
"prix_total"=> $produit->getPrix() ];
$this->monPanier[$id]=$tmp;
$this->session->set('monPanier', $this->monPanier);
if(!empty($this->monPanier[$id]){
unset($this->monPanier[$id]);
}
$this->session->set('monPanier', $this->monPanier);
Le code précédent ne teste pas si un produit est dans le panier. Si le produit est dans le panier. Il faut incrémenter la quantité de 1.
Modifier la méthode ajouterPanier en vous aidant du code ci-dessous :
if(!empty($this->monPanier[$id])){
$tmp=....,
"prix_total"=> $produit->getPrix() * ($this->monPanier[$id]['qte']+1) ...;
}
else {
$tmp=....;
}
$this->monPanier[$id]=$tmp;
$this->session->set('monPanier', $this->monPanier);
return $this->redirectToRoute('client_panierSession_index');
On désire décrémenter la quantité de -1 si plusieurs identiques produits sont dans le panier. Quand il n’y a que un seul produit dans le panier, supprimer le produit (la ligne) du panier. Le code précédent ne teste pas si plusieurs produits sont dans le panier.
Modifier la méthode supprimerPanier en vous aidant du code ci-dessous :
...
if(!empty($this->monPanier[$id] and $this->monPanier[$id]['qte'] != 1)){
...
ajouter une fonction pour calculer le prix total du panier et afficher ce prix total
ajouter une fonction pour vider le panier en un seul clic
Documentation : https://symfony.com/doc/current/controller.html#flash-messages
....
$this->addFlash('info-produit','produit ajouté !');
....
$this->addFlash('info-produit','produit supprimé !');
{% for message in app.flashes('notice') %}
<div class="info-produit">
{{ message }}
</div>
{% endfor %}
(début du projet)
(ancienne version) video lior chamla https://www.youtube.com/watch?v=_tWL-QDFuQ4&t=4s
use Symfony\Component\HttpFoundation\Session\Session;
public function __construct()
{
$this->session = new Session();
if ($this->session->isStarted())$this->session->start();
if($this->session->has('monPanier')) {
$this->monPanier = $this->session->get('monPanier');