src/StartPlatz/Bundle/EventBundle/Resources/views/Default/event-single.tailwind.html.twig line 1

Open in your IDE?
  1. {% extends "@StartPlatzStyleBundle/base.tailwind.public.html.twig" %}
  2. {% set currentPath = app.request.get('_route') %}
  3. {# Language Detection - uses event.lang as default if set #}
  4. {% set lang = app.request.get('lang', event.lang|default('de'))|lower %}
  5. {% set isEnglish = lang == 'en' %}
  6. {# Select SEO content based on language with fallback #}
  7. {% set seoTitle = isEnglish and event.seoTitleEn ? event.seoTitleEn : event.seoTitle %}
  8. {% set seoDescription = isEnglish and event.seoDescriptionEn ? event.seoDescriptionEn : event.seoDescription %}
  9. {% set seoKeyword = isEnglish and event.seoKeywordEn ? event.seoKeywordEn : event.seoKeyword %}
  10. {% block metaData %}
  11.     {# Optimize meta description for archived events #}
  12.     {% if event.status == 'archive' %}
  13.         {% set archivePrefix = isEnglish ? 'Past event from ' ~ event.startDate|date('F j, Y') ~ ': ' : 'Vergangene Veranstaltung vom ' ~ event.startDate|date('d.m.Y') ~ ': ' %}
  14.         <meta name="description" content="{{ archivePrefix }}{{ seoDescription|slice(0, 140) }}">
  15.     {% else %}
  16.         <meta name="description" content="{{ seoDescription }}">
  17.     {% endif %}
  18.     <meta name="keywords" content="{{ seoKeyword }}">
  19.     <meta name="author" content="{{ event.trainer }}">
  20.     {% if app.environment == 'prod' %}
  21.         <meta name="robots" content="index,follow">
  22.         {% if event.seriesTag is not empty %}
  23.             <link rel="canonical" href="{{ path('event_series', {'seriesTag': event.seriesTag, 'lang': lang}) }}" />
  24.         {% else %}
  25.             <link rel="canonical" href="https://www.startplatz.de/event/{{ event.slug | url_encode }}{% if lang == 'en' %}?lang=en{% endif %}" />
  26.         {% endif %}
  27.         {# hreflang tags for bilingual support #}
  28.         {% if event.hasEnglishVersion %}
  29.             <link rel="alternate" hreflang="de" href="https://www.startplatz.de/event/{{ event.slug | url_encode }}?lang=de" />
  30.             <link rel="alternate" hreflang="en" href="https://www.startplatz.de/event/{{ event.slug | url_encode }}?lang=en" />
  31.             <link rel="alternate" hreflang="x-default" href="https://www.startplatz.de/event/{{ event.slug | url_encode }}" />
  32.         {% endif %}
  33.     {% else %}
  34.         <meta name="robots" content="noindex,nofollow">
  35.     {% endif %}
  36.     {# Open Graph with language support #}
  37.     <meta property="og:title" content="{{ seoTitle }}">
  38.     <meta property="og:description" content="{{ seoDescription }}">
  39.     <meta property="og:image" content="{{ event.imageLink }}">
  40.     <meta property="og:locale" content="{{ lang == 'en' ? 'en_US' : 'de_DE' }}">
  41.     {% if event.hasEnglishVersion %}
  42.         <meta property="og:locale:alternate" content="{{ lang == 'en' ? 'de_DE' : 'en_US' }}">
  43.     {% endif %}
  44.     {# Twitter Card #}
  45.     <meta name="twitter:card" content="summary">
  46.     <meta name="twitter:title" content="{{ seoTitle }}">
  47.     <meta name="twitter:description" content="{{ seoDescription }}">
  48.     <meta name="twitter:image" content="{{ event.imageLink }}">
  49. {% endblock %}
  50. {% block title %}{{ seoTitle|default(event.seoTitle) }}{% endblock %}
  51. {% block styles %}
  52. {#
  53.    ╔═══════════════════════════════════════════════════════════════════════╗
  54.    ║  DEFAULT STYLES - werden durch event.additionalCss überschrieben      ║
  55.    ║                                                                       ║
  56.    ║  Anpassbar via additionalCss (Beispiel Dark Theme):                   ║
  57.    ║  body { background-color: #0a0a0a; }                                  ║
  58.    ║  .bg-registration { background-color: #171717; }                      ║
  59.    ║  .registration-accent { --registration-accent: #3D9DD6; }             ║
  60.    ║  .bg-tags { background-color: #171717; }                              ║
  61.    ║  .bg-promote { background-color: #171717; }                           ║
  62.    ║  .bg-admin-section { background-color: #171717; }                     ║
  63.    ╚═══════════════════════════════════════════════════════════════════════╝
  64. #}
  65. <style>
  66.     /* Page Background - visible between sections */
  67.     body { background-color: #FFFFFF; }
  68.     /* Registration Section */
  69.     .bg-registration { background-color: #9632FF; }
  70.     .registration-accent { --registration-accent: #9632FF; }
  71.     /* Tags Section */
  72.     .bg-tags { background-color: #F3F4F6; }
  73.     /* Promote This Event Section */
  74.     .bg-promote { background-color: #F3F4F6; }
  75.     /* Admin Section */
  76.     .bg-admin-section { background-color: #F9FAFB; }
  77. </style>
  78. {% endblock %}
  79. {% block additionalHead %}
  80.     {# Custom CSS from Event #}
  81.     {% if event.additionalCss is not empty %}
  82.         <style>
  83.             {{ include(template_from_string(event.additionalCss), {
  84.                 'event': event,
  85.                 'batch': batch,
  86.                 'isMultiBatchEvent': isMultiBatchEvent
  87.             }) }}
  88.         </style>
  89.     {% endif %}
  90.     {# Meta Pixel tracking - PageView Event #}
  91.     {% if event.metaPixelId %}
  92.         <!-- Meta Pixel Code -->
  93.         <script>
  94.             !function(f,b,e,v,n,t,s)
  95.             {if(f.fbq)return;n=f.fbq=function(){n.callMethod?
  96.             n.callMethod.apply(n,arguments):n.queue.push(arguments)};
  97.             if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
  98.             n.queue=[];t=b.createElement(e);t.async=!0;
  99.             t.src=v;s=b.getElementsByTagName(e)[0];
  100.             s.parentNode.insertBefore(t,s)}(window, document,'script',
  101.             'https://connect.facebook.net/en_US/fbevents.js');
  102.             fbq('init', '{{ event.metaPixelId }}');
  103.             fbq('track', 'PageView');
  104.         </script>
  105.         <noscript>
  106.             <img height="1" width="1" style="display:none"
  107.                  src="https://www.facebook.com/tr?id={{ event.metaPixelId }}&ev=PageView&noscript=1"/>
  108.         </noscript>
  109.         <!-- End Meta Pixel Code -->
  110.     {% endif %}
  111. {% endblock %}
  112. {% block content %}
  113.     {# Select content based on language with fallback to German #}
  114.     {% set navbar = isEnglish and event.navbarEn ? event.navbarEn : event.navbar %}
  115.     {% set teaser = isEnglish and event.teaserEn ? event.teaserEn : event.teaser %}
  116.     {% set content = isEnglish and event.contentEn ? event.contentEn : event.content %}
  117.     {% set contentTwig = isEnglish and event.contentTwigEn ? event.contentTwigEn : event.contentTwig %}
  118.     {% set postCtaContent = isEnglish and event.postCtaContentEn ? event.postCtaContentEn : event.postCtaContent %}
  119.     {# Navbar Section #}
  120.     {% if navbar %}
  121.         {{ include(template_from_string(navbar), {
  122.             'event': event,
  123.             'batch': batch,
  124.             'isMultiBatchEvent': isMultiBatchEvent,
  125.             'lang': lang,
  126.             'isEnglish': isEnglish,
  127.             'phrases': phrases
  128.         }) }}
  129.     {% endif %}
  130.     {# Teaser Section #}
  131.     {% if teaser %}
  132.         {{ include(template_from_string(teaser), {
  133.             'event': event,
  134.             'batch': batch,
  135.             'isMultiBatchEvent': isMultiBatchEvent,
  136.             'lang': lang,
  137.             'isEnglish': isEnglish,
  138.             'phrases': phrases
  139.         }) }}
  140.     {% endif %}
  141.     {# Archive Banner (SEO-optimized: no redirect) #}
  142.     {% include '@StartPlatzEvent/Default/_event.part.archive-banner.html.twig' with {
  143.         'event': event,
  144.         'isEnglish': isEnglish
  145.     } %}
  146.     {# Flash Messages (Notices) #}
  147.     {% if app.session.flashbag.has('notice') %}
  148.         <section class="bg-gray-100 py-3">
  149.             <div class="max-w-4xl mx-auto px-4">
  150.                 {% for flashMessage in app.session.flashbag.get('notice') %}
  151.                     <div class="text-center py-3 px-4 rounded-lg mb-2 {% if 'SUCCESS' in flashMessage %}bg-green-100 text-green-800{% elseif 'ERROR' in flashMessage %}bg-red-100 text-red-800{% else %}bg-gray-200 text-gray-800{% endif %}">
  152.                         {{ flashMessage|replace({'SUCCESS': ''})|raw }}
  153.                     </div>
  154.                 {% endfor %}
  155.                 {{ editFeedback|raw }}
  156.             </div>
  157.         </section>
  158.     {% endif %}
  159.     {# Application Status Feedback #}
  160.     {% if batch and application and application.applicationStatus %}
  161.         {% include "@StartPlatzEvent/Default/_event.part.feedback-application-process.html.twig" %}
  162.     {% endif %}
  163.     {# Main Content Section #}
  164.     {% if content %}
  165.         {{ include(template_from_string(content), {
  166.             'event': event,
  167.             'batch': batch,
  168.             'isMultiBatchEvent': isMultiBatchEvent,
  169.             'lang': lang,
  170.             'isEnglish': isEnglish,
  171.             'phrases': phrases
  172.         }) }}
  173.     {% endif %}
  174.     {# Dynamic Twig Content #}
  175.     {% if contentTwig %}
  176.         {{ include(template_from_string(contentTwig), {
  177.             'event': event,
  178.             'batch': batch,
  179.             'isMultiBatchEvent': isMultiBatchEvent,
  180.             'futureBatches': futureBatches,
  181.             'allBatches': allBatches,
  182.             'lang': lang,
  183.             'isEnglish': isEnglish,
  184.             'phrases': phrases
  185.         }) }}
  186.     {% endif %}
  187.     {# Registration Section #}
  188.     {% include "@StartPlatzEvent/Default/_registration.batch.tailwind.html.twig" with {
  189.         'event': event,
  190.         'batch': batch,
  191.         'batchIsOpen': batchIsOpen,
  192.         'application': application,
  193.         'settings': settings,
  194.         'isMultiBatchEvent': isMultiBatchEvent,
  195.         'futureBatches': futureBatches,
  196.         'lang': lang,
  197.         'isEnglish': isEnglish,
  198.         'phrases': phrases
  199.     } %}
  200.     {# Tags Section #}
  201.     {% include "@StartPlatzEvent/Default/_section.tags.tailwind.html.twig" %}
  202.     {# Post CTA Content #}
  203.     {% if postCtaContent %}
  204.         {{ include(template_from_string(postCtaContent), {
  205.             'event': event,
  206.             'batch': batch,
  207.             'isMultiBatchEvent': isMultiBatchEvent,
  208.             'lang': lang,
  209.             'isEnglish': isEnglish,
  210.             'phrases': phrases
  211.         }) }}
  212.     {% endif %}
  213.     {# Speakers Section #}
  214.     {% if speakers %}
  215.         {% include "@StartPlatzEvent/Default/_section.speakers-and-partners.winter-2025.html.twig" %}
  216.     {% endif %}
  217.     {# Past Batches Section #}
  218.     {% include "@StartPlatzEvent/Default/_section.past-batches.html.twig" with {
  219.         'event': event,
  220.         'isMultiBatchEvent': isMultiBatchEvent,
  221.         'pastBatches': pastBatches,
  222.         'isEnglish': isEnglish
  223.     } %}
  224.     {# Promote This Event (for logged-in users) #}
  225.     {% if app.user and batch %}
  226.         {% include "@StartPlatzEvent/Default/_section.promote-this-event.tailwind.html.twig" %}
  227.     {% endif %}
  228.     {# Participant List Access #}
  229.     {% if app.user is defined and application is defined and application is not null and application.canReadList %}
  230.         <section class="bg-gray-100 py-6">
  231.             <div class="max-w-4xl mx-auto px-4 text-center">
  232.                 <span class="text-gray-700">{{ isEnglish ? 'You can view the participant list here' : 'Hier kannst Du die Teilnehmerliste einsehen' }}</span>
  233.                 <a class="ml-2 inline-block px-4 py-2 border border-gray-800 rounded-lg hover:bg-gray-800 hover:text-white transition-colors" href="{{ path('admin_event_participants', {id: event.id} ) }}">
  234.                     participants
  235.                 </a>
  236.             </div>
  237.         </section>
  238.     {% endif %}
  239.     {# Admin Section #}
  240.     {% if app.user is defined %}
  241.         {% if app.user.admin is defined and app.user.admin %}
  242.             {% include "@StartPlatzEvent/Default/_section.startplatz-admin-section.tailwind.html.twig" %}
  243.         {% endif %}
  244.     {% endif %}
  245.     {# Language Switcher Component #}
  246.     {% if event.hasEnglishVersion %}
  247.         <div class="fixed top-32 right-5 z-50" x-data="{ hover: false }">
  248.             <div class="bg-white border-2 border-sp-purple rounded-full px-4 py-2 shadow-lg flex items-center gap-2">
  249.                 <a href="?lang=de" class="flex items-center gap-1 px-2 py-1 rounded-full transition-all {{ lang == 'de' ? 'bg-sp-purple text-white' : 'text-gray-800 hover:bg-gray-100' }}" title="Deutsch">
  250.                     <span class="text-xl">DE</span>
  251.                 </a>
  252.                 <span class="text-gray-300">|</span>
  253.                 <a href="?lang=en" class="flex items-center gap-1 px-2 py-1 rounded-full transition-all {{ lang == 'en' ? 'bg-sp-purple text-white' : 'text-gray-800 hover:bg-gray-100' }}" title="English">
  254.                     <span class="text-xl">EN</span>
  255.                 </a>
  256.             </div>
  257.         </div>
  258.     {% endif %}
  259. {% endblock %}
  260. {% block javascripts %}
  261.     {% if event.additionalJs is not empty %}
  262.         <script>
  263.             var eventData = {
  264.                 id: {{ event.id }},
  265.                 title: "{{ event.title|e('js') }}",
  266.                 slug: "{{ event.slug|e('js') }}",
  267.                 lang: "{{ lang }}",
  268.                 isEnglish: {{ isEnglish ? 'true' : 'false' }}
  269.             };
  270.             {{ include(template_from_string(event.additionalJs), {
  271.                 'event': event,
  272.                 'batch': batch,
  273.                 'lang': lang,
  274.                 'isEnglish': isEnglish
  275.             })|raw }}
  276.         </script>
  277.     {% endif %}
  278. {% endblock %}