templates/formation/formations.html.twig line 1

Open in your IDE?
  1. {% extends 'backfront.html.twig' %}
  2. {% block title %}Formations SIP Academy - Java, Python, DevOps, Agile et Plus{% endblock %}
  3. {% block meta_description %}
  4.     Explorez les formations proposées par SIP Academy : Java, Python, DevOps, Agile, et bien plus. Des cours certifiants adaptés à vos besoins et à votre rythme.
  5. {% endblock %}
  6. {% block body %}
  7.     <style>
  8.         /* ===== COULEURS MODERNES ===== */
  9.         :root {
  10.             --gold: #FFAE27;
  11.             --gold-dark: #e09500;
  12.             --gold-light: #fff8e6;
  13.             --navy: #1F3971;
  14.             --navy-dark: #162d5a;
  15.             --navy-light: #e8edf8;
  16.             --text-dark: #1a2a3a;
  17.             --text-muted: #6c757d;
  18.             --border-light: #eef2f6;
  19.         }
  20.         /* ===== BREADCRUMB ===== */
  21.         .breadcrumb-area {
  22.             background: linear-gradient(135deg, var(--navy) 0%, var(--navy-dark) 100%);
  23.             padding: 100px 0 120px;
  24.             position: relative;
  25.             text-align: center;
  26.         }
  27.         .breadcrumb-title h1 {
  28.             color: #fff;
  29.             font-size: 48px;
  30.             font-weight: 800;
  31.             margin-bottom: 10px;
  32.             letter-spacing: -1px;
  33.         }
  34.         .breadcrumb-list {
  35.             list-style: none;
  36.             padding: 0;
  37.             display: flex;
  38.             justify-content: center;
  39.             gap: 15px;
  40.         }
  41.         .breadcrumb-list li, .breadcrumb-list li a {
  42.             color: rgba(255,255,255,0.7);
  43.             font-size: 15px;
  44.             text-decoration: none;
  45.             transition: color 0.3s;
  46.         }
  47.         .breadcrumb-list li.active {
  48.             color: var(--gold);
  49.         }
  50.         /* ===== SEARCH BAR "FLOATING" ===== */
  51.         .search-category {
  52.             margin-top: -60px;
  53.             position: relative;
  54.             z-index: 10;
  55.             padding-bottom: 20px;
  56.         }
  57.         .search-wrapper-glass {
  58.             background: #ffffff;
  59.             padding: 30px;
  60.             border-radius: 24px;
  61.             box-shadow: 0 15px 35px rgba(0,0,0,0.1);
  62.             border: 1px solid rgba(255,255,255,0.8);
  63.         }
  64.         .form-container-modern {
  65.             display: grid;
  66.             grid-template-columns: 2fr 1fr 1fr auto;
  67.             gap: 15px;
  68.             align-items: center;
  69.         }
  70.         .input-group-custom {
  71.             position: relative;
  72.             display: flex;
  73.             align-items: center;
  74.         }
  75.         .input-group-custom i {
  76.             position: absolute;
  77.             left: 15px;
  78.             color: var(--navy);
  79.             opacity: 0.5;
  80.             z-index: 5;
  81.         }
  82.         .input-group-custom input,
  83.         .input-group-custom select {
  84.             width: 100%;
  85.             padding: 15px 15px 15px 45px !important;
  86.             border: 1px solid #e2e8f0;
  87.             border-radius: 12px;
  88.             font-size: 14px;
  89.             background-color: #f8fafc;
  90.             transition: all 0.3s ease;
  91.             cursor: pointer;
  92.             appearance: none;
  93.         }
  94.         .input-group-custom input:focus,
  95.         .input-group-custom select:focus {
  96.             background: #fff;
  97.             border-color: var(--gold);
  98.             box-shadow: 0 0 0 4px rgba(255, 174, 39, 0.1);
  99.             outline: none;
  100.         }
  101.         .btn-search-modern {
  102.             background: var(--gold);
  103.             color: var(--navy);
  104.             border: none;
  105.             padding: 15px 35px;
  106.             border-radius: 12px;
  107.             font-weight: 700;
  108.             text-transform: uppercase;
  109.             letter-spacing: 0.5px;
  110.             cursor: pointer;
  111.             transition: all 0.3s ease;
  112.             display: flex;
  113.             align-items: center;
  114.             gap: 10px;
  115.         }
  116.         .btn-search-modern:hover {
  117.             background: var(--navy);
  118.             color: #fff;
  119.             transform: translateY(-2px);
  120.         }
  121.         @media (max-width: 991px) {
  122.             .form-container-modern {
  123.                 grid-template-columns: 1fr;
  124.             }
  125.             .breadcrumb-area {
  126.                 padding: 60px 0 100px;
  127.             }
  128.             .breadcrumb-title h1 {
  129.                 font-size: 32px;
  130.             }
  131.         }
  132.         /* ===== SECTION TITRES ===== */
  133.         .section-title-wrapper {
  134.             text-align: center;
  135.             margin-bottom: 50px;
  136.         }
  137.         .section-title h3 {
  138.             font-size: 36px;
  139.             font-weight: 800;
  140.             color: var(--text-dark);
  141.             margin-bottom: 12px;
  142.             position: relative;
  143.             display: inline-block;
  144.         }
  145.         .section-title h3::after {
  146.             content: '';
  147.             position: absolute;
  148.             bottom: -12px;
  149.             left: 50%;
  150.             transform: translateX(-50%);
  151.             width: 60px;
  152.             height: 4px;
  153.             background: linear-gradient(90deg, var(--gold), var(--gold-dark));
  154.             border-radius: 2px;
  155.         }
  156.         .section-title p {
  157.             font-size: 16px;
  158.             color: var(--text-muted);
  159.             margin-top: 20px;
  160.         }
  161.         /* ===== COURSE AREA ===== */
  162.         .course-area {
  163.             padding: 80px 0;
  164.             background: #fff;
  165.         }
  166.         /* ===== CARTE FORMATION ===== */
  167.         .single-item {
  168.             background: #fff;
  169.             border-radius: 20px;
  170.             overflow: hidden;
  171.             box-shadow: 0 5px 20px rgba(0,0,0,0.05);
  172.             transition: all 0.3s cubic-bezier(0.4,0,0.2,1);
  173.             height: 100%;
  174.             display: flex;
  175.             flex-direction: column;
  176.             border: 1px solid var(--border-light);
  177.         }
  178.         .single-item:hover {
  179.             transform: translateY(-8px);
  180.             box-shadow: 0 20px 40px rgba(31,57,113,0.15);
  181.             border-color: var(--gold);
  182.         }
  183.         /* ===== IMAGE CONTAINER ===== */
  184.         .single-item-image {
  185.             position: relative;
  186.             overflow: hidden;
  187.             height: 220px;
  188.             background: linear-gradient(135deg, #f8faff 0%, #fff 100%);
  189.             display: flex;
  190.             align-items: center;
  191.             justify-content: center;
  192.         }
  193.         /* Link wrapper pour l'image */
  194.         .single-item-image a {
  195.             position: relative;
  196.             z-index: 1;
  197.             display: flex;
  198.             align-items: center;
  199.             justify-content: center;
  200.             width: 100%;
  201.             height: 100%;
  202.             overflow: hidden;
  203.             border-radius: 20px 20px 0 0;
  204.         }
  205.         /* Image style */
  206.         .single-item-image img {
  207.             width: auto;
  208.             height: auto;
  209.             max-width: 100%;
  210.             max-height: 100%;
  211.             object-fit: contain;
  212.             transition: transform 0.4s ease;
  213.             position: relative;
  214.             z-index: 1;
  215.         }
  216.         .single-item:hover .single-item-image img {
  217.             transform: scale(1.05);
  218.         }
  219.         /* ===== OVERLAY HOVER - INFOS FORMATEUR ===== */
  220.         .overlay-effect {
  221.             position: relative;
  222.         }
  223.         .courses-hover-info {
  224.             position: absolute;
  225.             bottom: -100%;
  226.             left: 0;
  227.             right: 0;
  228.             background: linear-gradient(135deg, rgba(31,57,113,0.95), rgba(22,45,90,0.95));
  229.             padding: 15px;
  230.             transition: bottom 0.3s ease;
  231.             backdrop-filter: blur(5px);
  232.             z-index: 100;
  233.             border-radius: 0 0 20px 20px;
  234.         }
  235.         .single-item:hover .courses-hover-info {
  236.             bottom: 0;
  237.         }
  238.         .courses-hover-action {
  239.             display: flex;
  240.             align-items: center;
  241.             gap: 12px;
  242.             flex-wrap: wrap;
  243.         }
  244.         .courses-hover-thumb img {
  245.             width: 40px;
  246.             height: 40px;
  247.             border-radius: 50%;
  248.             object-fit: cover;
  249.             border: 2px solid var(--gold);
  250.         }
  251.         .courses-hover-action h4 a {
  252.             color: #fff;
  253.             font-size: 14px;
  254.             font-weight: 600;
  255.             text-decoration: none;
  256.         }
  257.         .courses-hover-action h4 a:hover {
  258.             color: var(--gold);
  259.         }
  260.         .crs-separator {
  261.             color: var(--gold);
  262.         }
  263.         .courses-hover-action p {
  264.             color: rgba(255,255,255,0.8);
  265.             font-size: 11px;
  266.             margin: 0;
  267.         }
  268.         /* ===== CORPS DE LA CARTE ===== */
  269.         .single-item-text {
  270.             padding: 20px;
  271.             flex: 1;
  272.             display: flex;
  273.             flex-direction: column;
  274.         }
  275.         .single-item-text h4 {
  276.             font-size: 18px;
  277.             font-weight: 700;
  278.             margin-bottom: 12px;
  279.             line-height: 1.4;
  280.             min-height: 50px;
  281.         }
  282.         .single-item-text h4 a {
  283.             color: var(--text-dark);
  284.             text-decoration: none;
  285.             transition: color 0.2s;
  286.         }
  287.         .single-item-text h4 a:hover {
  288.             color: var(--gold);
  289.         }
  290.         /* Description - Max 100 caractères */
  291.         .single-item-text > p {
  292.             font-size: 13px;
  293.             color: var(--text-muted);
  294.             line-height: 1.6;
  295.             margin-bottom: 16px;
  296.             display: -webkit-box;
  297.             -webkit-line-clamp: 2;
  298.             -webkit-box-orient: vertical;
  299.             overflow: hidden;
  300.         }
  301.         /* ===== INFOS CARTE (INSCRIPTIONS + LIKES + RATING) ===== */
  302.         .single-item-content {
  303.             display: flex;
  304.             justify-content: space-between;
  305.             align-items: center;
  306.             margin-top: auto;
  307.             padding-top: 15px;
  308.             border-top: 1px solid var(--border-light);
  309.         }
  310.         .single-item-comment-view {
  311.             display: flex;
  312.             gap: 15px;
  313.         }
  314.         .single-item-comment-view span {
  315.             font-size: 12px;
  316.             color: var(--text-muted);
  317.             display: flex;
  318.             align-items: center;
  319.             gap: 5px;
  320.         }
  321.         .single-item-comment-view span i {
  322.             color: var(--gold);
  323.             font-size: 14px;
  324.         }
  325.         .single-item-rating i {
  326.             color: var(--gold);
  327.             font-size: 12px;
  328.             margin: 0 1px;
  329.         }
  330.         /* ===== PAGINATION MODERNISÉE ===== */
  331.         .pagination {
  332.             display: flex;
  333.             justify-content: center;
  334.             gap: 8px;
  335.             margin-top: 40px;
  336.             list-style: none;
  337.             padding: 0;
  338.         }
  339.         .pagination .page-item {
  340.             list-style: none;
  341.         }
  342.         .pagination .page-link {
  343.             display: flex;
  344.             align-items: center;
  345.             justify-content: center;
  346.             width: 40px;
  347.             height: 40px;
  348.             border-radius: 12px;
  349.             background: #fff;
  350.             border: 1px solid var(--border-light);
  351.             color: var(--navy);
  352.             font-weight: 500;
  353.             text-decoration: none;
  354.             transition: all 0.3s ease;
  355.         }
  356.         .pagination .page-link:hover {
  357.             background: var(--gold);
  358.             border-color: var(--gold);
  359.             color: var(--navy);
  360.         }
  361.         .pagination .active .page-link {
  362.             background: linear-gradient(135deg, var(--navy), var(--navy-dark));
  363.             border-color: var(--navy);
  364.             color: #fff;
  365.         }
  366.         .pagination .disabled .page-link {
  367.             opacity: 0.5;
  368.             cursor: not-allowed;
  369.         }
  370.         /* ===== RESPONSIVE ===== */
  371.         @media (max-width: 768px) {
  372.             .form-container {
  373.                 flex-direction: column;
  374.                 align-items: stretch;
  375.             }
  376.             .box-select {
  377.                 flex-direction: column;
  378.             }
  379.             .select.small select,
  380.             .select.small input,
  381.             .form-container button {
  382.                 width: 100%;
  383.             }
  384.             .section-title h3 {
  385.                 font-size: 28px;
  386.             }
  387.             .single-item-image {
  388.                 height: 180px;
  389.             }
  390.             .single-item-text h4 {
  391.                 font-size: 16px;
  392.                 min-height: auto;
  393.             }
  394.             .pagination .page-link {
  395.                 width: 36px;
  396.                 height: 36px;
  397.                 font-size: 13px;
  398.             }
  399.             .breadcrumb-title h1 {
  400.                 font-size: 32px;
  401.             }
  402.         }
  403.     </style>
  404.     <!-- BREADCRUMB AREA -->
  405.     <div class="breadcrumb-area">
  406.         <div class="container">
  407.             <div class="row">
  408.                 <div class="col-md-12">
  409.                     <div class="breadcrumb-title">
  410.                         <h1>Explorez nos programmes</h1>
  411.                         <ul class="breadcrumb-list">
  412.                             <li><a href="{{ path('app_home') }}">Accueil</a></li>
  413.                             <li><i class="zmdi zmdi-chevron-right"></i></li>
  414.                             <li class="active">Catalogue de formations</li>
  415.                         </ul>
  416.                     </div>
  417.                 </div>
  418.             </div>
  419.         </div>
  420.     </div>
  421.     <!-- SEARCH CATEGORY FLOATING -->
  422.     <div class="search-category">
  423.         <div class="container">
  424.             <div class="search-wrapper-glass">
  425.                 <form method="POST" action="{{ path('app_formations_recherche') }}">
  426.                     <div class="form-container-modern">
  427.                         <!-- Champ Titre -->
  428.                         <div class="input-group-custom">
  429.                             <i class="zmdi zmdi-search"></i>
  430.                             <input placeholder="Quelle compétence souhaitez-vous acquérir ?" type="text" name="titre" class="form-control">
  431.                         </div>
  432.                         <!-- Champ Catégorie -->
  433.                         <div class="input-group-custom">
  434.                             <i class="zmdi zmdi-collection-bookmark"></i>
  435.                             <select name="categorie">
  436.                                 <option value="">Toutes les catégories</option>
  437.                                 <option value="Certifiante">Certifiantes</option>
  438.                                 <option value="Pratique">Pratiques</option>
  439.                                 <option value="BootCamp">BootCamp</option>
  440.                                 <option value="Cursus">Cursus</option>
  441.                             </select>
  442.                         </div>
  443.                         <!-- Champ Niveau -->
  444.                         <div class="input-group-custom">
  445.                             <i class="zmdi zmdi-trending-up"></i>
  446.                             <select name="niveau">
  447.                                 <option value="">Tous les niveaux</option>
  448.                                 <option value="Débutant">Débutant</option>
  449.                                 <option value="Intermediaire">Intermédiaire</option>
  450.                                 <option value="Avancé">Avancé</option>
  451.                             </select>
  452.                         </div>
  453.                         <!-- Bouton -->
  454.                         <button type="submit" class="btn-search-modern">
  455.                             <span>Rechercher</span>
  456.                             <i class="zmdi zmdi-arrow-right"></i>
  457.                         </button>
  458.                     </div>
  459.                 </form>
  460.             </div>
  461.         </div>
  462.     </div>
  463.     <!-- COURSE AREA -->
  464.     <div class="course-area">
  465.         <div class="container">
  466.             <div class="row">
  467.                 <div class="col-md-12">
  468.                     <div class="section-title-wrapper">
  469.                         <div class="section-title">
  470.                             <h3>Formations Populaires</h3>
  471.                             <p>Découvrez nos formations les plus demandées par nos apprenants</p>
  472.                         </div>
  473.                     </div>
  474.                 </div>
  475.             </div>
  476.             <div class="row">
  477.                 {% for fo in paginator %}
  478.                     <div class="col-lg-4 col-md-6 col-12 mb-4 d-flex">
  479.                         <div class="single-item w-100">
  480.                             <div class="single-item-image overlay-effect">
  481.                                 <a href="{{ path('app_formation_detailsfront', {'slug': fo.slug}) }}">
  482.                                     <img src="{{ asset('uploads/formation/' ~ fo.affiche) }}" alt="{{ fo.titre }}">
  483.                                 </a>
  484. {#                                <div class="courses-hover-info">#}
  485. {#                                    {% if fo.formateur != null %}#}
  486. {#                                        <div class="courses-hover-action">#}
  487. {#                                            <div class="courses-hover-thumb">#}
  488. {#                                                <img src="{{ asset('uploads/coach/' ~ fo.formateur.logo) }}" alt="{{ fo.formateur.prenom }}">#}
  489. {#                                            </div>#}
  490. {#                                            <h4><a href="{{ path('app_formation_detailsfront', {'slug': fo.slug}) }}">{{ fo.formateur.prenom }} {{ fo.formateur.nom }}</a></h4>#}
  491. {#                                            <span class="crs-separator">/</span>#}
  492. {#                                            <p>{{ fo.formateur.poste }}</p>#}
  493. {#                                        </div>#}
  494. {#                                    {% endif %}#}
  495. {#                                </div>#}
  496.                             </div>
  497.                             <div class="single-item-text">
  498.                                 <h4><a href="{{ path('app_formation_detailsfront', {'slug': fo.slug}) }}">{{ fo.titre }}</a></h4>
  499.                                 <p>
  500.                                     {{ fo.desccourt|striptags|slice(0, 100)|raw }}
  501.                                     {% if  fo.desccourt|striptags|length > 100 %}...{% endif %}
  502.                                 </p>
  503.                                 <div class="single-item-content">
  504.                                     <div class="single-item-comment-view">
  505.                                         <span><i class="zmdi zmdi-accounts"></i> {{ fo.totalinscrit }}</span>
  506.                                         <span><i class="zmdi zmdi-favorite"></i> {{ fo.nblike }}</span>
  507.                                     </div>
  508.                                     <div class="single-item-rating">
  509.                                         <i class="zmdi zmdi-star"></i>
  510.                                         <i class="zmdi zmdi-star"></i>
  511.                                         <i class="zmdi zmdi-star"></i>
  512.                                         <i class="zmdi zmdi-star"></i>
  513.                                         <i class="zmdi zmdi-star"></i>
  514.                                     </div>
  515.                                 </div>
  516.                             </div>
  517.                         </div>
  518.                     </div>
  519.                 {% endfor %}
  520.             </div>
  521.             <!-- PAGINATION -->
  522.             <div class="row">
  523.                 <div class="col-12">
  524.                     <div class="pagination-wrapper">
  525.                         {{ knp_pagination_render(paginator, 'formation/custom_pagination.html.twig') }}
  526.                     </div>
  527.                 </div>
  528.             </div>
  529.         </div>
  530.     </div>
  531. {% endblock %}