templates/front/dec/listProductDec.html.twig line 116

Open in your IDE?
  1. {% extends 'front/base.html.twig' %}
  2. {% block title %}Sunshine Elegance | {{ categorie.getName() }} {% endblock %}
  3. {% block meta %}
  4.     <meta name="keywords" content="Chaussures,Chaussures Femme,Jebba,Robe,Bottine">
  5.     <meta name="description" content="Marque tunisienne spécialisée dans la vente de vêtements et chaussures en ligne">
  6.     <meta name="author" content="Sunshine-Elegance">
  7.     <!-- Facebook OG -->
  8.     <meta property="og:image" content="{{ asset('front/assets/imgs/theme/logo3.png') }}">
  9.     <meta property="og:url" content="https://www.sunshineelegance.tn/">
  10.     <meta property="og:type" content="article">
  11.     <meta property="og:title" content="Sunshine Elegance | Marque tunisienne spécialisée dans la vente de vêtements et chaussures en ligne">
  12.     <meta property="og:description" content="Marque tunisienne spécialisée dans la vente de vêtements et chaussures en ligne">
  13.     <!-- Twitter OG -->
  14.     <meta name="twitter:title" content="Sunshine Elegance | Marque tunisienne spécialisée dans la vente de vêtements et chaussures en ligne">
  15.     <meta name="twitter:description" content="Marque tunisienne spécialisée dans la vente de vêtements et chaussures en ligne">
  16.     <meta name="twitter:image" content="{{ asset('front/assets/imgs/theme/logo3.png') }}">
  17.     <meta name="twitter:card" content="summary_large_image">
  18. {% endblock %}
  19. {% block stylesheets %}
  20.     {{ parent() }}
  21.     <style>
  22.         
  23.         .product-cart-wrap .product-img-action-wrap {
  24.             max-height: none;
  25.             width: 100%;
  26.             position: relative;
  27.             overflow: hidden;
  28.             
  29.         }
  30.         .product-img-action-wrap .product-img {
  31.             width: 100%;
  32.             height: auto;
  33.             object-fit: cover;
  34.             display: block;
  35.             
  36.         }
  37.         
  38.         
  39.         .product-badges span {
  40.             font-size: 0.75rem;
  41.             padding: 4px 8px;
  42.             border-radius: 4px;
  43.             font-weight: 500;
  44.         }
  45.         
  46.         
  47.         
  48.         @media (max-width: 768px) {
  49.             .order-mobile-first {
  50.               order: -1 !important;
  51.             }
  52.           }
  53.           /*rendre la barre de filtres plus compacte sur mobile*/
  54.           @media (max-width: 768px) {
  55.             .shop-product-fillter {
  56.               flex-direction: column;
  57.               align-items: flex-start;
  58.               gap: 12px;
  59.             }
  60.           
  61.             .sort-by-product-area {
  62.               flex-direction: column;
  63.               width: 100%;
  64.               gap: 10px;
  65.             }
  66.           
  67.             .sort-by-cover {
  68.               width: 100%;
  69.             }
  70.           
  71.             .sort-by-product-wrap {
  72.               display: flex;
  73.               justify-content: space-between;
  74.               align-items: center;
  75.               padding: 6px 12px;
  76.               background-color: #f7f8f9;
  77.               border: 1px solid #cce7d0;
  78.               border-radius: 20px;
  79.             }
  80.           
  81.             .sort-by-dropdown-wrap {
  82.               flex-grow: 1;
  83.               text-align: right;
  84.             }
  85.           
  86.             .sort-by-dropdown {
  87.               position: absolute;
  88.               left: 0;
  89.               top: 100%;
  90.               z-index: 10;
  91.             }
  92.           }
  93.           
  94.           
  95.           
  96.           /*amélioration affichage des cartes produit*/
  97.           @media (max-width: 768px) {
  98.             .row-product {
  99.               width: 50% !important;
  100.             }
  101.           }
  102.           
  103.           @media (max-width: 480px) {
  104.             .row-product {
  105.               width: 100% !important;
  106.             }
  107.           }
  108.           
  109.     </style>
  110.     <script>
  111.         var category_id = JSON.parse("{{ category_id|e('js') }}")
  112.         // Filtres des tailles et couleurs
  113.         var taillesFilter = {{ Globals.getTailles(categories)|json_encode|raw }};
  114.         var couleursFilter = {{ Globals.getCouleurs(categories)|json_encode|raw }};
  115.         
  116.         
  117.     </script>
  118. {% endblock %}
  119. {% block body %}
  120.     {# {% verbatim %} #}
  121.     <main class="main" id="app" v-cloak>
  122.         <div class="page-header breadcrumb-wrap">
  123.             <div class="container">
  124.                 <div class="breadcrumb">
  125.                     <a href="{{ path('home') }}" rel="nofollow">Acceuil</a>
  126.                     {% if categorie.parent.parent is defined and  categorie.parent.parent is not null %}
  127.                     <span></span>
  128.                         <a href="{{ CATEGORY_URL_TYPE == 1 ? path('category_dec', {id: categorie.parent.parent.id , name :categorie.parent.parent.name|slug }) : path('category_new', {id: categorie.parent.parent.id , name :categorie.parent.parent.name|slug }) }}"rel="nofollow">
  129.                             {{ categorie.parent.parent.name }}</a>
  130.                     {% endif %}
  131.                     {% if categorie.parent is not empty and  categorie.parent is not null  %}
  132.                     <span></span>
  133.                         <a href="{{ CATEGORY_URL_TYPE == 1 ? path('category_dec', {id: categorie.parent.id , name :categorie.parent.name|slug }) : path('category_new', {id: categorie.parent.id , name :categorie.parent.name|slug }) }}"rel="nofollow">
  134.                             {{ categorie.parent.name }}</a>
  135.                     {% endif %}
  136.                     <span></span> {{ categorie.getName() }}
  137.                 </div>
  138.             </div>
  139.         </div>
  140.        {# ===== SECTION PRINCIPALE DE LISTE DE PRODUITS ===== #}
  141. <section class="mt-50 mb-50">
  142.     <div class="container">
  143.         <div class="row flex-row-reverse">
  144.             {# ===== COLONNE PRINCIPALE (LISTE DES PRODUITS) ===== #}
  145.             <div class="col-lg-9">
  146.                 {# ===== BARRE DE FILTRAGE (nombre de produits, affichage et tri) ===== #}
  147.                 <div class="shop-product-fillter">
  148.                     {# Affichage du nombre total d'articles trouvés #}
  149.                     <div class="totall-product">
  150.                         <p>Nous avons trouvé <strong class="text-brand">${ totalItems }</strong> article<span v-if="totalItems>1">s</span> !</p>
  151.                     </div>
  152.                     {# Zone de tri et d'affichage par nombre #}
  153.                     <div class="sort-by-product-area">
  154.                         {# Choix du nombre de produits à afficher par page #}
  155.                         <div class="sort-by-cover mr-10">
  156.                             <div class="sort-by-product-wrap">
  157.                                 <div class="sort-by">
  158.                                     <span><i class="fi-rs-apps"></i>Montrer:</span>
  159.                                 </div>
  160.                                 <div class="sort-by-dropdown-wrap">
  161.                                     <span v-show="pageSize!=9999"> ${ pageSize } <i class="fi-rs-angle-small-down"></i></span>
  162.                                     <span v-show="pageSize==9999"> Tous <i class="fi-rs-angle-small-down"></i></span>
  163.                                 </div>
  164.                             </div>
  165.                             {# Dropdown pour choisir pageSize #}
  166.                             <div class="sort-by-dropdown">
  167.                                 <ul>
  168.                                     <li class="activeFilter"><a :class="{ active: pageSize==10 }" href="#&" @click="pageSize=10;getData(page,true)">10</a></li>
  169.                                     <li class="activeFilter"><a :class="{ active: pageSize==20 }" href="#&" @click="pageSize=20;getData(page,true)">20</a></li>
  170.                                     <li class="activeFilter"><a :class="{ active: pageSize==40 }" href="#&" @click="pageSize=40;getData(page,true)">40</a></li>
  171.                                     <li class="activeFilter"><a :class="{ active: pageSize==9999 }" href="#&" @click="pageSize=9999;getData(page,true)">Tous</a></li>
  172.                                 </ul>
  173.                             </div>
  174.                         </div>
  175.                         {# Choix du tri (ordre alphabétique, prix, date) #}
  176.                         <div class="sort-by-cover">
  177.                             <div class="sort-by-product-wrap">
  178.                                 <div class="sort-by">
  179.                                     <span><i class="fi-rs-apps-sort"></i>Trier par:</span>
  180.                                 </div>
  181.                                 <div class="sort-by-dropdown-wrap">
  182.                                     <span v-show="orderBy==1"> Nom: A à Z <i class="fi-rs-angle-small-down"></i></span>
  183.                                     <span v-show="orderBy==2"> Nom: Z à A <i class="fi-rs-angle-small-down"></i></span>
  184.                                     <span v-show="orderBy==3"> Prix: croissant <i class="fi-rs-angle-small-down"></i></span>
  185.                                     <span v-show="orderBy==4"> Prix: décroissant <i class="fi-rs-angle-small-down"></i></span>
  186.                                     <span v-show="orderBy==5"> Date ajout: croissant<i class="fi-rs-angle-small-down"></i></span>
  187.                                     <span v-show="orderBy==6"> Date ajout: décroissant<i class="fi-rs-angle-small-down"></i></span>
  188.                                 </div>
  189.                             </div>
  190.                             {# Dropdown pour le tri #}
  191.                             <div class="sort-by-dropdown">
  192.                                 <ul>
  193.                                     <li class="activeFilter"><a :class="{ active: orderBy==1 }" href="#&" @click="orderBy=1;getData(page,true)">Nom: A à Z</a></li>
  194.                                     <li class="activeFilter"><a :class="{ active: orderBy==2 }" href="#&" @click="orderBy=2;getData(page,true)">Nom: Z à A</a></li>
  195.                                     <li class="activeFilter"><a :class="{ active: orderBy==3 }" href="#&" @click="orderBy=3;getData(page,true)">Prix: croissant</a></li>
  196.                                     <li class="activeFilter"><a :class="{ active: orderBy==4 }" href="#&" @click="orderBy=4;getData(page,true)">Prix: décroissant</a></li>
  197.                                     <li class="activeFilter"><a :class="{ active: orderBy==5 }" href="#&" @click="orderBy=5;getData(page,true)">Date ajout: croissant</a></li>
  198.                                     <li class="activeFilter"><a :class="{ active: orderBy==6 }" href="#&" @click="orderBy=6;getData(page,true)">Date ajout: décroissant</a></li>
  199.                                 </ul>
  200.                             </div>
  201.                         </div>
  202.                     </div>
  203.                 </div>
  204.                 {# ===== GRILLE DE PRODUITS ===== #}
  205.                 <div class="row product-grid-3">
  206.                     {# Boucle sur chaque produit #}
  207.                     <div class="col-lg-6 col-md-6 col-12 col-sm-6 row-product" v-for="entry in products">
  208.                         <div class="product-cart-wrap mb-30 col-product">
  209.                             {# Image + Badges #}
  210.                             <div class="product-img-action-wrap" @click="openProduct(entry.idProduit,entry.name,entry.id)">
  211.                                 <div class="product-img product-img-zoom">
  212.                                     <a href="#&">
  213.                                         <img class="default-img product-img" :src="'{{ APP_URL }}/images/300-400/'+entry.image" :alt="entry.name">
  214.                                     </a>
  215.                                 </div>
  216.                                 
  217.                                 {# Affichage des badges: Rupture, Nouveau, Promo #}
  218.                                 <div class="product-badges product-badges-position product-badges-mrg" v-if="(entry.promo && entry.promo.isValid) || !entry.stock || entry.isNew">
  219.                                     <span v-if="!entry.stock" class="hot mr-1">Rupture de stock</span>
  220.                                     <span v-if="entry.isNew" class="new mr-1">Nouveau</span>
  221.                                     <span class="best" v-if="entry.promo && entry.promo.isValid && entry.promo.discountType=='amount'">-${ entry.promo.discountValue.toFixed(3) } <sup class="currency-style">TND</sup></span>
  222.                                     <span class="best" v-if="entry.promo && entry.promo.isValid && entry.promo.discountType=='percent'">-${ entry.promo.discountValue } %</span>
  223.                                 </div>
  224.                             </div>
  225.                             {# Titre + prix + bouton panier #}
  226.                             <div class="product-content-wrap">
  227.                                 <h2 @click="openProduct(entry.idProduit,entry.name,entry.id)">
  228.                                     <div class="menu-item card-title">${ entry.name }</div>
  229.                                 </h2>
  230.                                 <div class="product-price">
  231.                                   <span v-if="entry.promo && entry.promo.isValid && entry.promo.discountType=='percent'">${ (entry.priceTTC-(entry.priceTTC*entry.promo.discountValue/100)).toFixed(3) } <sup class="currency-style">TND</sup></span>
  232.                                     <span class="old-price" v-if="entry.promo && entry.promo.isValid">${ entry.priceTTC.toFixed(3) } <sup class="currency-style">TND</sup></span>
  233.                                 </div>
  234.                                 <div class="product-action-1 show" @click="getProduit(entry.idProduit,entry.id)">
  235.                                     <button aria-label="Acheter maintenant" class="action-btn hover-up"><i class="fi-rs-shopping-bag-add"></i></button>
  236.                                 </div>
  237.                             </div>
  238.                         </div>
  239.                     </div>
  240.                 </div>
  241.                 {# ===== PAGINATION ===== #}
  242.                 <div class="pagination-area mt-15 mb-sm-5 mb-lg-0" v-show="pages.length>1">
  243.                     <nav aria-label="Page navigation example">
  244.                         <ul class="pagination justify-content-start">
  245.                             <li class="page-item" v-show="page>1" @click="getData(page-1)"><a class="page-link" href="#&"><i class="fi-rs-angle-double-small-left"></i></a></li>
  246.                             <li v-for="entry in pages" class="page-item" @click="getData(entry)" :class="{ active: entry==page }"><a class="page-link" href="#&">${ entry }</a></li>
  247.                             <li class="page-item" v-show="page<pages[pages.length-1]" @click="getData(page+1)"><a class="page-link" href="#&"><i class="fi-rs-angle-double-small-right"></i></a></li>
  248.                         </ul>
  249.                     </nav>
  250.                 </div>
  251.             </div>
  252.             {# ===== BARRE LATÉRALE (FILTRES) ===== #}
  253.             <div class="col-lg-3 order-mobile-first primary-sidebar sticky-sidebar">
  254.                 {# Bouton Filtrer affiché uniquement en mobile #}
  255.                 <button class="btn btn-outline-primary w-100 d-md-none mb-3" type="button" data-bs-toggle="collapse" data-bs-target="#mobileFilters" aria-expanded="false" aria-controls="mobileFilters">
  256.                     <i class="fi-rs-filter me-2"></i> Affiner la recherche
  257.                 </button>
  258.                 <div class="collapse d-md-block" id="mobileFilters">
  259.                     <div class="sidebar-widget price_range range mb-30">
  260.                 
  261.                         
  262.                         <div class="widget-header position-relative mb-20 pb-10">
  263.                             <h5 class="widget-title mb-10">Filter par prix</h5>
  264.                             <div class="bt-1 border-color-1"></div>
  265.                         </div>
  266.                         {# Range de prix (jQuery UI slider) #}
  267.                         <div class="price-filter">
  268.                             <div class="price-filter-inner">
  269.                                 <div id="slider-range"></div>
  270.                                 <div class="price_slider_amount">
  271.                                     <div class="label-input">
  272.                                         <span>Intervalle:</span><input type="text" id="amount" name="price" placeholder="Ajouter le prix"/>
  273.                                     </div>
  274.                                 </div>
  275.                             </div>
  276.                         </div>
  277.                         <button class="btn btn-sm btn-default mt-10" :disabled="disabled" @click="getData(page,true)">
  278.                             <i class="fi-rs-filter mr-5"></i> Filtrer
  279.                         </button>
  280.                         {# Filtres par taille et couleur #}
  281.                         <div class="list-group" v-if="totalItems">
  282.                             <div class="list-group-item mb-10 mt-10">
  283.                                 <label class="fw-900">Tailles</label>
  284.                                 <div class="custome-checkbox">
  285.                                     <div class="row">
  286.                                         <div v-for="entry in taillesFilter" class="col-4" style="white-space: nowrap">
  287.                                             <input class="form-check-input" type="checkbox" name="checkbox" :id="'exampleCheckbox'+entry.name" v-model="entry.selected" @change="getData(page,true)">
  288.                                             <label class="form-check-label" :for="'exampleCheckbox'+entry.name"><span>${ entry.name }</span></label>
  289.                                         </div>
  290.                                     </div>
  291.                                 </div>
  292.                                 <label class="fw-900 mt-15">Couleurs</label>
  293.                                 <div class="attr-detail attr-color mb-15">
  294.                                     <ul class="list-filter color-filter multi">
  295.                                         <li :class="entry.selected ? 'active' : ''" v-for="entry in couleursFilter" @click="entry.selected = !entry.selected; getData(page,true)">
  296.                                             <a href="#" :title="entry.name">
  297.                                                 <span :style="{ 'background-color': entry.code ? entry.code :'#fff','border': '1px solid #ddd' }"></span>
  298.                                             </a>
  299.                                         </li>
  300.                                     </ul>
  301.                                 </div>
  302.                             </div>
  303.                         </div>
  304.                     </div>
  305.                 </div>
  306.             </div>
  307.             {# FIN BARRE LATÉRALE #}
  308.         </div>
  309.     </div>
  310. </section>
  311.     </main>
  312.     {# {% endverbatim %} #}
  313. {% endblock %}
  314. {% block javascripts %}
  315.     {{ parent() }}
  316.     <script>
  317.         // Reinialiser les filtres de recherche
  318.         window.onbeforeunload = function () {
  319.             //unchecked your check box here.
  320.             $("input[type='checkbox']").prop('checked', false);
  321.             //app.getData(app.page);
  322.         };
  323.     </script>
  324.     <script src="{{ asset('front/assets/scripts/dec/index.js') }}"></script>
  325. {% endblock %}