templates/homepage/index.html.twig line 1

  1. {% extends 'base.html.twig' %}
  2. {% block title %}Autanet.cz - Ojetá a nová vozidla na prodej. Vyberte si…{% endblock %}
  3. {% block desc %}Nová, předváděcí a ojetá auta z nabídky autobazarů a autosalonů. Auta na prodej, testy aut, rady, tipy a novinky na motoristickém inzertním portálu Autanet.cz.{% endblock %}
  4. {% block body %}
  5.     <div {{ react_component('SearchHomepage', {
  6.     }) }}></div>
  7.     <section class="stats">
  8.         <div class="stats__item">
  9.             <div class="stats__value">{{ stats.total|number_format(0, null, ' ') }}</div>
  10.             <div class="stats__label">vozidel v nabídce</div>
  11.         </div>
  12.         <div class="stats__item">
  13.             <div class="stats__value">+{{ stats.today|number_format(0, null, ' ') }}</div>
  14.             <div class="stats__label">přidáno dnes</div>
  15.         </div>
  16.         <div class="stats__item">
  17.             <div class="stats__value">+{{ stats.week|number_format(0, null, ' ') }}</div>
  18.             <div class="stats__label">za 7 dní</div>
  19.         </div>
  20.         <div class="stats__item">
  21.             <div class="stats__value">{{ stats.dealers|number_format(0, null, ' ') }}</div>
  22.             <div class="stats__label">prodejců</div>
  23.         </div>
  24.     </section>
  25.     <section class="tips">
  26.         <h2 class="section-title">Doporučené vozy</h2>
  27.         <div class="tips__grid">
  28.             {% for vehicle in recommendedVehicles %}
  29.                 {% include 'vehicle_tip/_tipCard.html.twig' with {
  30.                     vehicle: vehicle,
  31.                     trackTip: vehicle.id in tipVehicleIds,
  32.                     compact: true,
  33.                     autanetPartnerId: tipAutanetPartnerIds[vehicle.id]|default(null),
  34.                     recommendedPlacement: 'R01'
  35.                 } only %}
  36.             {% endfor %}
  37.         </div>
  38.     </section>
  39.     {% if partners %}
  40.         <section class="partners">
  41.             <h2 class="section-title">Partneři portálu</h2>
  42.             <div class="partners__row" id="partners-slider">
  43.                 {% for partner in partners %}
  44.                     <a class="partners__item"
  45.                        href="{{ partner.url }}"
  46.                        data-partner-id="{{ partner.id }}"
  47.                        data-autanet-partner-id="{{ partner.autanetPartner.id }}">
  48.                     <span class="partners__logo">
  49.                         <img src="{{ asset('img/partner/' ~ partner.logo) }}" alt="{{ partner.name }}" loading="lazy"
  50.                              width="150">
  51.                     </span>
  52.                         <span class="partners__name">{{ partner.name }}</span>
  53.                     </a>
  54.                 {% endfor %}
  55.             </div>
  56.         </section>
  57.     {% endif %}
  58.     <section class="grid">
  59.         <div>
  60.             <section class="models">
  61.                 <h2 class="section-title">Nejhledanější modely aut</h2>
  62.                 <div class="models__grid">
  63.                     <div class="models__col">
  64.                         <h3 class="models__brand">Škoda</h3>
  65.                         <ul class="models__list">
  66.                             <li><a href="/osobni-vozidla/skoda/octavia">Škoda Octavia</a></li>
  67.                             <li><a href="/osobni-vozidla/skoda/fabia">Škoda Fabia</a></li>
  68.                             <li><a href="/osobni-vozidla/skoda/kodiaq">Škoda Kodiaq</a></li>
  69.                             <li><a href="/osobni-vozidla/skoda/superb">Škoda Superb</a></li>
  70.                             <li><a href="/osobni-vozidla/skoda/karoq">Škoda Karoq</a></li>
  71.                         </ul>
  72.                     </div>
  73.                     <div class="models__col">
  74.                         <h3 class="models__brand">Volkswagen</h3>
  75.                         <ul class="models__list">
  76.                             <li><a href="/osobni-vozidla/volkswagen/passat">Volkswagen Passat</a></li>
  77.                             <li><a href="/osobni-vozidla/volkswagen/touran">Volkswagen Touran</a></li>
  78.                             <li><a href="/osobni-vozidla/volkswagen/tiguan">Volkswagen Tiguan</a></li>
  79.                             <li><a href="/osobni-vozidla/volkswagen/golf">Volkswagen Golf</a></li>
  80.                             <li><a href="/osobni-vozidla/volkswagen/caddy">Volkswagen Caddy</a></li>
  81.                         </ul>
  82.                     </div>
  83.                     <div class="models__col">
  84.                         <h3 class="models__brand">Ford</h3>
  85.                         <ul class="models__list">
  86.                             <li><a href="/osobni-vozidla/ford/s-max">Ford S-MAX</a></li>
  87.                             <li><a href="/osobni-vozidla/ford/kuga">Ford Kuga</a></li>
  88.                             <li><a href="/osobni-vozidla/ford/mondeo">Ford Mondeo</a></li>
  89.                             <li><a href="/osobni-vozidla/ford/focus">Ford Focus</a></li>
  90.                             <li><a href="/osobni-vozidla/ford/ranger">Ford Ranger</a></li>
  91.                         </ul>
  92.                     </div>
  93.                     <div class="models__col">
  94.                         <h3 class="models__brand">Další</h3>
  95.                         <ul class="models__list">
  96.                             <li><a href="/osobni-vozidla/audi/a6">Audi A6</a></li>
  97.                             <li><a href="/osobni-vozidla/dacia/duster">Dacia Duster</a></li>
  98.                             <li><a href="/osobni-vozidla/audi/a4">Audi A4</a></li>
  99.                             <li><a href="/osobni-vozidla/hyundai/tucson">Hyundai Tucson</a></li>
  100.                             <li><a href="/osobni-vozidla/bmw/x5">BMW X5</a></li>
  101.                         </ul>
  102.                     </div>
  103.                 </div>
  104.             </section>
  105.             <h2 class="section-title">Testy a recenze</h2>
  106.             {% for b in blogsTests %}
  107.                 {% if loop.first %}
  108.                     {% include 'blog/_blogBig.html.twig' with { b: b } %}
  109.                     <div id="adform_squarem"></div>
  110.                 {% else %}
  111.                     {% include 'blog/_blog.html.twig' with { b: b } %}
  112.                 {% endif %}
  113.             {% endfor %}
  114.             <div id="banner-mobile-container" class="banner-mobile" data-autanet-partner-banner-placement="B01"></div>
  115.             <div class="grid__buttons grid__buttons--left">
  116.                 <a class="button" href="{{ path('page_blog', { urlKind: 'testy-aut' }) }}">
  117.                     Zobrazit všechny testy a recenze
  118.                     <i class="icon icon-arrow-right"></i>
  119.                 </a>
  120.             </div>
  121.             <h2 class="section-title">Nejnovější články</h2>
  122.             {% for b in blogsLatest %}
  123.                 {% include 'blog/_blog.html.twig' with { b: b } %}
  124.             {% endfor %}
  125.             <div class="grid__buttons grid__buttons--left">
  126.                 <a class="button" href="{{ path('page_blog', { urlKind: 'vsechny-clanky' }) }}">
  127.                     Zobrazit všechny články
  128.                     <i class="icon icon-arrow-right"></i>
  129.                 </a>
  130.             </div>
  131.         </div>
  132.         <div>
  133.             <div id="adform_halfpage"></div>
  134.             <div id="banner-container" class="banner" data-autanet-partner-banner-placement="B01"></div>
  135.             {{ render(controller( 'App\\Controller\\BlogController::top' )) }}
  136.         </div>
  137.     </section>
  138.     <script>
  139.         (function () {
  140.             const items = document.querySelectorAll(
  141.                 '[data-recommended-placement="R01"][data-recommended-vehicle-id][data-autanet-partner-id]'
  142.             );
  143.             if (
  144.                 !items.length
  145.                 || !window.AutanetAnalytics
  146.                 || typeof window.AutanetAnalytics.withIdentity !== 'function'
  147.             ) {
  148.                 return;
  149.             }
  150.             function sendRecommendedEvent(item, eventType) {
  151.                 const vehicleId = item.dataset.recommendedVehicleId;
  152.                 const partnerId = item.dataset.autanetPartnerId;
  153.                 if (!vehicleId || !partnerId) {
  154.                     return;
  155.                 }
  156.                 window.AutanetAnalytics.withIdentity(function (identity) {
  157.                     if (!identity) {
  158.                         return;
  159.                     }
  160.                     const formData = new FormData();
  161.                     formData.append('event_type', eventType);
  162.                     formData.append('vehicle_id', vehicleId);
  163.                     formData.append('partner_id', partnerId);
  164.                     formData.append('placement', 'R01');
  165.                     formData.append(
  166.                         'device',
  167.                         window.matchMedia('(max-width: 766px)').matches
  168.                             ? 'mobile'
  169.                             : 'desktop'
  170.                     );
  171.                     formData.append('visitor_key', identity.visitorKey);
  172.                     formData.append('session_key', identity.sessionKey);
  173.                     formData.append('pageview_key', identity.pageviewKey);
  174.                     fetch('{{ path('app_analytics_event') }}', {
  175.                         method: 'POST',
  176.                         body: formData,
  177.                         keepalive: true
  178.                     }).catch(function () {
  179.                     });
  180.                 }, 5000);
  181.             }
  182.             items.forEach(function (item) {
  183.                 item.addEventListener('click', function () {
  184.                     sendRecommendedEvent(item, 'recommended_vehicle_click');
  185.                 });
  186.             });
  187.             if (typeof window.IntersectionObserver !== 'function') {
  188.                 return;
  189.             }
  190.             const impressionTimers = new Map();
  191.             const trackedVehicleIds = new Set();
  192.             function clearImpressionTimer(vehicleId) {
  193.                 const timer = impressionTimers.get(vehicleId);
  194.                 if (timer) {
  195.                     clearTimeout(timer);
  196.                     impressionTimers.delete(vehicleId);
  197.                 }
  198.             }
  199.             const observer = new IntersectionObserver(function (entries) {
  200.                 entries.forEach(function (entry) {
  201.                     const item = entry.target;
  202.                     const vehicleId = item.dataset.recommendedVehicleId;
  203.                     if (!vehicleId || trackedVehicleIds.has(vehicleId)) {
  204.                         return;
  205.                     }
  206.                     if (entry.isIntersecting && entry.intersectionRatio >= 0.5) {
  207.                         if (impressionTimers.has(vehicleId)) {
  208.                             return;
  209.                         }
  210.                         const timer = setTimeout(function () {
  211.                             impressionTimers.delete(vehicleId);
  212.                             if (trackedVehicleIds.has(vehicleId)) {
  213.                                 return;
  214.                             }
  215.                             trackedVehicleIds.add(vehicleId);
  216.                             sendRecommendedEvent(item, 'recommended_vehicle_impression');
  217.                         }, 1000);
  218.                         impressionTimers.set(vehicleId, timer);
  219.                         return;
  220.                     }
  221.                     clearImpressionTimer(vehicleId);
  222.                 });
  223.             }, {
  224.                 threshold: [0, 0.5, 1]
  225.             });
  226.             items.forEach(function (item) {
  227.                 observer.observe(item);
  228.             });
  229.         })();
  230.     </script>
  231.     <script>
  232.         (function () {
  233.             const slider = document.getElementById('partners-slider');
  234.             if (!slider) return;
  235.             const ids = new Set();
  236.             slider.querySelectorAll('[data-partner-id]').forEach(function (item) {
  237.                 ids.add(item.dataset.partnerId);
  238.             });
  239.             if (!ids.size) return;
  240.             const data = new FormData();
  241.             ids.forEach(function (id) {
  242.                 data.append('ids[]', id);
  243.             });
  244.             fetch('{{ path('app_partner_track_views') }}', {method: 'POST', body: data}).catch(function () {
  245.             });
  246.             slider.addEventListener('click', function (e) {
  247.                 const item = e.target.closest('[data-partner-id]');
  248.                 if (!item) return;
  249.                 navigator.sendBeacon('/partner/' + item.dataset.partnerId + '/click');
  250.                 const autanetPartnerId = item.dataset.autanetPartnerId;
  251.                 if (
  252.                     !autanetPartnerId
  253.                     || !window.AutanetAnalytics
  254.                     || typeof window.AutanetAnalytics.withIdentity !== 'function'
  255.                 ) {
  256.                     return;
  257.                 }
  258.                 window.AutanetAnalytics.withIdentity(function (identity) {
  259.                     if (!identity) {
  260.                         return;
  261.                     }
  262.                     const formData = new FormData();
  263.                     formData.append('event_type', 'logo_click');
  264.                     formData.append('partner_id', autanetPartnerId);
  265.                     formData.append(
  266.                         'device',
  267.                         window.matchMedia('(max-width: 766px)').matches
  268.                             ? 'mobile'
  269.                             : 'desktop'
  270.                     );
  271.                     formData.append('visitor_key', identity.visitorKey);
  272.                     formData.append('session_key', identity.sessionKey);
  273.                     formData.append('pageview_key', identity.pageviewKey);
  274.                     fetch('{{ path('app_analytics_event') }}', {
  275.                         method: 'POST',
  276.                         body: formData,
  277.                         keepalive: true
  278.                     }).catch(function () {
  279.                     });
  280.                 }, 5000);
  281.             });
  282.             if (
  283.                 !window.AutanetAnalytics
  284.                 || typeof window.AutanetAnalytics.withIdentity !== 'function'
  285.                 || typeof window.IntersectionObserver !== 'function'
  286.             ) {
  287.                 return;
  288.             }
  289.             const impressionTimers = new Map();
  290.             const trackedPartnerIds = new Set();
  291.             function clearImpressionTimer(partnerId) {
  292.                 const timer = impressionTimers.get(partnerId);
  293.                 if (timer) {
  294.                     clearTimeout(timer);
  295.                     impressionTimers.delete(partnerId);
  296.                 }
  297.             }
  298.             function trackLogoImpression(item) {
  299.                 const partnerId = item.dataset.autanetPartnerId;
  300.                 if (!partnerId || trackedPartnerIds.has(partnerId)) {
  301.                     return;
  302.                 }
  303.                 window.AutanetAnalytics.withIdentity(function (identity) {
  304.                     if (!identity || trackedPartnerIds.has(partnerId)) {
  305.                         return;
  306.                     }
  307.                     trackedPartnerIds.add(partnerId);
  308.                     const formData = new FormData();
  309.                     formData.append('event_type', 'logo_impression');
  310.                     formData.append('partner_id', partnerId);
  311.                     formData.append(
  312.                         'device',
  313.                         window.matchMedia('(max-width: 766px)').matches
  314.                             ? 'mobile'
  315.                             : 'desktop'
  316.                     );
  317.                     formData.append('visitor_key', identity.visitorKey);
  318.                     formData.append('session_key', identity.sessionKey);
  319.                     formData.append('pageview_key', identity.pageviewKey);
  320.                     fetch('{{ path('app_analytics_event') }}', {
  321.                         method: 'POST',
  322.                         body: formData,
  323.                         keepalive: true
  324.                     }).catch(function () {
  325.                     });
  326.                 }, 5000);
  327.             }
  328.             const observer = new IntersectionObserver(function (entries) {
  329.                 entries.forEach(function (entry) {
  330.                     const item = entry.target;
  331.                     const partnerId = item.dataset.autanetPartnerId;
  332.                     if (!partnerId || trackedPartnerIds.has(partnerId)) {
  333.                         return;
  334.                     }
  335.                     if (entry.isIntersecting && entry.intersectionRatio >= 0.5) {
  336.                         if (impressionTimers.has(partnerId)) {
  337.                             return;
  338.                         }
  339.                         const timer = setTimeout(function () {
  340.                             impressionTimers.delete(partnerId);
  341.                             trackLogoImpression(item);
  342.                         }, 1000);
  343.                         impressionTimers.set(partnerId, timer);
  344.                         return;
  345.                     }
  346.                     clearImpressionTimer(partnerId);
  347.                 });
  348.             }, {
  349.                 threshold: [0, 0.5, 1]
  350.             });
  351.             slider.querySelectorAll('[data-autanet-partner-id]').forEach(function (item) {
  352.                 observer.observe(item);
  353.             });
  354.         })();
  355.     </script>
  356. {% endblock %}