utilisation des variables de sessions



(à chaque nouvelle version de mozilla, ça change)


use Symfony\Component\HttpFoundation\Session\SessionInterface;
    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>


Ajouter quelques méthodes avec leurs routes dans le contrôleur :

ajouter des produits dans le tableau en session

// 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);

supprimer un produit du panier

if(!empty($this->monPanier[$id]){
    unset($this->monPanier[$id]);
}
$this->session->set('monPanier', $this->monPanier);

ajouter un produit

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');

supprimer un produit du panier

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)){
...

total de la commande

ajouter une fonction pour calculer le prix total du panier et afficher ce prix total

vide le panier

ajouter une fonction pour vider le panier en un seul clic

Messages “Flash”

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 %}

Exercice : réaliser les filtres sur les produits

(début du projet)



annexe

(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');

exemple:gestion d’un panier sur un site de vente