templates/front_otacos/map-index.html.twig line 1

Open in your IDE?
  1. {% extends 'base.html.twig' %}
  2. {% block title %}{{'map.0'|trans}}{% endblock %}
  3. {% block body %}
  4. <style>
  5.     .example-wrapper { margin: 1em auto; max-width: 800px; width: 95%; font: 18px/1.5 sans-serif; }
  6.     .example-wrapper code { background: #F5F5F5; padding: 2px 6px; }
  7.     .styledMap {
  8.         padding: 5px 10px;
  9.     }
  10.     .styledMap h1{
  11.         color: #dd7d17;
  12.         font-size: 1.3em;
  13.         text-transform: uppercase;
  14.     }
  15.     .styledMap p{
  16.         font-size: 1.1em;
  17.         margin:0;
  18.     }
  19. </style>
  20.     <div class="maptacos">
  21.         <div class="wrapper">
  22.             <ul class="breadcrumb">
  23.                 <li><a href="{{path('home')}}">{{'accueil'|trans}}</a></li>
  24.                 <li>{{'map.1'|trans}}</li>
  25.             </ul>
  26.             <h1 class="titreDualFont"><div>{{'map.2'|trans|raw}}</div></h1>
  27.             <div class="maptacosform">
  28.                 <form id="rechercheMap" action="#">
  29.                     <input type="text" name="recherche" id="recherche" placeholder="{{'map.5'|trans}}" />
  30.                     <input type="submit" value="GO !" />
  31.                 </form>
  32.             </div>
  33.         </div>
  34.     </div>
  35.     <div class="wrapper maptacos-content">
  36.         <div class="maptacos-content-listing">
  37.             <div class="maptacos-content-listing-header">
  38.                 {# <span id="filtrer">{{'map.4'|trans}}</span> #}
  39.                 <p id="restoCount">{{restos|length}} {{'map.3'|trans}}{{restos|length >1 ? 's'}}</p>
  40.                 {# <div id="filtres">
  41.                     <p>Voir uniquement les restaurants proposant :
  42.                     <ul>
  43.                         <li><label><input type="checkbox" name="boxDrive" class="boxfiltre" value="drive" /> Drive <img src="/img/map-drive.png" /></label></li>
  44.                         <li><label><input type="checkbox" name="boxDelivery" class="boxfiltre" value="delivery" /> {{'map.6'|trans}} <img src="/img/map-delivery.png" /></label></li>
  45.                         <li><label><input type="checkbox" name="boxCollect" class="boxfiltre" value="collect" /> Click &amp; Collect <img src="/img/map-collect.png" /></label></li>
  46.                         <li><label><input type="checkbox" name="boxKiosk" class="boxfiltre" value="kiosk" /> Bornes de commande <img src="/img/map-borne.png" /></label></li>
  47.                     </ul>
  48.                 </div> #}
  49.             </div>
  50.             <div class="maptacos-content-listing-restos">
  51.                 {% for resto in restos %}
  52.                 <div class="restoFiche" 
  53.                 style="display:block;" 
  54.                 data-geovalid="1" 
  55.                 data-lng="{{resto.lng}}" 
  56.                 data-lat="{{resto.lat}}"
  57.                 data-collect="{{resto.collect}}"
  58.                 data-kiosk="{{resto.kiosk}}"
  59.                 data-drive="{{resto.drive}}"
  60.                 data-delivery="{{resto.delivery}}" >
  61.                     <p class="titre">{{resto.name}}</p>
  62.                     <p>{{resto.address}}</p>
  63.                     {% if resto.address2 is not empty %}
  64.                     <p>{{resto.address2}}</p>
  65.                     {% endif %}
  66.                     <p>{{resto.zipcode}} {{resto.city}}</p>
  67.                     {% if resto.phone is not empty %}
  68.                     <p>T. {{resto.phone}}</p>
  69.                     {% endif %}
  70.                     <br/>
  71. {#                     
  72.                     {% if resto.mondayOpen is not null and resto.mondayClose is not null %}
  73.                         <p>{{'lundi'|trans}} : {{resto.mondayOpen|date('H')}}h{{resto.mondayOpen|date('i')}} - {{resto.mondayClose|date('H')}}h{{resto.mondayClose|date('i')}}</p>
  74.                     {% else %}
  75.                         <p>{{'lundi'|trans}} : {{'ferme'|trans}} </p>
  76.                     {% endif %}
  77.                     
  78.                     {% if resto.tuesdayOpen is not null and resto.tuesdayClose is not null %}
  79.                         <p>{{'mardi'|trans}} : {{resto.tuesdayOpen|date('H')}}h{{resto.tuesdayOpen|date('i')}} - {{resto.tuesdayClose|date('H')}}h{{resto.tuesdayClose|date('i')}}</p>
  80.                     {% else %}
  81.                         <p>{{'mardi'|trans}} : {{'ferme'|trans}}</p>
  82.                     {% endif %}
  83.                     {% if resto.wednesdayOpen is not null and resto.wednesdayClose is not null %}
  84.                         <p>{{'mercredi'|trans}} : {{resto.wednesdayOpen|date('H')}}h{{resto.wednesdayOpen|date('i')}} - {{resto.wednesdayClose|date('H')}}h{{resto.wednesdayClose|date('i')}}</p>
  85.                     {% else %}
  86.                         <p>{{'mercredi'|trans}} :  {{'ferme'|trans}}</p>
  87.                     {% endif %}
  88.                     {% if resto.thursdayOpen is not null and resto.thursdayClose is not null %}
  89.                         <p>{{'jeudi'|trans}} : {{resto.thursdayOpen|date('H')}}h{{resto.thursdayOpen|date('i')}} - {{resto.thursdayClose|date('H')}}h{{resto.thursdayClose|date('i')}}</p>
  90.                     {% else %}
  91.                         <p>{{'jeudi'|trans}} : {{'ferme'|trans}}</p>
  92.                     {% endif %}
  93.                     {% if resto.fridayOpen is not null and resto.fridayClose is not null %}
  94.                         <p>{{'vendredi'|trans}} : {{resto.fridayOpen|date('H')}}h{{resto.fridayOpen|date('i')}} - {{resto.fridayClose|date('H')}}h{{resto.fridayClose|date('i')}}</p>
  95.                     {% else %}
  96.                         <p>{{'vendredi'|trans}} : {{'ferme'|trans}}</p>
  97.                     {% endif %}
  98.                     {% if resto.saturdayOpen is not null and resto.saturdayClose is not null %}
  99.                         <p>{{'samedi'|trans}} : {{resto.saturdayOpen|date('H')}}h{{resto.saturdayOpen|date('i')}} - {{resto.saturdayClose|date('H')}}h{{resto.saturdayClose|date('i')}}</p>
  100.                     {% else %}
  101.                         <p>{{'samedi'|trans}} : {{'ferme'|trans}}</p>
  102.                     {% endif %}
  103.                     {% if resto.sundayOpen is not null and resto.sundayClose is not null %}
  104.                         <p>{{'dimanche'|trans}} : {{resto.sundayOpen|date('H')}}h{{resto.sundayOpen|date('i')}} - {{resto.sundayClose|date('H')}}h{{resto.sundayClose|date('i')}}</p>
  105.                     {% else %}
  106.                         <p>{{'dimanche'|trans}} : {{'ferme'|trans}}</p>
  107.                     {% endif %}
  108.                     <div>
  109.                         {% if resto.drive %}<img src="/img/map-drive.png" />{% endif %}
  110.                         {% if resto.delivery %}<img src="/img/map-delivery.png" />{% endif %}
  111.                         {% if resto.collect %}<img src="/img/map-collect.png" />{% endif %}
  112.                         {% if resto.kiosk %}<img src="/img/map-borne.png" />{% endif %}
  113.                     </div> #}
  114.                 </div>
  115.                 {% endfor %}
  116.             </div>
  117.         </div>
  118.         <div class="maptacos-content-map">
  119.             <div id="map" style="width:100%;height:100%;"></div>
  120.         </div>
  121.     </div>
  122.     
  123. {% endblock %}
  124. {% block javascripts_bottom %}
  125.     <script>
  126.         let map;
  127.         let geocoder;
  128.         const image = "{{ app.request.schemeAndHttpHost ~ app.request.baseUrl }}/img/markermap.svg";
  129.         let rechercheLocation;
  130.         let filters = [];
  131.         function initMap() {
  132.             geocoder = new google.maps.Geocoder();
  133.             map = new google.maps.Map(document.getElementById("map"), {
  134.                 mapId: "2262022a4ce1b38",
  135.                 {% if app.request.getLocale() == "be" or app.request.getLocale() == "nl" %}
  136.                     center: { lat: 50.8509848, lng: 4.352069 },
  137.                 {% elseif app.request.getLocale() == "it" %}
  138.                 
  139.                     {% if restos|length == 1 %}
  140.                     center: { lat: {{restos[0].lat}}, lng: {{restos[0].lng}} },
  141.                     {% else %}
  142.                     center: { lat: 41.903027, lng: 12.498918 }, 
  143.                     {% endif %}
  144.                 {% else %}
  145.                     {% if restos|length == 1 %}
  146.                     center: { lat: {{restos[0].lat}}, lng: {{restos[0].lng}} },
  147.                     {% else %}
  148.                     center: { lat: 48.85596, lng: 2.35452 },
  149.                     {% endif %}
  150.                 {% endif %}
  151.                 zoom: 14,
  152.             });
  153.             let infowindow;
  154.             {% for resto in restos %}
  155.                 let marker{{loop.index0}} = new google.maps.Marker({
  156.                     position: { lat: {{resto.lat}}, lng: {{resto.lng}}},
  157.                     map,
  158.                     title: '{{resto.name|escape('js')}}',
  159.                     icon: image,
  160.                 });
  161.                 marker{{loop.index0}}.addListener("click", () => {
  162.                     if(infowindow) infowindow.close();
  163.                     let contentInfo = "<div class=\"styledMap\">";
  164.                     contentInfo+= "<h1>{{resto.name|escape('js')}}</h1>";
  165.                     contentInfo+= "<p><b>{{resto.address|escape('js')}}</b></p>";
  166.                     {% if resto.address2 is not empty %}
  167.                     contentInfo+= "<p><b>{{resto.address2|escape('js')}}</b></p>";
  168.                     {% endif %}
  169.                     contentInfo+= "<p><b>{{resto.zipcode|escape('js')}} {{resto.city|escape('js')}}</b></p>";
  170.                     
  171.                     {#
  172.                     
  173.                     {% if resto.phone is not null %}
  174.                     contentInfo+= "<p>Tél. <a href=\"tel:{{resto.phone}}\">{{resto.phone}}</a></p>";
  175.                     {% endif %}
  176.                     
  177.                     contentInfo+= "<br/><p>{{'lundi'|trans}} : ";
  178.                     {% if resto.mondayOpen is not null and resto.mondayClose is not null %}
  179.                         contentInfo+= "{{resto.mondayOpen|date('H')}}h{{resto.mondayOpen|date('i')}} - {{resto.mondayClose|date('H')}}h{{resto.mondayClose|date('i')}}</p>"; 
  180.                     {% else %}
  181.                         contentInfo+= " {{'ferme'|trans}}";
  182.                     {% endif %}
  183.                     
  184.                     contentInfo+= "<p>{{'mardi'|trans}} : ";
  185.                     {% if resto.tuesdayOpen is not null and resto.tuesdayClose is not null %}
  186.                         contentInfo+= "{{resto.tuesdayOpen|date('H')}}h{{resto.tuesdayOpen|date('i')}} - {{resto.tuesdayClose|date('H')}}h{{resto.tuesdayClose|date('i')}}</p>"; 
  187.                     {% else %}
  188.                         contentInfo+= " {{'ferme'|trans}}";
  189.                     {% endif %}
  190.                     contentInfo+= "<p>{{'mercredi'|trans}} : ";
  191.                     {% if resto.wednesdayOpen is not null and resto.wednesdayClose is not null %}
  192.                         contentInfo+= "{{resto.wednesdayOpen|date('H')}}h{{resto.wednesdayOpen|date('i')}} - {{resto.wednesdayClose|date('H')}}h{{resto.wednesdayClose|date('i')}}</p>"; 
  193.                     {% else %}
  194.                         contentInfo+= " {{'ferme'|trans}}";
  195.                     {% endif %}
  196.                     contentInfo+= "<p>{{'jeudi'|trans}} : ";
  197.                     {% if resto.thursdayOpen is not null and resto.thursdayClose is not null %}
  198.                         contentInfo+= "{{resto.thursdayOpen|date('H')}}h{{resto.thursdayOpen|date('i')}} - {{resto.thursdayClose|date('H')}}h{{resto.thursdayClose|date('i')}}</p>"; 
  199.                     {% else %}
  200.                         contentInfo+= " {{'ferme'|trans}}";
  201.                     {% endif %}
  202.                     contentInfo+= "<p>{{'vendredi'|trans}} : ";
  203.                     {% if resto.fridayOpen is not null and resto.fridayClose is not null %}
  204.                         contentInfo+= "{{resto.fridayOpen|date('H')}}h{{resto.fridayOpen|date('i')}} - {{resto.fridayClose|date('H')}}h{{resto.fridayClose|date('i')}}</p>"; 
  205.                     {% else %}
  206.                         contentInfo+= " {{'ferme'|trans}}";
  207.                     {% endif %}
  208.                     contentInfo+= "<p>{{'samedi'|trans}} : ";
  209.                     {% if resto.saturdayOpen is not null and resto.saturdayClose is not null %}
  210.                         contentInfo+= "{{resto.saturdayOpen|date('H')}}h{{resto.saturdayOpen|date('i')}} - {{resto.saturdayClose|date('H')}}h{{resto.saturdayClose|date('i')}}</p>"; 
  211.                     {% else %}
  212.                         contentInfo+= " {{'ferme'|trans}}";
  213.                     {% endif %}
  214.                     contentInfo+= "<p>{{'dimanche'|trans}} : ";
  215.                     {% if resto.sundayOpen is not null and resto.sundayClose is not null %}
  216.                         contentInfo+= "{{resto.sundayOpen|date('H')}}h{{resto.sundayOpen|date('i')}} - {{resto.sundayClose|date('H')}}h{{resto.sundayClose|date('i')}}</p>"; 
  217.                     {% else %}
  218.                         contentInfo+= " {{'ferme'|trans}}";
  219.                     {% endif %}
  220.                     #}
  221.                     contentInfo+= "</div>";
  222.                     infowindow = new google.maps.InfoWindow({
  223.                         content: contentInfo,
  224.                     });
  225.                     infowindow.open({
  226.                     anchor: marker{{loop.index0}},
  227.                     map,
  228.                     shouldFocus: false,
  229.                     });
  230.                 });
  231.             {% endfor %}
  232.             
  233.         }
  234.         function getCoord(recherche) {
  235.             geocoder.geocode( { 'address': recherche}, function(results, status) {
  236.                 if (status == 'OK') {
  237.                     map.setCenter(results[0].geometry.location);
  238.                     map.setZoom(11);
  239.                     if(results[0].geometry.location_type =="APPROXIMATE" || results[0].geometry.location_type =="ROOFTOP") {
  240.                         let rechLat;
  241.                         let rechLong;
  242.                         if(results[0].geometry.location_type =="APPROXIMATE") {
  243.                             let bounds = results[0].geometry.bounds;
  244.                             let boundsLat = bounds[Object.keys(bounds)[0]];
  245.                             rechLat = (boundsLat[Object.keys(boundsLat)[0]] + boundsLat[Object.keys(boundsLat)[1]]) / 2;
  246.     
  247.                             let boundsLong = bounds[Object.keys(bounds)[1]];
  248.                             rechLong = (boundsLong[Object.keys(boundsLong)[0]] + boundsLong[Object.keys(boundsLong)[1]]) / 2;
  249.                         } else {
  250.                             if(results[0].geometry.viewport !== undefined) {
  251.                                 let viewport = results[0].geometry.viewport;
  252.                                 let viewportLat = viewport[Object.keys(viewport)[0]];
  253.                                 rechLat = (viewportLat[Object.keys(viewportLat)[0]] + viewportLat[Object.keys(viewportLat)[1]]) / 2;
  254.         
  255.                                 let viewportLong = viewport[Object.keys(viewport)[1]];
  256.                                 rechLong = (viewportLong[Object.keys(viewportLong)[0]] + viewportLong[Object.keys(viewportLong)[1]]) / 2;
  257.                             } else {
  258.                                 let bounds = results[0].geometry.bounds;
  259.                                 let boundsLat = bounds[Object.keys(bounds)[0]];
  260.                                 rechLat = (boundsLat[Object.keys(boundsLat)[0]] + boundsLat[Object.keys(boundsLat)[1]]) / 2;
  261.         
  262.                                 let boundsLong = bounds[Object.keys(bounds)[1]];
  263.                                 rechLong = (boundsLong[Object.keys(boundsLong)[0]] + boundsLong[Object.keys(boundsLong)[1]]) / 2;
  264.                             }
  265.                         }
  266.  
  267.                         // Affiche cache les resto
  268.                         const restos = document.getElementsByClassName('restoFiche');
  269.                         const distance = 0.2;    
  270.                         for (let fiche of restos) {
  271.                             if(
  272.                                 fiche.getAttribute('data-lat') > (rechLat-distance) 
  273.                                 && fiche.getAttribute('data-lat') < (rechLat+distance)
  274.                                 && fiche.getAttribute('data-lng') > (rechLong-distance) 
  275.                                 && fiche.getAttribute('data-lng') < (rechLong+distance)                                
  276.                             ) {
  277.                                 //fiche.style.display = "block";
  278.                                 fiche.setAttribute('data-geovalid', '1');
  279.                                 //fiche.style.order = Math.round( (Math.abs(rechLat-fiche.getAttribute('data-lat')) + Math.abs(rechLong-fiche.getAttribute('data-lng')) * 100));
  280.                                 var order = Math.round(Math.abs(rechLat*1000-fiche.getAttribute('data-lat')*1000) + Math.abs(rechLong*1000-fiche.getAttribute('data-lng')*1000));
  281.                                 fiche.style.order = order;
  282.                                 
  283.                             } else {
  284.                                 //fiche.style.display = "none";
  285.                                 fiche.setAttribute('data-geovalid', '0');
  286.                             }
  287.                         }
  288.                         activFilters();
  289.                         
  290.                     }
  291.                 } else {
  292.                     //alert('Geocode was not successful for the following reason: ' + status);
  293.                 }
  294.             });
  295.         }
  296.         function activFilters() {
  297.             filters = [];
  298.             for (let checkbox of document.getElementsByClassName('boxfiltre')) {
  299.                 if(checkbox.checked) {
  300.                     filters.push(checkbox.value);
  301.                 }
  302.             }
  303.             let countResto = 0;
  304.             const restos = document.getElementsByClassName('restoFiche');             
  305.             for (let fiche of restos) {
  306.                 if(
  307.                     //fiche.style.display == "block" &&
  308.                     fiche.getAttribute('data-geovalid') == "1" &&
  309.                     (   
  310.                         (filters.length &&
  311.                         (
  312.                             (fiche.getAttribute('data-collect') == 1 && filters.includes('collect'))
  313.                             || (fiche.getAttribute('data-delivery') == 1 && filters.includes('delivery'))
  314.                             || (fiche.getAttribute('data-kiosk') == 1 && filters.includes('kiosk'))
  315.                             || (fiche.getAttribute('data-drive') == 1 && filters.includes('drive'))
  316.                         ))
  317.                         || !filters.length
  318.                     )
  319.                 ) {
  320.                     // La fiche est déjà valide, et les filtres souhaités correspondent
  321.                     countResto++;
  322.                     fiche.style.display = "block";
  323.                 } else {
  324.                     // Les filtres ne correspondent pas à la fiche
  325.                     fiche.style.display = "none";
  326.                 }
  327.             }
  328.             // Mise à jour du compteur de resto
  329.             if(countResto) {
  330.                 document.getElementById('restoCount').innerHTML = countResto+" {{'map.3'|trans}}"+(countResto > 1 ? 's':'')+" à proximité";
  331.             } else {
  332.                 document.getElementById('restoCount').innerHTML = "Aucun restaurant à proximité";
  333.             }                
  334.         
  335.         }
  336.         
  337.         for (let checkbox of document.getElementsByClassName('boxfiltre')) {
  338.             checkbox.addEventListener('change', activFilters);
  339.         }
  340.        // var geocoder = new google.maps.Geocoder();
  341.         
  342.         document.getElementById("rechercheMap").addEventListener("submit", function(e) {
  343.             rechercheLocation = document.getElementById("recherche").value;
  344.             if(rechercheLocation != "" && rechercheLocation != undefined) {
  345.                 getCoord(rechercheLocation);
  346.             }
  347.             e.preventDefault();
  348.             return false;
  349.         });
  350.         // document.getElementById('filtrer').addEventListener("click", function(e) {
  351.         //     if(document.getElementById('filtrer').classList.contains("filtrerOn")) {
  352.         //         document.getElementById('filtrer').classList.remove("filtrerOn");
  353.         //         document.getElementById('filtres').style.display = "none";
  354.         //     } else {
  355.         //         document.getElementById('filtrer').classList.add("filtrerOn");
  356.         //         document.getElementById('filtres').style.display = "block";
  357.         //     }
  358.         // });
  359.     </script>
  360.     <script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDdDbL-0mCap-U8hE8UrIktLcvdxYOXWVg&callback=initMap&v=weekly"
  361.       async defer
  362.     ></script>
  363. {% endblock %}