templates/Front/Event/events.html.twig line 1

Open in your IDE?
  1. {% extends "Global/layout.html.twig" %}
  2. {% if category != "all" %}
  3.     {% set pagetitle = category.name %}
  4. {% else %}
  5.     {% set pagetitle = 'Events'|trans %}
  6. {% endif %}
  7. {% block title %}{{pagetitle}}{% endblock %}
  8. {% block stylesheets %}
  9.     {{ encore_entry_link_tags('events') }}
  10. {% endblock %}
  11. {% block content %}
  12.     {% if category != "all" %}
  13.         {% set navigation = [{"events": ("Events"|trans), "current" : (pagetitle)}] %}
  14.     {% else %}
  15.         {% set navigation = [{"current" : (pagetitle)}] %}
  16.     {% endif %}
  17.     {% include "Global/navigation.html.twig" with navigation %}
  18.     <section class="section-content bg-white padding-y">
  19.         <div class="{{ services.getSetting("app_layout") }}">
  20.             {% set eventsoncalendar = [] %}
  21.             {% set eventsonmap = [] %}
  22.             {% for event in events %}
  23.                 {% for eventdate in event.eventdates %}
  24.                     {% if eventdate.isOnSale %}
  25.                         {% if eventdate.venue and services.getSetting("show_map_button") == "yes" %}
  26.                             {% if eventdate.venue.lat and eventdate.venue.lng %}
  27.                                 {% if eventsonmap|length == 0 %}
  28.                                     {% set eventsonmap = eventsonmap|merge([{"name": event.name, "image": event.imageName ? asset(event.getImagePath) : event.getImagePlaceholder, "address": (eventdate.venue.name ~ ": " ~eventdate.venue.stringifyAddress),"date": (eventdate.startdate|localizeddate('none', 'none', app.request.locale, date_timezone, date_format)), "price": (eventdate.isFree ? "Free"|trans : eventdate.getCheapestTicket.getSalePrice), "lat":eventdate.venue.lat, "lng":eventdate.venue.lng, "link": (path('event', { slug: event.slug })) }]) %}
  29.                                 {% else %}
  30.                                     {% for eventonmap in eventsonmap %}
  31.                                         {% if eventonmap.lat != eventdate.venue.lat and eventonmap.lng != eventdate.venue.lng %}
  32.                                             {% set eventsonmap = eventsonmap|merge([{"name": event.name, "image": event.imageName ? asset(event.getImagePath) : event.getImagePlaceholder, "address": (eventdate.venue.name ~ ": " ~eventdate.venue.stringifyAddress),"date": (eventdate.startdate|localizeddate('none', 'none', app.request.locale, date_timezone, date_format)), "price": (eventdate.isFree ? "Free"|trans : eventdate.getCheapestTicket.getSalePrice), "lat":eventdate.venue.lat, "lng":eventdate.venue.lng, "link": (path('event', { slug: event.slug })) }]) %}
  33.                                         {% endif %}
  34.                                     {% endfor %}
  35.                                 {% endif %}
  36.                             {% endif %}
  37.                         {% endif %}
  38.                         {% if services.getSetting("show_calendar_button") == "yes" %}
  39.                             {% set eventsoncalendar = eventsoncalendar|merge([{"title": event.name, "start":eventdate.startdate|date('Y-m-d H:i'), "end": (eventdate.enddate ? eventdate.enddate|date('Y-m-d H:i') : ''), "url": (path('event', {slug : event.slug})) }]) %}
  40.                         {% endif %}
  41.                     {% endif %}
  42.                 {% endfor %}
  43.             {% endfor %}
  44.             {% if eventsonmap|length > 0 and services.getSetting("show_map_button") == "yes" and google_maps_api_key != "" %}
  45.                 <div id="events-map" data-pin-path="{{ asset('assets/img/icons/pin.png') }}" data-events="{{ eventsonmap|json_encode() }}" class="mb-4 collapse vh-90"></div>
  46.             {% endif %}
  47.             {% if eventsoncalendar|length > 0 and services.getSetting("show_calendar_button") == "yes" %}
  48.                 <div id="events-calendar" data-default-date="{{ "now"|date('Y-m-d') }}" data-events="{{ eventsoncalendar|json_encode() }}" class="mb-4 collapse"></div>
  49.             {% endif %}
  50.             <div class="box shadow-none bg-gray mb-4">
  51.                 <div class="row">
  52.                     <div class="col-sm-12 col-lg-6 text-center text-lg-left mb-3 mb-lg-0">
  53.                         <span class="center-lg-y text-muted">{{ "%resultsCount% event(s) found"|trans({'%resultsCount%': events.getTotalItemCount}) }}</span>
  54.                     </div>
  55.                     {% if events.getTotalItemCount > 0 %}
  56.                         <div class="col-sm-12 col-lg-6 text-center text-lg-right">
  57.                             {% if eventsonmap|length > 0 and services.getSetting("show_map_button") == "yes" and google_maps_api_key != "" %}
  58.                                 <a href="#events-map" class="btn btn-primary has-tooltip" data-toggle="collapse" title="{{"Show events on map"|trans}}" aria-expanded="false" aria-controls="events-map"><i class="fas fa-map-marked-alt fa-fw"></i></a>
  59.                                 {% endif %}
  60.                                 {% if eventsoncalendar|length > 0 and services.getSetting("show_calendar_button") == "yes" %}
  61.                                 <a href="#events-calendar" class="btn btn-primary has-tooltip" data-toggle="collapse" title="{{"Show events calendar"|trans}}" aria-expanded="false" aria-controls="events-calendar"><i class="far fa-calendar fa-fw"></i></a>
  62.                                 {% endif %}
  63.                                 {% if services.getSetting("show_rss_feed_button") == "yes" %}
  64.                                 <a href="{{ services.getSetting("website_url")~"/rss" }}" class="btn btn-primary" data-toggle="tooltip" title="{{"Events RSS feed"|trans}}" rel="noopener" target="_blank"><i class="fas fa-rss fa-fw"></i></a>
  65.                                 {% endif %}
  66.                         </div>
  67.                     {% endif %}
  68.                 </div>
  69.             </div>
  70.             <div class="row">
  71.                 <aside class="col-lg-3 order-2 order-lg-1">
  72.                     <div class="card card-filter">
  73.                         <form id="filter-form" method="get">
  74.                             <article class="card-group-item">
  75.                                 <header class="card-header">
  76.                                     <a href="#" data-toggle="collapse" data-target="#filter-keyword">
  77.                                         <i class="icon-action fa fa-chevron-down"></i>
  78.                                         <h6 class="title">{{ "Keyword"|trans }}</h6>
  79.                                     </a>
  80.                                 </header>
  81.                                 <div class="filter-content collapse show" id="filter-keyword">
  82.                                     <div class="card-body">
  83.                                         <input id="keyword" name="keyword" type="text" class="form-control" value="{{ app.request.get('keyword') }}">
  84.                                     </div>
  85.                                 </div>
  86.                             </article>
  87.                             {% if services.getSetting("show_category_filter") == "yes" %}
  88.                                 <article class="card-group-item">
  89.                                     <header class="card-header">
  90.                                         <a href="#" data-toggle="collapse" data-target="#filter-category">
  91.                                             <i class="icon-action fa fa-chevron-down"></i>
  92.                                             <h6 class="title">{{ "Category"|trans }}</h6>
  93.                                         </a>
  94.                                     </header>
  95.                                     <div class="filter-content collapse show" id="filter-category">
  96.                                         <div class="card-body">
  97.                                             <select id="category" name="category" class="select2" data-sort-options="1">
  98.                                                 <option value="">&nbsp;</option>
  99.                                                 {% for category in services.getCategories({}).getQuery().getResult() %}
  100.                                                     <option value="{{ category.slug }}">{{ category.name }}</option>
  101.                                                 {% endfor %}
  102.                                             </select>
  103.                                         </div>
  104.                                     </div>
  105.                                 </article>
  106.                             {% endif %}
  107.                             {% if services.getSetting("show_location_filter") == "yes" %}
  108.                                 <article class="card-group-item">
  109.                                     <header class="card-header">
  110.                                         <a href="#" data-toggle="collapse" data-target="#filter-location">
  111.                                             <i class="icon-action fa fa-chevron-down"></i>
  112.                                             <h6 class="title">{{ "Location"|trans }}</h6>
  113.                                         </a>
  114.                                     </header>
  115.                                     <div class="filter-content collapse show" id="filter-location">
  116.                                         <div class="card-body">
  117.                                             <div class="custom-control custom-checkbox form-check-input">
  118.                                                 <div class="form-check mb-4 filter-online-container">
  119.                                                     <input type="checkbox" class="custom-control-input" id="filter-online-only" name="onlineonly" value="1">
  120.                                                     <label class="custom-control-label" for="filter-online-only">{{ "Online events only"|trans }}</label>
  121.                                                 </div>
  122.                                             </div>
  123.                                             <div class="location-based-filters">
  124.                                                 {% set userLocation = services.locateUser() %}
  125.                                                 {% if userLocation %}
  126.                                                     <div class="custom-control custom-checkbox form-check-input">
  127.                                                         <div class="form-check mb-4">
  128.                                                             <input type="checkbox" class="custom-control-input" id="filter-local-only" name="localonly" value="1">
  129.                                                             <label class="custom-control-label" for="filter-local-only">{{ "Local events only"|trans }}</label>
  130.                                                         </div>
  131.                                                     </div>
  132.                                                     <p id="user-country" class="text-muted">{{ "Events in %countryname%"|trans({"%countryname%" : userLocation['country'].name}) }} <span class="flag flag-{{userLocation['country'].code|lower}} ml-2"></span></p>
  133.                                                     {% endif %}
  134.                                                 <div id="filter-country-container" class="mt-4">
  135.                                                     <label for="country">{{ "Country"|trans }}</label>
  136.                                                     <select id="country" class="select2" name="country" data-sort-options="1">
  137.                                                         <option value="">&nbsp;</option>
  138.                                                         {% for country in services.getCountries({}).getQuery().getResult() %}
  139.                                                             <option value="{{ country.slug }}">{{ country.name }}</option>
  140.                                                         {% endfor %}
  141.                                                     </select>
  142.                                                 </div>
  143.                                                 <div id="filter-location-container" class="mt-4">
  144.                                                     <label for="location">{{ "State / City"|trans }}</label>
  145.                                                     <input id="location" name="location" type="text" class="form-control" value="{{ app.request.get('location') }}">
  146.                                                 </div>
  147.                                             </div>
  148.                                         </div>
  149.                                     </div>
  150.                                 </article>
  151.                             {% endif %}
  152.                             {% if services.getSetting("show_date_filter") == "yes" %}
  153.                                 <article class="card-group-item">
  154.                                     <header class="card-header">
  155.                                         <a href="#" data-toggle="collapse" data-target="#filter-date">
  156.                                             <i class="icon-action fa fa-chevron-down"></i>
  157.                                             <h6 class="title">{{ "Date"|trans }}</h6>
  158.                                         </a>
  159.                                     </header>
  160.                                     <div class="filter-content collapse show" id="filter-date">
  161.                                         <div class="card-body">
  162.                                             <div class="form-check">
  163.                                                 <div class="float-left custom-control custom-radio form-check-input">
  164.                                                     <input type="radio" class="custom-control-input" id="date-today" name="startdate" value="today">
  165.                                                     <label class="custom-control-label" for="date-today">{{ "Today"|trans }}</label>
  166.                                                 </div>
  167.                                                 <span class="float-right form-check-label">
  168.                                                     <span class="badge badge-light round">{{ services.getEvents({"count": true, "startdate" : ("now"|date("Y-m-d"))}).getQuery().getSingleScalarResult() }}</span>
  169.                                                 </span>
  170.                                                 <div class="clearfix"></div>
  171.                                             </div>
  172.                                             <div class="form-check">
  173.                                                 <div class="float-left custom-control custom-radio form-check-input">
  174.                                                     <input type="radio" class="custom-control-input" id="date-tomorrow" name="startdate" value="tomorrow">
  175.                                                     <label class="custom-control-label" for="date-tomorrow">{{ "Tomorrow"|trans }}</label>
  176.                                                 </div>
  177.                                                 <span class="float-right form-check-label">
  178.                                                     <span class="badge badge-light round">{{ services.getEvents({"count": true, "startdate" : ("now"|date_modify("+1 day")|date("Y-m-d"))}).getQuery().getSingleScalarResult() }}</span>
  179.                                                 </span>
  180.                                                 <div class="clearfix"></div>
  181.                                             </div>
  182.                                             <div class="form-check">
  183.                                                 <div class="float-left custom-control custom-radio form-check-input">
  184.                                                     <input type="radio" class="custom-control-input" id="date-thisweekend" name="startdate" value="thisweekend">
  185.                                                     <label class="custom-control-label" for="date-thisweekend">
  186.                                                         {{ "This weekend"|trans }}
  187.                                                     </label>
  188.                                                 </div>
  189.                                                 <span class="float-right form-check-label">
  190.                                                     <span class="badge badge-light round">{{ services.getEvents({"count": true, "startdatemin" : ("now"|date_modify("saturday this week")|date("Y-m-d")), "startdatemax" : ("now"|date_modify("sunday this week")|date("Y-m-d"))}).getQuery().getSingleScalarResult() }}</span>
  191.                                                 </span>
  192.                                                 <div class="clearfix"></div>
  193.                                             </div>
  194.                                             <div class="form-check">
  195.                                                 <div class="float-left custom-control custom-radio form-check-input">
  196.                                                     <input type="radio" class="custom-control-input" id="date-thisweek" name="startdate" value="thisweek">
  197.                                                     <label class="custom-control-label" for="date-thisweek">
  198.                                                         {{ "This week"|trans }}
  199.                                                     </label>
  200.                                                 </div>
  201.                                                 <span class="float-right form-check-label">
  202.                                                     <span class="badge badge-light round">{{ services.getEvents({"count": true, "startdatemin" : ("now"|date_modify("monday this week")|date("Y-m-d")), "startdatemax" : ("now"|date_modify("sunday this week")|date("Y-m-d"))}).getQuery().getSingleScalarResult() }}</span>
  203.                                                 </span>
  204.                                                 <div class="clearfix"></div>
  205.                                             </div>
  206.                                             <div class="form-check">
  207.                                                 <div class="float-left custom-control custom-radio form-check-input">
  208.                                                     <input type="radio" class="custom-control-input" id="date-nextweek" name="startdate" value="nextweek">
  209.                                                     <label class="custom-control-label" for="date-nextweek">
  210.                                                         {{ "Next week"|trans }}
  211.                                                     </label>
  212.                                                 </div>
  213.                                                 <span class="float-right form-check-label">
  214.                                                     <span class="badge badge-light round">{{ services.getEvents({"count": true, "startdatemin" : ("now"|date_modify("monday next week")|date("Y-m-d")), "startdatemax" : ("now"|date_modify("sunday next week")|date("Y-m-d"))}).getQuery().getSingleScalarResult() }}</span>
  215.                                                 </span>
  216.                                                 <div class="clearfix"></div>
  217.                                             </div>
  218.                                             <div class="form-check">
  219.                                                 <div class="float-left custom-control custom-radio form-check-input">
  220.                                                     <input type="radio" class="custom-control-input" id="date-thismonth" name="startdate" value="thismonth">
  221.                                                     <label class="custom-control-label" for="date-thismonth">
  222.                                                         {{ "This month"|trans }}
  223.                                                     </label>
  224.                                                 </div>
  225.                                                 <span class="float-right form-check-label">
  226.                                                     <span class="badge badge-light round">{{ services.getEvents({"count": true, "startdatemin" : ("now"|date("Y-m-01")), "startdatemax" : ("now"|date("Y-m-t"))}).getQuery().getSingleScalarResult() }}</span>
  227.                                                 </span>
  228.                                                 <div class="clearfix"></div>
  229.                                             </div>
  230.                                             <div class="form-check">
  231.                                                 <div class="float-left custom-control custom-radio form-check-input">
  232.                                                     <input type="radio" class="custom-control-input" id="date-nextmonth" name="startdate" value="nextmonth">
  233.                                                     <label class="custom-control-label" for="date-nextmonth">
  234.                                                         {{ "Next month"|trans }}
  235.                                                     </label>
  236.                                                 </div>
  237.                                                 <span class="float-right form-check-label">
  238.                                                     <span class="badge badge-light round">{{ services.getEvents({"count": true, "startdatemin" : ("now"|date_modify("+1 month")|date("Y-m-01")), "startdatemax" : ("now"|date_modify("+1 month")|date("Y-m-t"))}).getQuery().getSingleScalarResult() }}</span>
  239.                                                 </span>
  240.                                                 <div class="clearfix"></div>
  241.                                             </div>
  242.                                             <div class="form-check">
  243.                                                 <div class="float-left custom-control custom-radio form-check-input">
  244.                                                     <input type="radio" class="custom-control-input datepicker" id="date-pickadate" name="startdate" value="all">
  245.                                                     <label class="custom-control-label" for="date-pickadate">
  246.                                                         {{ "Pick a date"|trans }}
  247.                                                     </label>
  248.                                                 </div>
  249.                                                 <div class="clearfix"></div>
  250.                                             </div>
  251.                                         </div>
  252.                                     </div>
  253.                                 </article>
  254.                             {% endif %}
  255.                             {% if services.getSetting("show_ticket_price_filter") == "yes" %}
  256.                                 <article class="card-group-item">
  257.                                     <header class="card-header">
  258.                                         <a href="#" data-toggle="collapse" data-target="#filter-price">
  259.                                             <i class="icon-action fa fa-chevron-down"></i>
  260.                                             <h6 class="title">{{ "Ticket price"|trans }}</h6>
  261.                                         </a>
  262.                                     </header>
  263.                                     <div class="filter-content collapse show" id="filter-price">
  264.                                         <div class="card-body">
  265.                                             <div class="custom-control custom-checkbox form-check-input ml-0 mb-4">
  266.                                                 <input type="checkbox" class="custom-control-input" id="free-events-only" name="freeonly" value="1">
  267.                                                 <label class="custom-control-label" for="free-events-only">
  268.                                                     {{ "Free events only"|trans }}
  269.                                                 </label>
  270.                                             </div>
  271.                                             <div class="events-price-range-slider-wrapper">
  272.                                                 <div class="range-slider mb-3" data-min="0" data-max="10000" data-start-left="{{ app.request.get('pricemin') ?? "0" }}" data-start-right="{{ app.request.get('pricemax') ?? "10000" }}"></div>
  273.                                                 <div class="row ranger-slider-inputs">
  274.                                                     <div class="col-12 col-sm-6">
  275.                                                         <label for="pricemin">{{"Min"|trans }}</label>
  276.                                                         <div class="input-group">
  277.                                                             <div class="input-group-prepend">
  278.                                                                 <span class="input-group-text">{{ services.getSetting('currency_symbol') }}</span>
  279.                                                             </div>
  280.                                                             <input id="pricemin" name="pricemin" type="text" class="form-control range-slider-min-input" value="{{ app.request.get('pricemin') }}" placeholder="{{ "Min"|trans }}">
  281.                                                         </div>
  282.                                                     </div>
  283.                                                     <div class="col-12 col-sm-6">
  284.                                                         <label for="pricemax">{{"Max"|trans }}</label>
  285.                                                         <div class="input-group">
  286.                                                             <div class="input-group-prepend">
  287.                                                                 <span class="input-group-text">{{ services.getSetting('currency_symbol') }}</span>
  288.                                                             </div>
  289.                                                             <input id="pricemax" name="pricemax" type="text" class="form-control range-slider-max-input" value="{{ app.request.get('pricemax') }}" placeholder="{{ "Max"|trans }}">
  290.                                                         </div>
  291.                                                     </div>
  292.                                                 </div>
  293.                                             </div>
  294.                                         </div>
  295.                                     </div>
  296.                                 </article>
  297.                             {% endif %}
  298.                             {% if services.getSetting("show_audience_filter") == "yes" %}
  299.                                 <article class="card-group-item">
  300.                                     <header class="card-header">
  301.                                         <a href="#" data-toggle="collapse" data-target="#filter-audience">
  302.                                             <i class="icon-action fa fa-chevron-down"></i>
  303.                                             <h6 class="title">{{"Audience"|trans }}</h6>
  304.                                         </a>
  305.                                     </header>
  306.                                     <div class="filter-content collapse show" id="filter-audience">
  307.                                         <div class="card-body">
  308.                                             <div class="btn-group btn-group-toggle" data-toggle="buttons">
  309.                                                 {% for audience in services.getAudiences({}).getQuery().getResult() %}
  310.                                                     <label class="btn btn-light btn-sm py-2 px-3" data-toggle="tooltip" title="{{ audience.name }}">
  311.                                                         <input type="radio" name="audience" id="{{ audience.slug }}" value="{{ audience.slug }}">
  312.                                                         <img src="{{ asset(audience.getImagePath) }}" class="img-15-15" alt="{{ audience.name }}">
  313.                                                     </label>
  314.                                                 {% endfor %}
  315.                                             </div>
  316.                                         </div>
  317.                                     </div>
  318.                                 </article>
  319.                             {% endif %}
  320.                             <article class="card-group-item">
  321.                                 <div class="card-body">
  322.                                     <button id="search-button" class="btn btn-block btn-outline-primary"><i class="fas fa-search" type="button"></i> {{ "Search"|trans }}</button>
  323.                                 </div>
  324.                             </article>
  325.                         </form>
  326.                     </div>
  327.                     {% if services.getSetting("newsletter_enabled") == "yes" and services.getSetting("mailchimp_api_key") and services.getSetting("mailchimp_list_id") %}
  328.                         {% include "Global/newsletter-box.html.twig" %}
  329.                     {% endif %}
  330.                 </aside>
  331.                 <div class="col-lg-9 order-1 order-lg-2">
  332.                     {% if events.getTotalItemCount > 0 %}
  333.                         <div class="row">
  334.                             {% for event in events %}
  335.                                 <div class="col-12 col-sm-6 col-lg-6 mb-3">
  336.                                     {% include "Global/event-card.html.twig" with {event: event} %}
  337.                                 </div>
  338.                             {% endfor %}
  339.                         </div>
  340.                     {% else %}
  341.                         {% include "Global/message.html.twig" with { type: "info", message: ('No events found'|trans), icon: "fas fa-exclamation-circle" } %}
  342.                     {% endif %}
  343.                     {{ knp_pagination_render(events, null, {}, {'align': 'center'}) }}
  344.                 </div>
  345.             </div>
  346.         </div>
  347.     </section>
  348. {% endblock %}
  349. {% block javascripts %}
  350. <script>
  351. document.addEventListener('DOMContentLoaded', (event) => {
  352.     const form = document.getElementById('filter-form');
  353.     const searchButton = document.getElementById('search-button');
  354.     searchButton.addEventListener('click', async (event) => {
  355.         // Prevent form submission
  356.         event.preventDefault();
  357.         // Collect all input values
  358.         const formData = new FormData(form);
  359.         const formValues = {};
  360.         formData.forEach((value, key) => {
  361.             formValues[key] = value;
  362.         });
  363.         // Log form values to the console
  364.         console.log(formValues);
  365.         try {
  366.             // Load the external JS file
  367.             await fetch('{{ asset("assets/ll_assets/assets/js/tracardi.js") }}')
  368.                 .then(response => {
  369.                     if (!response.ok) {
  370.                         throw new Error('Network response was not ok');
  371.                     }
  372.                     return response.text();
  373.                 })
  374.                 .then(scriptContent => {
  375.                     const scriptElement = document.createElement('script');
  376.                     scriptElement.text = scriptContent;
  377.                     document.body.appendChild(scriptElement);
  378.                 });
  379.             // Track the event
  380.             await new Promise((resolve, reject) => {
  381.                 try {
  382.                     window.tracker.track('Search for events', {
  383.                         Action: 'Client',
  384.                         values: formValues
  385.                     });
  386.                     resolve();
  387.                 } catch (error) {
  388.                     reject(error);
  389.                 }
  390.             });
  391.             // Submit the form if everything is successful
  392.             form.submit();
  393.         } catch (error) {
  394.             console.error('Error:', error);
  395.             console.error('An error occurred.');
  396.         }
  397.     });
  398. });
  399. </script>
  400.     {{ encore_entry_script_tags('events') }}
  401.     {% if services.getSetting("show_map_button") == "yes" and google_maps_api_key != "" %}
  402.         <script async defer src="https://maps.googleapis.com/maps/api/js?key={{google_maps_api_key}}&callback=initMap" integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC">
  403.         </script>
  404.         {% include "Global/event-info-box.html.twig" %}
  405.     {% endif %}
  406. {% endblock %}