templates/fiche/index.html.twig line 287

Open in your IDE?
  1. {% extends 'base.html.twig' %}
  2. {% block head %}
  3.     <script type="application/ld+json">
  4.         {
  5.             "@context": "https://schema.org",
  6.             "@type": "School",
  7.             "name": "{{ etablissement.denomination }}",
  8.             "address": {
  9.                 "@type": "PostalAddress",
  10.                 "streetAddress":"{{ etablissement.adresse2 }}",
  11.                 "addressLocality": "{{etablissement.ville.departement.libelle}}",
  12.                 "addressRegion": "{{ etablissement.region.id }}",
  13.                 "postalCode": "{{ etablissement.codePostal }}",
  14.                 "addressCountry": "{{ etablissement.region.pays.id }}"
  15.             },
  16.             "geo": {
  17.                 "@type": "GeoCoordinates",
  18.                 "latitude": "{{ etablissement.latitude }}",
  19.                 "longitude": "{{ etablissement.longitude }}"
  20.             },
  21.             "url": "{{ etablissement.url }}",
  22.             "telephone": "{{ etablissement.telephonePrincipal }}",
  23.             "email" : "{{ etablissement.emailPrincipal }}"
  24.         }
  25.     </script>
  26. {% endblock %}
  27. {% block stylesheets %}
  28.     {% if etablissement.autoriseTelephonePayant %}
  29.         <link rel="preload" href="https://wshiconnect.mediakiosque.com/hiconnectjs/css/style-1.0.2.css" as="style" onload="this.rel='stylesheet'">
  30.         <noscript><link rel="stylesheet" href="https://wshiconnect.mediakiosque.com/hiconnectjs/css/style-1.0.2.css"></noscript>
  31.         <style>
  32.         .showNumberBtn .btn.green {
  33.             background: #fff !important;
  34.             all: unset;
  35.         }
  36.         </style>
  37.     {% endif %}
  38.     <link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" crossorigin=""/>
  39.     {# Btn Sticky sur mobile #}
  40.     <style>
  41.     
  42.     </style>
  43. {% endblock %}
  44. {# ----- javascripts -------------------------------------------------------- #}
  45. {% block javascripts %}
  46.     {% if etablissement.autoriseTelephonePayant %}
  47.         <script type="text/javascript" src="https://wshiconnect.mediakiosque.com/hiconnectjs/js/hmd_hiconnect-2.0.0-{{ hiConnectJskey }}.js?jquery=no" defer></script>
  48.         <script>
  49.             var hiConnectInterval = setInterval(function() {
  50.             if (typeof(jQuery) !== 'undefined' && typeof($.fn.hmdHiconnect) !== 'undefined') {
  51.                 clearInterval(hiConnectInterval);
  52.                 $(document).ready(function($) {
  53.                     $('.hmd_hiconnect').hmdHiconnect();
  54.                 });
  55.             }
  56.         }, 100);
  57.         </script>
  58.     {% endif %}
  59.     <script>
  60.         // Character counter
  61.         var textarea = document.querySelector("textarea");
  62.         var maxlength = textarea.getAttribute("maxlength");
  63.         document.getElementById('textarea_feedback').innerHTML = maxlength + " caractères restants";
  64.         textarea.addEventListener("input", function(){
  65.             var maxlength = this.getAttribute("maxlength");
  66.             var currentLength = this.value.length;
  67.             if( currentLength > maxlength ){
  68.                 message = "Pas plus de " + maxlength + " caractères SVP.";
  69.                 return;
  70.             }else{
  71.                 message = maxlength - currentLength + "  caractères restants";
  72.             }
  73.             document.getElementById('textarea_feedback').innerHTML = message;
  74.         });
  75.     </script>
  76.     <script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js" crossorigin=""></script>
  77.     <script>
  78.         // Map affichée directement dans la fiche
  79.         {% if not etablissement.isClient %}
  80.         const mapzero = L.map('mapzero', {
  81.             zoomControl: false,
  82.             dragging: false,
  83.             scrollWheelZoom: false,
  84.             doubleClickZoom: false,
  85.             boxZoom: false,
  86.             keyboard: false,
  87.             tap: false,
  88.             touchZoom: false,
  89.         }).setView([{{etablissement.latitude}}, {{etablissement.longitude}}], 15);
  90.         L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
  91.             attribution: '',
  92.             interactive: false
  93.         }).addTo(mapzero);
  94.         L.marker([{{etablissement.latitude}}, {{etablissement.longitude}}], {interactive: false}).addTo(mapzero);
  95.         {% else %}
  96.         const mapzero = L.map('mapzero').setView([{{etablissement.latitude}}, {{etablissement.longitude}}], 15);
  97.         L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
  98.             attribution: ''
  99.         }).addTo(mapzero);
  100.         L.marker([{{etablissement.latitude}}, {{etablissement.longitude}}]).addTo(mapzero);
  101.         {% endif %}
  102.     </script>
  103.     
  104.     <script>
  105.     {# Afficher le bouton "Contacter l'étab" au scroll sur la fiche établissement après 20% de scroll #}
  106.     (function () {
  107.     const btn = document.querySelector('.container.page-fiche .contact-btn-like');
  108.     if (!btn) return;
  109.     window.addEventListener('scroll', () => {
  110.         const scrolled = window.scrollY;
  111.         const docHeight = document.documentElement.scrollHeight - window.innerHeight;
  112.         const percent = (scrolled / docHeight) * 100;
  113.         btn.classList.toggle('is-visible', percent >= 10); // Pourcentage de scroll avant d'afficher le bouton
  114.     }, { passive: true });
  115.     })();
  116.     {# Cacher le btn quand le form est visible #}
  117.     (function() {
  118.         const el = document.getElementById('di-inline-mobile'); // ton élément
  119.         if (!el) {
  120.             console.log('Élément introuvable !');
  121.             return;
  122.         }
  123.         const observer = new IntersectionObserver(
  124.             ([entry]) => {
  125.                 const btn = document.querySelector('.container.page-fiche .contact-btn-like');
  126.                 if (entry.isIntersecting) {
  127.                     // console.log('Élément VISIBLE à l’écran');
  128.                     btn.classList.add('d-none');
  129.                 } else {
  130.                     // console.log('Élément NON visible à l’écran');
  131.                     btn.classList.remove('d-none');
  132.                 }
  133.             },
  134.             {
  135.             threshold: 0.2 // déclenche dès que 20% de l’élément est visible
  136.             }
  137.         );
  138.         observer.observe(el);
  139.     })();
  140.     {# déplacer la carte après le formulaire, en version mobile #}
  141.     {#
  142.     document.addEventListener('DOMContentLoaded', function() {
  143.         const staticMap = document.getElementById('static-map');
  144.         const diInline = document.getElementById('di-inline-mobile');
  145.         function moveMap() {
  146.             if (window.innerWidth <= 767 && staticMap && diInline) {
  147.                 // Vérifie si la map n'est pas déjà déplacée
  148.                 if (!diInline.nextElementSibling || diInline.nextElementSibling.id !== 'static-map') {
  149.                     diInline.insertAdjacentElement('afterend', staticMap);
  150.                 }
  151.             }
  152.         }
  153.         moveMap();
  154.         window.addEventListener('resize', moveMap);
  155.     });
  156.     #}
  157.     </script>
  158. {% endblock %}
  159. {# ----- title, description et autres metadatas ----------------------------- #}
  160. {% set type = "" %}
  161. {% if etablissement.typeClient == 'internat' %}
  162.     {% set type = "internat" %}
  163. {% elseif etablissement.typeClient == 'organisme' %}
  164.     {% set type = "organisme" %}
  165. {% elseif etablissement.typeClient == 'fournisseur' %}
  166.     {% set type = "fournisseur" %}
  167. {% endif %}
  168. {%- block etabLieu -%}
  169.     {%- autoescape false -%}
  170.         {{ etablissement.denomination }} - {{ etablissement.codePostal }}
  171.         {%- if etablissement.ville %}
  172.             {%- if etablissement.ville.libelle %} {{  etablissement.ville.libelle -}}{%- endif -%}
  173.             {%- if etablissement.ville.departement and etablissement.ville.departement.libelle -%}
  174.                 - {{ etablissement.ville.departement.id }} {{ etablissement.ville.departement.libelle -}}
  175.             {%- endif -%}
  176.         {%- endif -%}
  177.     {%- endautoescape -%}
  178. {%- endblock -%}
  179. {% block title -%}
  180.     {%- autoescape false -%}
  181.         {{- block('etabLieu') -}}
  182.         {{- etablissement.categoriePrimaire ? ' - ' ~ etablissement.categoriePrimaire.libelle -}}
  183.     {%- endautoescape -%}
  184. {%- endblock %}
  185. {% block description -%}
  186. {%- autoescape false -%}
  187. {{- block('etabLieu') }} {{ etablissement.motsCles -}}
  188. {# {{- (etablissement.compileTexteReferencement | default(etablissement.motsCles)) | striptags | u.truncate(160, '...', false) -}} #}
  189. {%- endautoescape -%}
  190. {%- endblock %}
  191. {% set siteLdJson = siteLdJson | merge(['etablissement']) %}
  192. {# ----- contenu ------------------------------------------------------------ #}
  193. {% block body %}
  194. {% set imgAlt = [
  195.     etablissement.codePostal,
  196.     (etablissement.ville ? etablissement.ville.libelle : ''),
  197.     etablissement.denomination,
  198. ]|join(' - ')|trim(' -') %}
  199. <section class="container page-fiche {{ type ? type : typeOnglet(etablissement.type) }}  ">
  200.     {# ----- Breadcrumb ----------------------------------------------------- #}
  201.     <div id="breadcrumb">
  202.         {% include '_includes/breadcrumb-etablissement.html.twig' with {
  203.             'etablissement': etablissement,
  204.         } only %}
  205.     </div>
  206.     <div>
  207.         <header>
  208.             {# <div class="col-12 col-lg-6 d-left"> #}
  209.             <div class="col">
  210.                 {# Logo + Dénomination #}
  211.                 <div class="container description-new mt-3 mb-3">
  212.                     <div class="row align-items-center">
  213.                         <div class="col-lg-2 col-md-2" style="">
  214.                             <div class="row g-0">
  215.                                 <div class="col">
  216.                                     <figure class="fiche-logo">
  217.                                         {% if etablissement.isClient and etablissement.logo %}
  218.                                             <img src="{{ vich_uploader_asset(etablissement.logo, 'logoFile') | imagine_filter('etab_fiche_logo') }}" alt="{{ imgAlt }}" title="{{ imgAlt }}">
  219.                                             {% set figure = vich_uploader_asset(etablissement.logo, 'logoFile') | imagine_filter('etab_fiche_logo') %}
  220.                                         {% else %}
  221.                                             <span class="no-logo"></span>
  222.                                         {% endif %}
  223.                                     </figure>
  224.                                 </div>
  225.                                 <div class="col-auto d-md-none text-end">
  226.                                     {# Bouton de contact #}
  227.                                     <div class="text-center contact-btn-like-top" onclick="document.getElementById('di-inline').scrollIntoView({ behavior: 'smooth' });">
  228.                                         <div id="top-level1">Besoin d'informations ?</div>
  229.                                         <div id="top-level2">Contactez l'établissement</div>
  230.                                     </div>
  231.                                 </div>
  232.                             </div>
  233.                         </div>
  234.                         <div class="col-lg-10 col-md-10 col-sm-12">
  235.                             <h1 class="denomination">{{ etablissement.denomination }}</h1>
  236.                             {% if type != 'fournisseur' and type != 'organisme' %}
  237.                             <div class="denomination-footer">
  238.                                 {% if etablissement.catholique %}Enseignement catholique{% endif %}
  239.                                 {% if etablissement.sousContrat %}<span class="badge-sous-contrat">Sous contrat</span>{% endif %}
  240.                             </div>
  241.                             {% endif %}
  242.                         </div>
  243.                     </div>
  244.                 </div>
  245.                 {# image étab + coords + btn "contact" + map #}
  246.                 <div class="container contact">
  247.                     <div class="row contact-bloc ">
  248.                         <div class="col-lg-4">
  249.                             {# ----- Diaporama/photo ---------------------------------------------- #}
  250.                             {% include 'fiche/_includes/diaporama.html.twig' with {
  251.                                 'etablissement': etablissement,
  252.                             } only %}
  253.                         </div>
  254.                         <div class="col-lg-4 mt-4 mt-lg-0">
  255.                             {# ----- Quelques chiffres  ------------------------------------------ #}
  256.                             {% if etablissement.chiffres is not empty and etablissement.chiffres != "0" %}
  257.                             <div class="titre-haut-1">Quelques chiffres</div>
  258.                             <ul class="list-unstyled liste-chiffres">
  259.                                 {{ en_quelques_chiffres(etablissement.chiffres) | raw }}
  260.                             </ul>
  261.                             {% elseif etablissement.getData is not empty and etablissement.chiffres != "0" %}
  262.                             <div class="titre-haut-1">Quelques chiffres</div>
  263.                             <ul class="list-unstyled liste-chiffres">
  264.                                 {% for item in etablissement.getData %}
  265.                                 <li>{{item.label}}: <b>{{item.value}}{{item.suffix}}</b> </li>
  266.                                 {% endfor %}
  267.                             </ul>
  268.                             {% endif %}
  269.                             
  270.                             {# ----- Adresse/Coordonnées (bloc "Localisation" )---------------------- #}
  271.                             <div class="coords">
  272.                                 {% include 'fiche/_includes/address.html.twig' with {
  273.                                     'etablissement': etablissement,
  274.                                 } only %}
  275.                             </div>
  276.                             {% if etablissement.isClient %}
  277.                             {# ----- JPO, actualité, offre d'emploi -- #}
  278.                             {% include 'fiche/_includes/infos.html.twig' %}
  279.                             {% endif %}
  280.                             {% if etablissement.isClient or etablissement.typeClient in ['organisme', 'fournisseur'] %}
  281.                             {# Bouton de contact #}
  282.                             <div class="contact-btn-like text-center" onclick="document.getElementById('di-inline').scrollIntoView({ behavior: 'smooth' });">
  283.                                 <div id="level1">Besoin d'informations ?</div>
  284.                                 <div id="level2">Contactez l'établissement</div>
  285.                             </div>
  286.                             {% endif %}
  287.                             {% include 'fiche/_includes/telephone-payant.html.twig' with {'etablissement': etablissement} only %}
  288.                         </div>
  289.                         <div class="col-lg-4 carte mt-4 mt-lg-0">
  290.                             {# ----- Carte ---------------------------------------------- #}
  291.                             {% if etablissement.latitude is not empty and etablissement.longitude is not empty %}
  292.                             <div id="static-map" style="min-height: 260px; height: 100%;" class="d-none d-lg-block">
  293.                                 
  294.                                
  295.                                     <div id="mapzero" style="width: 100%; height: 100%;">La carte de l'établissement...</div>
  296.                                     <div class="itineraire-map">
  297.                                         <a href="{{"https://www.google.com/maps/dir/?api=1&destination="~ etablissement.latitude ~"%2C"~ etablissement.longitude ~"&dir_action=navigate"}}" class="itineraire" target="_blank" rel="noopener">
  298.                                         Itinéraire
  299.                                         </a>
  300.                                     </div>
  301.                                     
  302.                                 <span class="map_marker"></span>
  303.                             </div>
  304.                             {% endif %}
  305.                         </div>
  306.                     </div>
  307.                 </div> 
  308.             </div>
  309.             <div class="d-block d-lg-none d-xl-none mb-4">
  310.                 {% if etablissement.isClient %}
  311.                     {# ----- Diplômes -- #}
  312.                     {% include 'fiche/_includes/diplomes.html.twig' %}
  313.                 {% endif %}
  314.             </div>
  315.            
  316.             <div class="d-none d-lg-block d-xl-block w-100">
  317.                 {% if etablissement.isClient %}
  318.                     {# ----- Diplômes -- #}
  319.                     {% include 'fiche/_includes/diplomes.html.twig' %}
  320.                 {% endif %}
  321.             </div>
  322.         </header>
  323.     </div>
  324.     <div class="wrap mt-4">
  325.         <section class="content">
  326.             <article>
  327.             {% if etablissement.isClient or etablissement.typeClient in ['organisme', 'fournisseur'] %}
  328.                 {# ----- Insertion -------------------------------------- #}
  329.                 {% include 'fiche/_includes/insertion.html.twig'  %}
  330.                 <span id="di-inline-mobile"></span>
  331.                 {# ----- Contacter établissement (bas de la fiche) ---------------- #}
  332.                 <div class="fiche-coords d-none d-lg-flex">
  333.                   {% if type == 'fournisseur' %}
  334.                   <div class="form">
  335.                       {% include '_includes/lien-masque.html.twig' with {
  336.                           'target': path('form-di', {id : etablissement.id}),
  337.                           'content': 'Contacter le fournisseur',
  338.                       } only %}
  339.                     </div>
  340.                   {% elseif type == 'organisme' %}
  341.                   <div class="form">
  342.                       {% include '_includes/lien-masque.html.twig' with {
  343.                           'target': path('form-di', {id : etablissement.id}),
  344.                           'content': 'Contacter l\'organisme',
  345.                       } only %}
  346.                       </div>
  347.                   {% else %} {# établissement ou internat #}
  348.                       {% include 'fiche/_includes/static-slider.html.twig' %}                      
  349.                   {% endif %}
  350.                 </div>
  351.             {% else %}
  352.                 {# ----- Options pour non-participant ------------------- #}
  353.                 {% include 'fiche/_includes/options-non-participant.html.twig' %}
  354.             {% endif %}
  355.             </article>
  356.             {# ----- Recommandations ---------------------------------------- #}
  357.             {% if not etablissement.isClient and etablissement.typeClient in ['établissement', 'internat'] %}
  358.                 {% include 'fiche/_includes/etablissements-proches-prospect.html.twig' with {
  359.                     'etablissement': etablissement,
  360.                     'etablissementsProches': etablissementsProches,
  361.                 } only %}
  362.             {% endif %}
  363.             {% if etablissement.typeClient in ['établissement', 'internat'] %}
  364.                 {% include 'fiche/_includes/etablissements-du-meme-groupe.html.twig' %}
  365.             {% endif %}
  366.             {# ----- Informations de contact ---------------------------------------- #}
  367.             <div class="fiche-module informations-contact">
  368.                 <h2 id="informations-contact">Autres contacts établissement</h2>
  369.                 <ul class="list-unstyled card-two-columns-old">
  370.                     <li>
  371.                         {% include 'fiche/_includes/telephone.html.twig' with {
  372.                             'etablissement': etablissement,
  373.                         } only %}
  374.                     </li>
  375.                     {% if etablissement.isClient %}
  376.                     <li class="website">
  377.                         {% include 'fiche/_includes/siteweb.html.twig' with {
  378.                             'etablissement': etablissement,
  379.                         } only %}
  380.                     </li>
  381.                     <li class="facebook">
  382.                         {% include 'fiche/_includes/facebook.html.twig' with {
  383.                             'etablissement': etablissement,
  384.                         } only %}
  385.                     {% endif %}
  386.                     </li>
  387.                 </ul>
  388.             </div>
  389.             {# ----- Contexte recherche --------------------------------------------- #}
  390.             {% block contexte %}
  391.                 {% include 'fiche/_includes/contexte-recherche.html.twig' with contexte only %}
  392.             {% endblock %}
  393.         </section>
  394.         <aside>
  395.             {% if etablissement.isClient %}
  396.                 {% include 'fiche/_includes/form-contacter-etablissement.html.twig' %}
  397.             {% endif %}
  398.             <div class="last-flex">
  399.                 {% include 'annuaire/_includes/lien-guide.html.twig' %}
  400.                 {% if etablissement.participant == false %}
  401.                 {% include '_includes/banners-list.html.twig' with {
  402.                     'emplacement': [],
  403.                 } only %}
  404.                 {% endif %}
  405.                 {% include '_includes/newsletter.html.twig' %}
  406.                 {% include '_includes/last-search.html.twig' %}
  407.                 {% include '_includes/last-establishment.html.twig' %}
  408.             </div>
  409.         </aside>
  410.     </div>
  411. </section>
  412. {# ----- Recommandations ---------------------------------------- #}
  413. {% if etablissement.isClient and etablissement.typeClient in ['établissement', 'internat'] %}
  414.     {% include 'fiche/_includes/etablissements-proches-client.html.twig' with {
  415.         'quoi': contexte.quoi,
  416.         'lieu': contexte.lieu,
  417.         'etablissement': etablissement,
  418.         'etablissementsProches': etablissementsProches,
  419.     } only %}
  420. {% endif %}
  421. {% endblock %}
  422. {% block data_layer %}
  423. <script>
  424. // 1. Contexte global de la page
  425. dataLayer.push({{ {
  426.     event: "page_context",
  427.     page_type: "fiche_etablissement",
  428.     fiche_type: etablissement.typeClient,
  429.     site_section: "annuaire",
  430.     education_niveau: typeOnglet(etablissement.type),
  431.     education_sous_niveau: null,
  432.     region: etablissement.ville.departement.region.libelle,
  433.     departement: etablissement.ville.departement.id,
  434.     ville: etablissement.ville.libelle,
  435.     code_postal: etablissement.codePostal,
  436.     etablissement_id: etablissement.id,
  437.     etablissement_nom: etablissement.denomination,
  438.     etablissement_segment: etablissement.isClient ? "client" : "prospect",
  439.     contrat_type: etablissement.sousContrat ? "sous_contrat" : "hors_contrat"
  440. }|json_encode(constant('JSON_UNESCAPED_UNICODE'))|raw }});
  441. // 2. Événement métier : vue d’un établissement
  442. dataLayer.push({ ecommerce: null });
  443. dataLayer.push({{ {
  444.     event: "view_item",
  445.     ecommerce: {
  446.         items: [
  447.             {
  448.                 item_id: etablissement.id,
  449.                 item_name: etablissement.denomination,
  450.                 item_category: etablissement.typeClient,
  451.                 item_category2: typeOnglet(etablissement.type),
  452.                 item_category3: null,
  453.                 item_category4: etablissement.sousContrat ? "sous_contrat" : "hors_contrat",
  454.                 location_id: etablissement.ville.departement.id ~ "-" ~ etablissement.codePostal ~ "-" ~ etablissement.ville.libelle
  455.             }
  456.         ]
  457.     }
  458. }|json_encode(constant('JSON_UNESCAPED_UNICODE'))|raw }});
  459. </script>
  460. {% if diEnvoyee %}
  461. <script>
  462.     dataLayer.push({{ {
  463.         event: "lead_demande_information",
  464.         etablissement_id: etablissement.id,
  465.         etablissement_nom: etablissement.denomination,
  466.         etablissement_segment: "client"
  467.     }|json_encode(constant('JSON_UNESCAPED_UNICODE'))|raw }});
  468. </script>
  469. {% endif %}
  470. {% endblock %}