templates/frontoffice_bundle/panier/panier.html.twig line 1

  1. {% extends "frontoffice_bundle/base.html.twig" %}
  2. {% block body %}
  3. <style>
  4. .error{
  5.     color:red;
  6. }
  7. .cart_quantity_delete{
  8.         cursor: pointer !important;
  9. }
  10. </style>
  11.     <div class="container-fluid page-header py-5">
  12.         <h1 class="text-center text-white display-6">Panier</h1>
  13.         <ol class="breadcrumb justify-content-center mb-0">
  14.             <li class="breadcrumb-item"><a href="/">Acceuil</a></li>
  15.             {# <li class="breadcrumb-item"><a href="#">Pages</a></li> #}
  16.             <li class="breadcrumb-item active text-white">Panier</li>
  17.         </ol>
  18.     </div>
  19.     <section id="cart_items">
  20.         <div class="container mt-2">
  21.             <div class="successMsg" id="successMsg" style="display: none;">
  22.             </div>
  23.             <div class="error" id="errorMsg" style="display: none;">
  24.             </div>
  25.             <br/>
  26.             {% if articles|length > 0 %}
  27.             <div class="table-responsive cart_info">
  28.                 <form method="POST" id="updateForm">
  29.                     <input type="hidden" name="formName" value="updateQte" />
  30.                     <table class="table table-condensed">
  31.                         <thead>
  32.                         <tr class="cart_menu">
  33.                             <td class="image">Article</td>
  34.                             <td class="description"></td>
  35.                             <td class="price">Prix</td>
  36.                             <td class="quantity">Quantité</td>
  37.                             <td class="total">Total</td>
  38.                             <td></td>
  39.                         </tr>
  40.                         </thead>
  41.                         <tbody>
  42.                         {% for a in articles %}
  43.                             <input type="hidden" name="ids[]" value="{{ a["obj"].id }}" />
  44.                             <tr>
  45.                                 <td class="cart_product">
  46.                                 <img src="{{ asset(a["obj"].imgPrincipale) }}" style="max-height: 100px;max-width: 100px;" alt="">
  47.                                 </td>
  48.                                 <td class="cart_description">
  49.                                     <h4>{{ a["pan"].designation }}</h4>
  50.                                     <p>Unité : {{ a["pan"].unite }}</p>
  51.                                 </td>
  52.                                 <td class="cart_price">
  53.                                     <p>{{ a["pan"].prixU }} DH</p>
  54.                                     <input type="hidden" name="prix_u" id="prix_u" value="{{ a["pan"].prixU }}"/>
  55.                                 </td>
  56.                                 <td class="cart_quantity">
  57.                                     <div class="input-group" style="width: 50%;">
  58.                                         <div class="input-group-btn">
  59.                                             <button type="button" class="btn btn-default btn-number" disabled="disabled" data-type="minus" data-field="quant-{{ a["obj"].id }}">
  60.                                                 <i class="fa fa-minus"></i>
  61.                                             </button>
  62.                                         </div>
  63.                                         <input type="text" name="quant-{{ a["obj"].id }}" class="form-control input-number"  onchange="calculTotal(this)" id="qte" value="{{ a["pan"].qte }}" min="{{ a["obj"].minQte }}" max="150" unite="{{ a["obj"].unite }}">
  64.                                         <div class="input-group-btn">
  65.                                             <button type="button" class="btn btn-default btn-number" data-type="plus" data-field="quant-{{ a["obj"].id }}">
  66.                                                 <i class="fa fa-plus"></i>
  67.                                             </button>
  68.                                         </div>
  69.                                     </div>
  70.                                 </td>
  71.                                 <td class="cart_total">
  72.                                     <input class="cart_total_price" disabled type="text" name="total_price" id="total_price" value="{{ a["pan"].prixTotal }}"/>
  73.                                     {# <p class="cart_total_price">{{ a["pan"].prixTotal }} DH</p> #}
  74.                                 </td>
  75.                                 <td class="cart_delete">
  76.                                     <a class="cart_quantity_delete text-danger"  onclick="deleteFromPanier({{ a["obj"].id }})"><i class="fa fa-times"></i></a>
  77.                                 </td>
  78.                             </tr>
  79.                         {% endfor %}
  80.                         </tbody>
  81.                     </table>
  82.                 </form>
  83.             </div>
  84.             {% else %}
  85.                 <div class="text-center">
  86.                     <img src="{{ asset("bundles/Frontoffice/img/emptyCart.webp") }}" /><br/>
  87.                     <a href="/" class="btn btn-primary text-white">Votre panier est vide Veuillez cliquer ici pour faire vos achats</a><br/><br/>
  88.                 </div>
  89.             {% endif %}
  90.         </div>
  91.     </section> <!--/#cart_items-->
  92.     {% if articles|length > 0 %}
  93.         <section id="do_action">
  94.             <div class="container">
  95.                 <div class="heading">
  96.                     <h3></h3>
  97.                     <p></p>
  98.                 </div>
  99.                 <div class="row">
  100.                     <div class="col-sm-6">
  101.                         <div class="chose_area signup-form" style="padding-left: 15px;">
  102.                             <form method="POST">
  103.                                 <input type="hidden" name="formName" value="codePromo">
  104.                                 <span class="total ">Code promo : </span>
  105.                                 <input type="text"  class="form-control"  name="codePromo" style="width: 100%;margin-bottom: 5px;margin-top: 8px;" value="{{ codePromo }}">
  106.                                 <button type="submit" class="validateAchat text-white btn btn-primary">Valider</button>
  107.                                 {% if response != "OK" and response != "" %}
  108.                                     <div class="error">
  109.                                         {{ response }}
  110.                                     </div>
  111.                                 {% endif %}
  112.                             </form>
  113.                         </div>
  114.                     </div>
  115.                     <div class="col-lg-6" align="right ">
  116.                         <b>Total : </b> {{ total|number_format(2, '.', '') }} DH<br/><br/>
  117.                         <b>Livraison : </b> {{ livraison }} DH<br/><br/>
  118.                         {% if totalPromo != 0 %}
  119.                             <b>Promotion : </b> {{ totalPromo|number_format(2, '.', '') }} DH<br/><br/>
  120.                         {% endif %}
  121.                         <span style="font-weight: bold;" class="text-secondary">
  122.                             <b>Total à payer : </b> {{ total + livraison + totalPromo }} DH<br/><br/>
  123.                         </span>
  124.                     </div>
  125.                     <div class="row">
  126.                         <div class="total_area text-center">
  127.                             <a class="btn btn-info update text-white" onclick="document.getElementById('updateForm').submit();">Mettre à jour</a>
  128.                             <a class="btn btn-primary check_out text-white" onclick="commander()">Commander</a>
  129.                         </div>
  130.                      </div>
  131.                 </div>
  132.             </div>
  133.         </section>
  134.     {% endif %}
  135. {% endblock %}
  136. {% block js %}
  137.     <script type="text/javascript">
  138.         {% if articles|length > 0 %}
  139.         var codePromo = "{{ codePromo }}";
  140.         /*----------*/
  141.         $('.btn-number').click(function(e){
  142.             e.preventDefault();
  143.             fieldName = $(this).attr('data-field');
  144.             type      = $(this).attr('data-type');
  145.             var input = $("input[name='"+fieldName+"']");
  146.             var currentVal = parseFloat(input.val());
  147.             if (!isNaN(currentVal)) {
  148.                 var toAddOrDel = 0.5;
  149.                 if(input.attr('unite').toLowerCase().replace(/\s/g, '') == "u" || input.attr('unite').toLowerCase().replace(/\s/g, '') == "unité" || input.attr('unite').toLowerCase().replace(/\s/g, '') == "unite"){
  150.                     toAddOrDel = 1;
  151.                 }
  152.                 if(type == 'minus') {
  153.                     if(currentVal > input.attr('min')) {
  154.                         input.val(currentVal - toAddOrDel).change();
  155.                     }
  156.                     if(parseFloat(input.val()) == input.attr('min')) {
  157.                         $(this).attr('disabled', true);
  158.                     }
  159.                 } else if(type == 'plus') {
  160.                     if(currentVal < input.attr('max')) {
  161.                         input.val(currentVal + toAddOrDel).change();
  162.                     }
  163.                     if(parseFloat(input.val()) == input.attr('max')) {
  164.                         $(this).attr('disabled', true);
  165.                     }
  166.                 }
  167.             } else {
  168.                 input.val(0);
  169.             }
  170.         });
  171.         $('.input-number').focusin(function(){
  172.             $(this).data('oldValue', $(this).val());
  173.         });
  174.         {# $('.input-number').change(function() {
  175.             minValue =  parseFloat($(this).attr('min'));
  176.             maxValue =  parseFloat($(this).attr('max'));
  177.             valueCurrent = parseFloat($(this).val());
  178.             console.log(minValue);
  179.             name = $(this).attr('name');
  180.             if(valueCurrent >= minValue) {
  181.                 $(".btn-number[data-type='minus'][data-field='"+name+"']").removeAttr('disabled')
  182.             } else {
  183.                 console.log('error');
  184.                 Swal.fire({
  185.                     icon: 'error',
  186.                     title: 'Oops...',
  187.                     text: "Désolé, la valeur minimale a été atteinte",
  188.                 });
  189.                 $(this).val($(this).data('oldValue'));
  190.             }
  191.             if(valueCurrent <= maxValue) {
  192.                 $(".btn-number[data-type='plus'][data-field='"+name+"']").removeAttr('disabled')
  193.             } else {
  194.                 console.log('error');
  195.                 Swal.fire({
  196.                     icon: 'error',
  197.                     title: 'Oops...',
  198.                     text: "Désolé, la valeur maximale a été atteinte",
  199.                 });
  200.                 $(this).val($(this).data('oldValue'));
  201.             }
  202.         }); #}
  203.         $(".input-number").keydown(function (e) {
  204.             if ($.inArray(e.keyCode, [46, 8, 9, 27, 13, 190]) !== -1 ||
  205.                     (e.keyCode == 65 && e.ctrlKey === true) ||
  206.                     (e.keyCode >= 35 && e.keyCode <= 39)) {
  207.                 return;
  208.             }
  209.             // Ensure that it is a number and stop the keypress
  210.             if ((e.shiftKey || (e.keyCode < 48 || e.keyCode > 57)) && (e.keyCode < 96 || e.keyCode > 105)) {
  211.                 e.preventDefault();
  212.             }
  213.         });
  214.         function calculTotal(input)
  215.         {
  216.             var row = input.closest("tr");
  217.             var cart_price = row.querySelector(".cart_price");
  218.             var prix_u = parseFloat(cart_price.querySelector("input[name='prix_u']").value.replace(",", "."));
  219.             var cart_quantity = row.querySelector(".cart_quantity");
  220.             var qte = parseFloat(cart_quantity.querySelector("input[id='qte']").value.replace(",", "."));
  221.             var cart_quantity = row.querySelector(".cart_total");
  222.             var total_price_input = cart_quantity.querySelector("input[name='total_price']") ;
  223.             
  224.             var minQte = parseInt(input.getAttribute('min'));
  225.             var maxQte = parseInt(input.getAttribute('max'));
  226.             if (!isNaN(prix_u) && !isNaN(qte) && qte >= minQte && qte <= maxQte) {  
  227.                     var total_price = (prix_u * qte).toFixed(2);
  228.                     total_price_input.value = total_price;
  229.                     document.getElementById('updateForm').submit();                
  230.             }
  231.         }
  232.         //------------
  233.         function deleteFromPanier(id){
  234.             Swal.fire({
  235.                 title: "Êtes-vous sûr ?",
  236.                 text: "La suppression du produit.",
  237.                 icon: "warning",
  238.                 showCancelButton: true,
  239.                 confirmButtonColor: "#d33",
  240.                 cancelButtonColor: "#3085d6",
  241.                 confirmButtonText: "Supprimer",
  242.                 cancelButtonText: "Annuler",
  243.             }).then((result) => {
  244.                 if (result.isConfirmed) {
  245.                     $.ajax({
  246.                     type: 'get',
  247.                     url: '/deleteFromPanier/?id='+id,
  248.                         success: function (data) {
  249.                             if(data == 'OK')
  250.                             {
  251.                                 window.location.reload();
  252.                             }
  253.                             else
  254.                             {
  255.                                 Swal.fire({
  256.                                 icon: 'error',
  257.                                 title: 'Oops...',
  258.                                 text: data,
  259.                                 })
  260.                             }
  261.                         },
  262.                         error: function (xhr, ajaxOptions, thrownError) {
  263.                             Swal.fire({
  264.                                 icon: 'error',
  265.                                 title: 'Oops...',
  266.                                 text: "une erreur s'est produite",
  267.                                 })
  268.                         }
  269.                     });
  270.                 }
  271.             });
  272.         }
  273.         function commander(){
  274.             window.location= "/validerCommande/?p={{ codePromo }}";
  275.             /*noty({
  276.                 text: 'Etes vous sûr de vouloir valider votre commande ?',
  277.                 type: 'confirm',
  278.                 theme: 'relax',
  279.                 layout: 'center',
  280.                 animation: {
  281.                     open: 'animated bounceInDown',
  282.                     close: 'animated bounceOutUp', // jQuery animate function property object
  283.                     easing: 'swing', // easing
  284.                     speed: 200 // opening & closing animation speed
  285.                 },
  286.                 buttons     : [
  287.                     {addClass: 'btn btn-success', text: 'Oui', onClick: function ($noty) {
  288.                         $.ajax({
  289.                             type: 'get',
  290.                             url: '/commander/?codePromo='+codePromo,
  291.                             success: function(data){
  292.                                 if(data == "OK"){
  293.                                     var msg = "Votre commande est enregistrée avec succès";
  294.                                     document.getElementById("successMsg").innerHTML = msg;
  295.                                     $("#successMsg").css("display","block");
  296.                                     $("#errorMsg").css("display","none");
  297.                                     setTimeout(function(){ window.location.href="/mesCommandes/" ;} , 1000);
  298.                                 }
  299.                                 else if(data == "NO1"){
  300.                                     var msg = "Veillez vous connecter avant de valider votre commande <br><a href='/account/'>Cliquez ici</a>";
  301.                                     document.getElementById("errorMsg").innerHTML = msg;
  302.                                     $("#successMsg").css("display","none");
  303.                                     $("#errorMsg").css("display","block");
  304.                                 }
  305.                                 else{
  306.                                     var msg = data;
  307.                                     document.getElementById("errorMsg").innerHTML = msg;
  308.                                     $("#successMsg").css("display","none");
  309.                                     $("#errorMsg").css("display","block");
  310.                                 }
  311.                             }
  312.                         });
  313.                         $noty.close();
  314.                     }
  315.                     },
  316.                     {
  317.                         addClass: 'btn btn-danger', text: 'Non', onClick: function ($noty) {
  318.                             $noty.close();
  319.                         }
  320.                     }
  321.                 ]
  322.             });*/
  323.         }
  324.         {% endif %}
  325.     </script>
  326. {% endblock %}