templates/b2c/shops.html.twig line 1

Open in your IDE?
  1. {# @var this \Pimcore\Templating\PhpEngine #}
  2. {# @var view \Pimcore\Templating\PhpEngine #}
  3. {# @var app \Pimcore\Templating\GlobalVariables #}
  4. {# @var $this->product \AppBundle\Model\DefaultProduct #}
  5. {% extends 'layouts/layout_b2c.html.twig' %}
  6. {% block content %}
  7. <script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyBY5eieFHCE5EhZ_-AtWU124rpenVg7BJE&libraries=geometry,places&callback=initMap&v=weekly&region=IT&language=it" defer></script>
  8. <section class="shops-container d-flex justify-content-center flex-wrap">
  9.                 <div class="shops-search" id="shops-search">
  10.                     <div class="inner">
  11.                         <h2>Punti vendita</h2>
  12.                         <div id="form_shops">   
  13.                             <div class="input-group">                         
  14.                                 <input type="text" class="searchbar form-control" id="search_shops_map" type="text" name="address" placeholder="Inserire città o CAP" />
  15.                                 <div class="searchbutton input-group-append">
  16.                                     <button class="btn" type="button" id="button_shops"><img src="/mecstore/b2c/assets/images/custom_icons/search-icon.svg" alt="search"></button>       
  17.                                     <button class="btn" type="button restore_search" id="restore_search">X</button>                          
  18.                                 </div>
  19.                             </div>
  20.                             <div class="geolocal">
  21.                                 <span class="geolocalize">USA LA GEOLOCALIZZAZIONE</span>
  22.                                 <span class="geolocalize_error">Attiva la geolocalizzazione nel browser</span>
  23.                             </div>
  24.                             <div id="shops_list" class="shops_list" style="height:600px; overflow-y:scroll;">
  25.                                 
  26.                             </div>
  27.                         </div>
  28.                     </div>
  29.                 </div>
  30.                 <div class="shops_map" id="shops_map" >
  31.                         
  32.                         
  33.                 </div>
  34.             </section>
  35.             <script>           
  36.                 const urlParams = new URLSearchParams(window.location.search);
  37.                 const latSent = urlParams.get('user_lat');
  38.                 const lngSent = urlParams.get('user_lng');
  39.                 window.dataLayer = window.dataLayer || [];
  40.                 let map;
  41.                 let markers = [];
  42.                 let infoWindows = [];
  43.                 let markerLinks = [];
  44.                 let watch;
  45.                 
  46.                 function geocodeLatLng(geocoder, coords, type) {
  47.                     const latlng = {
  48.                         lat: parseFloat(coords.latitude),
  49.                         lng: parseFloat(coords.longitude),
  50.                     };
  51.                     geocoder.geocode({ location: latlng }, (results, status) => {
  52.                         if (status === "OK") {
  53.                             if (results[0]) {
  54.                                 window.dataLayer.push({
  55.                                     'event': type,
  56.                                     'search_term': results[0].formatted_address || 'geolocalization'
  57.                                 });
  58.                             } else {
  59.                                 console.log("No results found");
  60.                             }
  61.                         } else {
  62.                             console.log("Geocoder failed due to: " + status);
  63.                         }
  64.                     });
  65.                 }
  66.                 function initMap(coords) {
  67.                     /* Posizione di Default */
  68.                     let default_location = new google.maps.LatLng(45.9584803,12.6411075);
  69.                     let geocoder = new google.maps.Geocoder();
  70.                     /* Mappa */
  71.                     map = new google.maps.Map(document.getElementById('shops_map'), {
  72.                         center: default_location,
  73.                         zoom: 8
  74.                     });
  75.                     let activeInfoWindow;
  76.                 
  77.                     fetch('/b2c/partners')
  78.                     .then((response) => response.json())
  79.                     .then((data) => {
  80.                         data.forEach(function (val, i){
  81.                             // Marker 
  82.                             let marker = new google.maps.Marker({
  83.                                 map: map,
  84.                                 title: val.name,
  85.                                 position: new google.maps.LatLng(val.luogoLat, val.luogoLon),
  86.                                         icon: { scaledSize: { width: 26, height: 43 }, url: "/mecstore/b2c/assets/images/custom_icons/marker_map.png" }
  87.                             });
  88.                             markers.push(marker);
  89.                             // InfoWindow 
  90.                             let infoWindow = new google.maps.InfoWindow({
  91.                                 content: `
  92.                                 <div class="info-window ">
  93.                                     <div class="">
  94.                                         <strong class="info-window-name">`+val.name+`</strong><br/>
  95.                                         `+val.indirizzo+`, `+val.cap+`, `+val.comune+` (`+val.provincia+`)<br/>
  96.                                     </div>
  97.                                     <div class="">
  98.                                         Tel. `+val.tel+`<br />
  99.                                         ${val.email ? 'Email: <a href="mailto:'+val.email+'" target="_blank">'+val.email+'<br />' : ''}
  100.                                     </div>
  101.                                     <a href="b2c_shop?pagename=`+val.pagename+`" class="" style="padding-top: 5px; text-align: right; width: 100%; display: inline-block;">Vedi scheda ></a>
  102.                                 </div>`
  103.                             });
  104.                             infoWindows.push(infoWindow);
  105.                             let markerLink = `
  106.                                 <div class="shop" data-alphabet='`+val.name+`' data-marker="marker_`+i+`" > 
  107.                                     <div class="shop_data">                              
  108.                                         <div class="info">
  109.                                             <p>
  110.                                                 <span class="shop_name">`+val.name+`</span><br>
  111.                                                 `+val.indirizzo+`, `+val.cap+`, `+val.comune+` (`+val.provincia+`)<br>
  112.                                             </p>
  113.                                             <a class="shop_openmap">vedi su mappa</a>
  114.                                         </div>
  115.                                         <div class="contacts">
  116.                                             <i class="fa-phone fas"></i> `+val.tel+`<br />
  117.                                             ${val.email ? 'Email: <a href="mailto:'+val.email+'" target="_blank">'+val.email+'<br />' : ''}
  118.                                         </div>
  119.                                     </div>
  120.                                     <div class="d-flex justify-content-end">
  121.                                         <a href="b2c_shop?pagename=`+val.pagename+`" class="shop_link"><span>Vedi scheda</span></a>
  122.                                     </div>
  123.                                 </div>
  124.                             `;
  125.                             markerLinks.push(markerLink);
  126.                         });  
  127.                         
  128.                         markers.forEach(function (ele, i) {
  129.                                 let shop = document.getElementById('shops_list');
  130.                             // Creo la lista 
  131.                             shop.innerHTML += markerLinks[i];
  132.                             // Apertura InfoWindow 
  133.                             ele.addListener('click', function() {
  134.                                 if (activeInfoWindow) { 
  135.                                     activeInfoWindow.close(); 
  136.                                 }
  137.                                 infoWindows[i].open(map, this);
  138.                                 activeInfoWindow = infoWindows[i];
  139.                             });
  140.                         });
  141.                         $('.shop_openmap').each(function(i, e) {
  142.                             $(e).click(function(i) {
  143.                                 return function(e) {
  144.                                     google.maps.event.trigger(markers[i], 'click');
  145.                                 }
  146.                             }(i));
  147.                         });
  148.                         shopsSortByAlphabet();
  149.                         
  150.                         // autocomplete punti vendita
  151.                         let autocomplete = new google.maps.places.Autocomplete(document.getElementById('search_shops_map'));
  152.                         
  153.                         // Marker Posizione Utente
  154.                         let user_place_marker = new google.maps.Marker({ map: map });
  155.                         // Search functions
  156.                         if ("geolocation" in navigator) {
  157.                             $('.geolocalize').css('display', 'block');
  158.                             $('.geolocalize').click(function () {
  159.                                 initGeo();
  160.                             });
  161.                         }
  162.                         function success(p) {
  163.                             $('.geolocalize_error').hide();
  164.                             $('.geolocalize').hide();
  165.                             //navigator.geolocation.clearWatch(watch);
  166.                         }
  167.                         function error() {
  168.                             $('.geolocalize_error').css('display', 'block');
  169.                             restore_button.click();
  170.                             return;
  171.                         }
  172.                         function initGeo() {
  173.                             $('.geolocalize_error').hide();
  174.                             if ("geolocation" in navigator) {
  175.                                 watch = navigator.geolocation.getCurrentPosition(success, error);
  176.                             }
  177.                         }
  178.                         
  179.                         document.getElementById("search_shops_map").addEventListener('focus', function () {
  180.                             document.getElementById('button_shops').style.display = 'block';
  181.                             document.getElementById('restore_search').style.display = 'none';
  182.                         });
  183.                         let search_button = document.getElementById('button_shops');
  184.                         search_button.addEventListener('click', function (event) {
  185.                             event.stopPropagation();
  186.                             searchByPosition();
  187.                         });
  188.                         if (coords) {
  189.                             searchByPosition(null, coords, null, null)
  190.                         } 
  191.                         if (latSent || lngSent){
  192.                             searchByPosition(null,null,latSent,lngSent)
  193.                         }
  194.                         function searchByPosition(e, p, lt, ln) {
  195.                             if (document.getElementById('search_shops_map').value == '' && !p) {
  196.                                 if(lt || ln){                                
  197.                                     var user_lat = parseFloat(lt);
  198.                                     var user_lng = parseFloat(ln);
  199.                                     /* Calcolo Distanze */      
  200.                                     markers.forEach(function (ele, i) {
  201.                                         let distance = google.maps.geometry.spherical.computeDistanceBetween(new google.maps.LatLng(user_lat, user_lng), ele.position);
  202.                                         //console.log('distance: '+distance);    
  203.                                         var float_distance = parseFloat((distance /1000 ).toFixed(1) );
  204.                                         //console.log('float_distance: '+float_distance);    
  205.                                         if (float_distance> 30.0 || isNaN(float_distance)) {
  206.                                             ele.setMap(null);
  207.                                             document.querySelector('[data-marker="marker_'+i+'"]').style.display = 'none';
  208.                                             document.querySelector('[data-marker="marker_'+i+'"]').dataset.distance = float_distance;
  209.                                         } else {
  210.                                             ele.setMap(map);
  211.                                             document.querySelector('[data-marker="marker_'+i+'"]').style.display = 'flex';
  212.                                             document.querySelector('[data-marker="marker_'+i+'"]').dataset.distance = float_distance;
  213.                                         }
  214.                                     });                                    
  215.                                     shopsSortByDistance();
  216.                                     // Inserisco l'utente
  217.                                     var pan = {user_lat, user_lng};
  218.                                     map.panTo(pan);
  219.                                     map.setZoom(10);
  220.                                 } else {
  221.                                     document.getElementById("search_shops_map").placeholder = "Inserisci un indirizzo";
  222.                                     user_place_marker.setMap(null);
  223.                                 }
  224.                             } else {
  225.                                 document.getElementById('button_shops').style.display = 'none';
  226.                                 document.getElementById('restore_search').style.display = 'block';
  227.                                 var user_place = p ? undefined : autocomplete.getPlace();
  228.                                 if (p) {
  229.                                     geocodeLatLng(geocoder, p, 'button_shops');
  230.                                 } else {
  231.                                     window.dataLayer.push({
  232.                                         'event': 'button_shops',
  233.                                         'search_term': document.getElementById('search_shops_map').value
  234.                                     });
  235.                                 }
  236.                                 if (!p && "geolocation" in navigator) {
  237.                                     $('.geolocalize').css('display', 'block');
  238.                                 }
  239.                                 if (user_place || p) {
  240.                                     if(user_place.geometry.location.lat() || user_place.geometry.location.lng()){
  241.                                         if (p) {
  242.                                             document.getElementById("search_shops_map").value = "";
  243.                                             document.getElementById("search_shops_map").placeholder = "Geolocalizzazione attiva, inserisci indirizzo per una nuova ricerca";
  244.                                             var newPos = { lat: p.latitude, lng: p.longitude };
  245.                                         }
  246.                                         var user_lat = p ? p.latitude : user_place.geometry.location.lat();
  247.                                         var user_lng = p ? p.longitude : user_place.geometry.location.lng();
  248.                                         /* Calcolo Distanze */      
  249.                                         markers.forEach(function (ele, i) {
  250.                                             let distance = google.maps.geometry.spherical.computeDistanceBetween(new google.maps.LatLng(user_lat, user_lng), ele.position);
  251.                                             console.log('distance: '+distance);    
  252.                                             var float_distance = parseFloat((distance /1000 ).toFixed(1) );
  253.                                             console.log('float_distance: '+float_distance);    
  254.                                             if (float_distance> 30.0 || isNaN(float_distance)) {
  255.                                             ele.setMap(null);
  256.                                             document.querySelector('[data-marker="marker_'+i+'"]').style.display = 'none';
  257.                                             document.querySelector('[data-marker="marker_'+i+'"]').dataset.distance = float_distance;
  258.                                         } else {
  259.                                             ele.setMap(map);
  260.                                             document.querySelector('[data-marker="marker_'+i+'"]').style.display = 'flex';
  261.                                             document.querySelector('[data-marker="marker_'+i+'"]').dataset.distance = float_distance;
  262.                                         }
  263.                                         });
  264.                                         
  265.                                         shopsSortByDistance();
  266.                                         // Inserisco l'utente
  267.                                         var pan = newPos || user_place.geometry.location;
  268.                                         map.panTo(pan);
  269.                                         map.setZoom(10);
  270.                                     } else {
  271.                                         document.getElementById('error').innerHTML= 'Non sono stati trovati punti vendita in questa zona.';
  272.                                         document.getElementById('error').style.display = 'block';
  273.                                     }
  274.                                 } else {
  275.                                     document.getElementById("search_shops_map").value = "";
  276.                                     document.getElementById("search_shops_map").placeholder = "Inserisci un indirizzo";
  277.                                     user_place_marker.setMap(null);
  278.                                     // Rimetto tutti i punti sulla mappa e sulla lista 
  279.                                     markers.forEach(function (ele, i) {
  280.                                         ele.setMap(map);
  281.                                         ele.setPosition(ele.position );
  282.                                         document.querySelector('[data-marker="marker_'+i+'"]').style.display = 'flex';
  283.                                     });
  284.                                 }
  285.                             }
  286.                         }
  287.                         /* restore search function */
  288.                         let restore_button = document.getElementById('restore_search');
  289.                         restore_button.addEventListener('click', function (event) {
  290.                             event.stopPropagation();
  291.                             restoreShops();
  292.                         });
  293.                         function restoreShops() {
  294.                                 document.getElementById('button_shops').style.display = 'block';
  295.                                 document.getElementById('restore_search').style.display = 'none';
  296.                                 document.getElementById('search_shops_map').value = "";
  297.                                 document.getElementById("search_shops_map").placeholder = "Inserisci un indirizzo";
  298.                                 user_place_marker.setMap(null);
  299.                                 map.panTo(default_location);
  300.                                 map.setZoom(8);
  301.                                 if ("geolocation" in navigator) {
  302.                                     $('.geolocalize').css('display', 'block');
  303.                                 }
  304.                                 // Rimetto tutti i punti sulla mappa e sulla lista 
  305.                                 markers.forEach(function (ele, i) {
  306.                                     ele.setMap(map);
  307.                                     ele.setPosition(ele.position );
  308.                                     document.querySelector('[data-marker="marker_'+i+'"]').style.display = 'flex';
  309.                                 });
  310.                             shopsSortByAlphabet();
  311.                         }
  312.                     });            
  313.                 }
  314.                 /* sort functions */
  315.                 function shopsSortByDistance() {
  316.                     var wrapper = document.getElementById('shops_list');
  317.                     var elements = [...document.getElementById('shops_list').querySelectorAll('.shop')];
  318.                     elements.sort(function (a, b) {
  319.                         return +parseFloat(a.dataset.distance) - +parseFloat(b.dataset.distance);
  320.                         console.log('a.dataset.distance: '+a.dataset.distance);
  321.                         console.log('b.dataset.distance: '+b.dataset.distance);
  322.                     });
  323.                     elements.forEach(function (el) {
  324.                         wrapper.appendChild(el);
  325.                     });
  326.                 };
  327.                 function shopsSortByAlphabet() {
  328.                     var wrapper = document.getElementById('shops_list');
  329.                     var elements = [...document.getElementById('shops_list').querySelectorAll('.shop')];
  330.                         console.log('elements: '+elements[0].dataset.alphabet);
  331.                     elements.sort(function (a, b) {
  332.                         return a.dataset.alphabet.localeCompare(b.dataset.alphabet);
  333.                     });
  334.                     elements.forEach(function (el) {
  335.                         wrapper.appendChild(el);
  336.                     });
  337.                 };
  338.             </script>
  339.             <!-- End .container -->
  340.             <!-- margin -->
  341.             <!-- End .container -->
  342.             <!-- margin -->
  343. {%  endblock %}