src/StartPlatz/Bundle/EventBundle/Resources/views/Default/event-single.style-ai-hub.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 #}
  6.     {% set lang = app.request.get('lang', '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.     {# Meta Pixel tracking for ai-coding-hackathon-2025 #}
  70.     {% if event.slug == 'ai-coding-hackathon-2025' %}
  71.         <!-- Meta Pixel Code -->
  72.         <script>
  73.             !function(f,b,e,v,n,t,s)
  74.             {if(f.fbq)return;n=f.fbq=function(){n.callMethod?
  75.             n.callMethod.apply(n,arguments):n.queue.push(arguments)};
  76.             if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
  77.             n.queue=[];t=b.createElement(e);t.async=!0;
  78.             t.src=v;s=b.getElementsByTagName(e)[0];
  79.             s.parentNode.insertBefore(t,s)}(window, document,'script',
  80.             'https://connect.facebook.net/en_US/fbevents.js');
  81.             fbq('init', '113165142734893');
  82.             fbq('track', 'PageView');
  83.         </script>
  84.         <noscript>
  85.             <img height="1" width="1" style="display:none"
  86.                  src="https://www.facebook.com/tr?id=113165142734893&ev=PageView&noscript=1"/>
  87.         </noscript>
  88.         <!-- End Meta Pixel Code -->
  89.     {% endif %}
  90. {% endblock %}
  91. {% block content %}
  92.     {# Language Detection Logic #}
  93.     {% set lang = app.request.get('lang', 'de')|lower %}
  94.     {% set isEnglish = lang == 'en' %}
  95.     {# Select content based on language with fallback to German #}
  96.     {% set navbar = isEnglish and event.navbarEn ? event.navbarEn : event.navbar %}
  97.     {% set teaser = isEnglish and event.teaserEn ? event.teaserEn : event.teaser %}
  98.     {% set content = isEnglish and event.contentEn ? event.contentEn : event.content %}
  99.     {% set contentTwig = isEnglish and event.contentTwigEn ? event.contentTwigEn : event.contentTwig %}
  100.     {% set postCtaContent = isEnglish and event.postCtaContentEn ? event.postCtaContentEn : event.postCtaContent %}
  101.     <!-- start part navbar -->
  102.     {{ include(template_from_string(navbar), {
  103.         'event': event,
  104.         'batch': batch,
  105.         'isMultiBatchEvent': isMultiBatchEvent,
  106.         'lang': lang,
  107.         'isEnglish': isEnglish,
  108.         'phrases': phrases
  109.     }) }}
  110.     <!-- end part navbar -->
  111.     <!-- start part title, time and location -->
  112.     {{ include(template_from_string(teaser), {
  113.         'event': event,
  114.         'batch': batch,
  115.         'isMultiBatchEvent': isMultiBatchEvent,
  116.         'lang': lang,
  117.         'isEnglish': isEnglish,
  118.         'phrases': phrases
  119.     }) }}
  120.     <!-- end part title, time and location -->
  121.     <!-- Archive Banner (SEO-optimized: no redirect) -->
  122.     {% include '@StartPlatzEvent/Default/_event.part.archive-banner.html.twig' with {
  123.         'event': event,
  124.         'isEnglish': isEnglish
  125.     } %}
  126.     <!-- end archive banner -->
  127.     {% if app.session.flashbag.has('notice')  %}
  128.         <!-- start part flashbag notices -->
  129.         <section class="bg-sp-grey py-3">
  130.             <div class="container">
  131.                 <div class="content-wrapper content-background">
  132.                     {% for flashMessage in app.session.flashbag.get('notice') %}
  133.                         <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>
  134.                     {% endfor %}
  135.                     {{ editFeedback|raw }}
  136.                 </div> <!-- End of content-wrapper -->
  137.             </div>
  138.         </section>
  139.         <!-- end part flashbag notices -->
  140.     {% endif %}
  141.     {% if batch and application and application.applicationStatus %}
  142.         <!-- start part feedback application process -->
  143.         {% include "@StartPlatzEvent/Default/_event.part.feedback-application-process.html.twig" %}
  144.         <!-- end part feedback application process -->
  145.     {% endif %}
  146.     <!-- start part content -->
  147.     {{ include(template_from_string(content), {
  148.         'event': event,
  149.         'batch': batch,
  150.         'isMultiBatchEvent': isMultiBatchEvent,
  151.         'lang': lang,
  152.         'isEnglish': isEnglish,
  153.         'phrases': phrases
  154.     }) }}
  155.     <!-- end part content -->
  156.     {% if contentTwig %}
  157.         <!-- start part contentTwig (dynamic Twig content) -->
  158.         {{ include(template_from_string(contentTwig), {
  159.             'event': event,
  160.             'batch': batch,
  161.             'isMultiBatchEvent': isMultiBatchEvent,
  162.             'futureBatches': futureBatches,
  163.             'allBatches': allBatches,
  164.             'lang': lang,
  165.             'isEnglish': isEnglish,
  166.             'phrases': phrases
  167.         }) }}
  168.         <!-- end part contentTwig -->
  169.     {% endif %}
  170.     <!-- start part anmeldung -->
  171.     {% include "@StartPlatzEvent/Default/_section.anmeldung.html.twig" with {
  172.         'event': event,
  173.         'batch': batch,
  174.         'batchIsOpen': batchIsOpen,
  175.         'application': application,
  176.         'settings': settings,
  177.         'isMultiBatchEvent': isMultiBatchEvent,
  178.         'futureBatches': futureBatches,
  179.         'lang': lang,
  180.         'isEnglish': isEnglish,
  181.         'phrases': phrases
  182.     } %}
  183.     <!-- end part anmeldung -->
  184.     <!-- start tags -->
  185.     {% include "@StartPlatzEvent/Default/_section.tags.html.twig" %}
  186.     <!-- end tags -->
  187.     <!-- start post cta content -->
  188.     {% if postCtaContent %}
  189.         {{ include(template_from_string(postCtaContent), {
  190.             'event': event,
  191.             'batch': batch,
  192.             'isMultiBatchEvent': isMultiBatchEvent,
  193.             'lang': lang,
  194.             'isEnglish': isEnglish,
  195.             'phrases': phrases
  196.         }) }}
  197.     {% endif %}
  198.     <!-- end post cta content -->
  199.     {% if speakers %}
  200.         <!-- start part speakers and partners -->
  201.         {% include "@StartPlatzEvent/Default/_section.speakers-and-partners.html.twig" %}
  202.         <!-- end part speakers and partners -->
  203.     {% endif %}
  204.     <!-- start part past batches -->
  205.     {% include "@StartPlatzEvent/Default/_section.past-batches.html.twig" with {
  206.         'event': event,
  207.         'isMultiBatchEvent': isMultiBatchEvent,
  208.         'pastBatches': pastBatches,
  209.         'isEnglish': isEnglish
  210.     } %}
  211.     <!-- end part past batches -->
  212.     {% if app.user and batch %}
  213.         <!-- start part promote this event -->
  214.         {% include "@StartPlatzEvent/Default/_section.promote-this-event.html.twig" %}
  215.         <!-- end part promote this event -->
  216.     {% endif %}
  217.     {% if app.user is defined and application is defined and application is not null and application.canReadList %}
  218.             <section class="bg-sp-grey py-3">
  219.                 <div class="container">
  220.                     <div class="content-wrapper content-background">
  221.                         Hier kannst Du die Teilnehmerliste einsehen
  222.                         <a class="btn btn-outline-dark btn-sm" href="{{ path('admin_event_participants', {id: event.id} ) }}" role="button">participants</a>
  223.                     </div>
  224.                 </div>
  225.             </section>
  226.     {% endif %}
  227.     {% if app.user is defined %}
  228.         {% if app.user.admin is defined and app.user.admin %}
  229.             <!-- start part startplatz admin section -->
  230.             {% include "@StartPlatzEvent/Default/_section.startplatz-admin-section.html.twig" %}
  231.             <!-- end part startplatz admin section -->
  232.         {% endif %}
  233.     {% endif %}
  234.     {# Language Switcher Component #}
  235.     {% if event.hasEnglishVersion %}
  236.         <div class="language-switcher-container">
  237.             <div class="language-switcher">
  238.                 <a href="?lang=de" class="lang-link {{ lang == 'de' ? 'active' : '' }}" title="Deutsch">
  239.                     <span class="flag">🇩🇪</span>
  240.                     <span class="lang-code">DE</span>
  241.                 </a>
  242.                 <span class="separator">|</span>
  243.                 <a href="?lang=en" class="lang-link {{ lang == 'en' ? 'active' : '' }}" title="English">
  244.                     <span class="flag">🇬🇧</span>
  245.                     <span class="lang-code">EN</span>
  246.                 </a>
  247.             </div>
  248.         </div>
  249.         <style>
  250.             .language-switcher-container {
  251.                 position: fixed;
  252.                 top: 120px;
  253.                 right: 20px;
  254.                 z-index: 1000;
  255.             }
  256.             .language-switcher {
  257.                 background: white;
  258.                 border: 2px solid #9632FF;
  259.                 border-radius: 25px;
  260.                 padding: 8px 16px;
  261.                 box-shadow: 0 2px 8px rgba(0,0,0,0.15);
  262.                 display: flex;
  263.                 align-items: center;
  264.                 gap: 8px;
  265.             }
  266.             .language-switcher .lang-link {
  267.                 display: flex;
  268.                 align-items: center;
  269.                 gap: 4px;
  270.                 text-decoration: none;
  271.                 color: #333;
  272.                 font-weight: 500;
  273.                 padding: 4px 8px;
  274.                 border-radius: 15px;
  275.                 transition: all 0.2s;
  276.             }
  277.             .language-switcher .lang-link:hover {
  278.                 background-color: #f0f0f0;
  279.             }
  280.             .language-switcher .lang-link.active {
  281.                 background-color: #9632FF;
  282.                 color: white;
  283.             }
  284.             .language-switcher .flag {
  285.                 font-size: 20px;
  286.                 line-height: 1;
  287.             }
  288.             .language-switcher .lang-code {
  289.                 font-size: 14px;
  290.                 font-weight: 600;
  291.             }
  292.             .language-switcher .separator {
  293.                 color: #ccc;
  294.                 font-weight: 300;
  295.             }
  296.             @media (max-width: 768px) {
  297.                 .language-switcher-container {
  298.                     top: 80px;
  299.                     right: 10px;
  300.                 }
  301.                 .language-switcher {
  302.                     padding: 6px 12px;
  303.                 }
  304.             }
  305.         </style>
  306.     {% endif %}
  307.     <!-- homepage event single page ends -->
  308. {% endblock %}
  309. {% block footer %}
  310.     {% if not embed|default(false) %}
  311.         {% include '@StartPlatzWebsiteBundle/Default/footerBootstrap40.html.twig' %}
  312.     {% endif %}
  313. {% endblock %}
  314. {% block infiniteLoop %}{% endblock %}
  315. {% block javascriptInfiniteLoop %}{% endblock %}
  316. {% block ajax_helpers %}{% endblock %}
  317. {% block javascripts %}
  318.     {% if event.additionalJs is not empty %}
  319.         <!-- Additional JavaScript for this event -->
  320.         <script>
  321.             // Available variables: event, batch, lang, isEnglish
  322.             var eventData = {
  323.                 id: {{ event.id }},
  324.                 title: "{{ event.title|e('js') }}",
  325.                 slug: "{{ event.slug|e('js') }}",
  326.                 lang: "{{ lang }}",
  327.                 isEnglish: {{ isEnglish ? 'true' : 'false' }}
  328.             };
  329.             {{ include(template_from_string(event.additionalJs), {
  330.                 'event': event,
  331.                 'batch': batch,
  332.                 'lang': lang,
  333.                 'isEnglish': isEnglish
  334.             })|raw }}
  335.         </script>
  336.     {% endif %}
  337. {% endblock %}