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

Open in your IDE?
  1. {% extends "@StartPlatzStyleBundle/Bootstrap4/base.homepage.event-lp.html.twig" %}
  2. {% import "@StartPlatzEventBundle/Admin/_macros.bs4.html.twig" as layout %}
  3. {% set currentPath = app.request.get('_route') %}
  4. {% block metaData %}
  5.     {# Language Detection for SEO - uses event.lang as default if set #}
  6.     {% set lang = app.request.get('lang', event.lang|default('de'))|lower %}
  7.     {% set isEnglish = lang == 'en' %}
  8.     {# Select SEO content based on language with fallback #}
  9.     {% set seoTitle = isEnglish and event.seoTitleEn ? event.seoTitleEn : event.seoTitle %}
  10.     {% set seoDescription = isEnglish and event.seoDescriptionEn ? event.seoDescriptionEn : event.seoDescription %}
  11.     {% set seoKeyword = isEnglish and event.seoKeywordEn ? event.seoKeywordEn : event.seoKeyword %}
  12.     {# Optimize meta description for archived events #}
  13.     {% if event.status == 'archive' %}
  14.         {% set archivePrefix = isEnglish ? 'Past event from ' ~ event.startDate|date('F j, Y') ~ ': ' : 'Vergangene Veranstaltung vom ' ~ event.startDate|date('d.m.Y') ~ ': ' %}
  15.         <meta name="description" content="{{ archivePrefix }}{{ seoDescription|slice(0, 140) }}">
  16.     {% else %}
  17.         <meta name="description" content="{{ seoDescription }}">
  18.     {% endif %}
  19.     <meta name="keywords" content="{{ seoKeyword }}">
  20.     <meta name="author" content="{{ event.trainer }}">
  21.     {% if app.environment == 'prod' %}
  22.         <meta name="robots" content="index,follow">
  23.         {% if event.seriesTag is not empty %}
  24.             <link rel="canonical" href="{{ path('event_series', {'seriesTag': event.seriesTag, 'lang': lang}) }}" />
  25.         {% else %}
  26.             <link rel="canonical" href="https://www.startplatz.de/event/{{ event.slug | url_encode }}{% if lang == 'en' %}?lang=en{% endif %}" />
  27.         {% endif %}
  28.         {# hreflang tags for bilingual support #}
  29.         {% if event.hasEnglishVersion %}
  30.             <link rel="alternate" hreflang="de" href="https://www.startplatz.de/event/{{ event.slug | url_encode }}?lang=de" />
  31.             <link rel="alternate" hreflang="en" href="https://www.startplatz.de/event/{{ event.slug | url_encode }}?lang=en" />
  32.             <link rel="alternate" hreflang="x-default" href="https://www.startplatz.de/event/{{ event.slug | url_encode }}" />
  33.         {% endif %}
  34.     {% else %}
  35.         <meta name="robots" content="noindex,nofollow">
  36.     {% endif %}
  37.     <!-- Open Graph with language support -->
  38.     <meta property="og:title" content="{{ seoTitle }}">
  39.     <meta property="og:description" content="{{ seoDescription }}">
  40.     <meta property="og:image" content="{{ event.imageLink }}">
  41.     <meta property="og:locale" content="{{ lang == 'en' ? 'en_US' : 'de_DE' }}">
  42.     {% if event.hasEnglishVersion %}
  43.         <meta property="og:locale:alternate" content="{{ lang == 'en' ? 'de_DE' : 'en_US' }}">
  44.     {% endif %}
  45.     <!-- Twitter Card -->
  46.     <meta name="twitter:card" content="summary">
  47.     <meta name="twitter:title" content="{{ seoTitle }}">
  48.     <meta name="twitter:description" content="{{ seoDescription }}">
  49.     <meta name="twitter:image" content="{{ event.imageLink }}">
  50. {% endblock %}
  51. {% block title %}{{ seoTitle|default(event.seoTitle) }}{% endblock %}
  52. {% block additionalHead %}
  53.     {#
  54.     {% include "@StartPlatzStyle/CSS/_homepage.sinlge-event.version-2023-fall.html.twig" %}
  55.     #}
  56.     {% if event.additionalCss is not empty %}
  57.         <!-- addition css styles only for this event -->
  58.         <style>
  59.             .bg-registration {
  60.                 background-color: #9632FF;
  61.             }
  62.             {{ include(template_from_string(event.additionalCss), {
  63.                 'event': event,
  64.                 'batch': batch,
  65.                 'isMultiBatchEvent': isMultiBatchEvent
  66.             }) }}
  67.         </style>
  68.     {% endif %}
  69. {% endblock %}
  70. {% block content %}
  71.     {# Language Detection Logic - uses event.lang as default if set #}
  72.     {% set lang = app.request.get('lang', event.lang|default('de'))|lower %}
  73.     {% set isEnglish = lang == 'en' %}
  74.     {# Select content based on language with fallback to German #}
  75.     {% set navbar = isEnglish and event.navbarEn ? event.navbarEn : event.navbar %}
  76.     {% set teaser = isEnglish and event.teaserEn ? event.teaserEn : event.teaser %}
  77.     {% set content = isEnglish and event.contentEn ? event.contentEn : event.content %}
  78.     {% set contentTwig = isEnglish and event.contentTwigEn ? event.contentTwigEn : event.contentTwig %}
  79.     {% set postCtaContent = isEnglish and event.postCtaContentEn ? event.postCtaContentEn : event.postCtaContent %}
  80.     <!-- start part navbar -->
  81.     {{ include(template_from_string(navbar), {
  82.         'event': event,
  83.         'batch': batch,
  84.         'isMultiBatchEvent': isMultiBatchEvent,
  85.         'lang': lang,
  86.         'isEnglish': isEnglish,
  87.         'phrases': phrases
  88.     }) }}
  89.     <!-- end part navbar -->
  90.     <!-- start part title, time and location -->
  91.     {{ include(template_from_string(teaser), {
  92.         'event': event,
  93.         'batch': batch,
  94.         'isMultiBatchEvent': isMultiBatchEvent,
  95.         'lang': lang,
  96.         'isEnglish': isEnglish,
  97.         'phrases': phrases
  98.     }) }}
  99.     <!-- end part title, time and location -->
  100.     <!-- Archive Banner (SEO-optimized: no redirect) -->
  101.     {% include '@StartPlatzEvent/Default/_event.part.archive-banner.html.twig' with {
  102.         'event': event,
  103.         'isEnglish': isEnglish
  104.     } %}
  105.     <!-- end archive banner -->
  106.     {% if app.session.flashbag.has('notice')  %}
  107.         <!-- start part flashbag notices -->
  108.         <section class="bg-sp-grey py-3">
  109.             <div class="container">
  110.                 <div class="content-wrapper content-background">
  111.                     {% for flashMessage in app.session.flashbag.get('notice') %}
  112.                         <div class="text-center alert {% if 'SUCCESS' in flashMessage %}alert-success{% elseif 'ERROR' in flashMessage  %}alert-danger{% else %}alert-default{% endif %}" role="alert">{{ flashMessage|replace({'SUCCESS': ''})|raw }}</div>
  113.                     {% endfor %}
  114.                     {{ editFeedback|raw }}
  115.                 </div> <!-- End of content-wrapper -->
  116.             </div>
  117.         </section>
  118.         <!-- end part flashbag notices -->
  119.     {% endif %}
  120.     {% if batch and application and application.applicationStatus %}
  121.         <!-- start part feedback application process -->
  122.         {% include "@StartPlatzEvent/Default/_event.part.feedback-application-process.html.twig" %}
  123.         <!-- end part feedback application process -->
  124.     {% endif %}
  125.     <!-- start part content -->
  126.     {{ include(template_from_string(content), {
  127.         'event': event,
  128.         'batch': batch,
  129.         'isMultiBatchEvent': isMultiBatchEvent,
  130.         'lang': lang,
  131.         'isEnglish': isEnglish,
  132.         'phrases': phrases
  133.     }) }}
  134.     <!-- end part content -->
  135.     {% if contentTwig %}
  136.         <!-- start part contentTwig (dynamic Twig content) -->
  137.         {{ include(template_from_string(contentTwig), {
  138.             'event': event,
  139.             'batch': batch,
  140.             'isMultiBatchEvent': isMultiBatchEvent,
  141.             'futureBatches': futureBatches,
  142.             'allBatches': allBatches,
  143.             'lang': lang,
  144.             'isEnglish': isEnglish,
  145.             'phrases': phrases
  146.         }) }}
  147.         <!-- end part contentTwig -->
  148.     {% endif %}
  149.     <!-- start part anmeldung -->
  150.     {% include "@StartPlatzEvent/Default/_section.anmeldung.html.twig" with {
  151.         'event': event,
  152.         'batch': batch,
  153.         'batchIsOpen': batchIsOpen,
  154.         'application': application,
  155.         'settings': settings,
  156.         'isMultiBatchEvent': isMultiBatchEvent,
  157.         'futureBatches': futureBatches,
  158.         'lang': lang,
  159.         'isEnglish': isEnglish,
  160.         'phrases': phrases
  161.     } %}
  162.     <!-- end part anmeldung -->
  163.     <!-- start tags -->
  164.     {% include "@StartPlatzEvent/Default/_section.tags.html.twig" %}
  165.     <!-- end tags -->
  166.     <!-- start post cta content -->
  167.     {% if postCtaContent %}
  168.         {{ include(template_from_string(postCtaContent), {
  169.             'event': event,
  170.             'batch': batch,
  171.             'isMultiBatchEvent': isMultiBatchEvent,
  172.             'lang': lang,
  173.             'isEnglish': isEnglish,
  174.             'phrases': phrases
  175.         }) }}
  176.     {% endif %}
  177.     <!-- end post cta content -->
  178.     {% if speakers %}
  179.         <!-- start part speakers and partners -->
  180.         {% include "@StartPlatzEvent/Default/_section.speakers-and-partners.html.twig" %}
  181.         <!-- end part speakers and partners -->
  182.     {% endif %}
  183.     <!-- start part past batches -->
  184.     {% include "@StartPlatzEvent/Default/_section.past-batches.html.twig" with {
  185.         'event': event,
  186.         'isMultiBatchEvent': isMultiBatchEvent,
  187.         'pastBatches': pastBatches,
  188.         'isEnglish': isEnglish
  189.     } %}
  190.     <!-- end part past batches -->
  191.     {% if app.user and batch %}
  192.         <!-- start part promote this event -->
  193.         {% include "@StartPlatzEvent/Default/_section.promote-this-event.html.twig" %}
  194.         <!-- end part promote this event -->
  195.     {% endif %}
  196.     {% if app.user is defined and application is defined and application is not null and application.canReadList %}
  197.             <section class="bg-sp-grey py-3">
  198.                 <div class="container">
  199.                     <div class="content-wrapper content-background">
  200.                         Hier kannst Du die Teilnehmerliste einsehen
  201.                         <a class="btn btn-outline-dark btn-sm" href="{{ path('admin_event_participants', {id: event.id} ) }}" role="button">participants</a>
  202.                     </div>
  203.                 </div>
  204.             </section>
  205.     {% endif %}
  206.     {% if app.user is defined %}
  207.         {% if app.user.admin is defined and app.user.admin %}
  208.             <!-- start part startplatz admin section -->
  209.             {% include "@StartPlatzEvent/Default/_section.startplatz-admin-section.html.twig" %}
  210.             <!-- end part startplatz admin section -->
  211.         {% endif %}
  212.     {% endif %}
  213.     {# Language Switcher Component #}
  214.     {% if event.hasEnglishVersion %}
  215.         <div class="language-switcher-container">
  216.             <div class="language-switcher">
  217.                 <a href="?lang=de" class="lang-link {{ lang == 'de' ? 'active' : '' }}" title="Deutsch">
  218.                     <span class="flag">🇩🇪</span>
  219.                     <span class="lang-code">DE</span>
  220.                 </a>
  221.                 <span class="separator">|</span>
  222.                 <a href="?lang=en" class="lang-link {{ lang == 'en' ? 'active' : '' }}" title="English">
  223.                     <span class="flag">🇬🇧</span>
  224.                     <span class="lang-code">EN</span>
  225.                 </a>
  226.             </div>
  227.         </div>
  228.         <style>
  229.             .language-switcher-container {
  230.                 position: fixed;
  231.                 top: 120px;
  232.                 right: 20px;
  233.                 z-index: 1000;
  234.             }
  235.             .language-switcher {
  236.                 background: white;
  237.                 border: 2px solid #9632FF;
  238.                 border-radius: 25px;
  239.                 padding: 8px 16px;
  240.                 box-shadow: 0 2px 8px rgba(0,0,0,0.15);
  241.                 display: flex;
  242.                 align-items: center;
  243.                 gap: 8px;
  244.             }
  245.             .language-switcher .lang-link {
  246.                 display: flex;
  247.                 align-items: center;
  248.                 gap: 4px;
  249.                 text-decoration: none;
  250.                 color: #333;
  251.                 font-weight: 500;
  252.                 padding: 4px 8px;
  253.                 border-radius: 15px;
  254.                 transition: all 0.2s;
  255.             }
  256.             .language-switcher .lang-link:hover {
  257.                 background-color: #f0f0f0;
  258.             }
  259.             .language-switcher .lang-link.active {
  260.                 background-color: #9632FF;
  261.                 color: white;
  262.             }
  263.             .language-switcher .flag {
  264.                 font-size: 20px;
  265.                 line-height: 1;
  266.             }
  267.             .language-switcher .lang-code {
  268.                 font-size: 14px;
  269.                 font-weight: 600;
  270.             }
  271.             .language-switcher .separator {
  272.                 color: #ccc;
  273.                 font-weight: 300;
  274.             }
  275.             @media (max-width: 768px) {
  276.                 .language-switcher-container {
  277.                     top: 80px;
  278.                     right: 10px;
  279.                 }
  280.                 .language-switcher {
  281.                     padding: 6px 12px;
  282.                 }
  283.             }
  284.         </style>
  285.     {% endif %}
  286.     <!-- homepage event single page ends -->
  287. {% endblock %}
  288. {% block footer %}
  289.     {% if not embed|default(false) %}
  290.         {% include '@StartPlatzWebsiteBundle/Default/footerBootstrap40.html.twig' %}
  291.     {% endif %}
  292. {% endblock %}
  293. {% block infiniteLoop %}{% endblock %}
  294. {% block javascriptInfiniteLoop %}{% endblock %}
  295. {% block ajax_helpers %}{% endblock %}
  296. {% block javascripts %}
  297.     {% if event.additionalJs is not empty %}
  298.         <!-- Additional JavaScript for this event -->
  299.         <script>
  300.             // Available variables: event, batch, lang, isEnglish
  301.             var eventData = {
  302.                 id: {{ event.id }},
  303.                 title: "{{ event.title|e('js') }}",
  304.                 slug: "{{ event.slug|e('js') }}",
  305.                 lang: "{{ lang }}",
  306.                 isEnglish: {{ isEnglish ? 'true' : 'false' }}
  307.             };
  308.             {{ include(template_from_string(event.additionalJs), {
  309.                 'event': event,
  310.                 'batch': batch,
  311.                 'lang': lang,
  312.                 'isEnglish': isEnglish
  313.             })|raw }}
  314.         </script>
  315.     {% endif %}
  316. {% endblock %}