{% extends "@StartPlatzStyleBundle/base.tailwind.public.html.twig" %}
{% set currentPath = app.request.get('_route') %}
{# Language Detection - uses event.lang as default if set #}
{% set lang = app.request.get('lang', event.lang|default('de'))|lower %}
{% set isEnglish = lang == 'en' %}
{# Select SEO content based on language with fallback #}
{% set seoTitle = isEnglish and event.seoTitleEn ? event.seoTitleEn : event.seoTitle %}
{% set seoDescription = isEnglish and event.seoDescriptionEn ? event.seoDescriptionEn : event.seoDescription %}
{% set seoKeyword = isEnglish and event.seoKeywordEn ? event.seoKeywordEn : event.seoKeyword %}
{% block metaData %}
{# Optimize meta description for archived events #}
{% if event.status == 'archive' %}
{% set archivePrefix = isEnglish ? 'Past event from ' ~ event.startDate|date('F j, Y') ~ ': ' : 'Vergangene Veranstaltung vom ' ~ event.startDate|date('d.m.Y') ~ ': ' %}
<meta name="description" content="{{ archivePrefix }}{{ seoDescription|slice(0, 140) }}">
{% else %}
<meta name="description" content="{{ seoDescription }}">
{% endif %}
<meta name="keywords" content="{{ seoKeyword }}">
<meta name="author" content="{{ event.trainer }}">
{% if app.environment == 'prod' %}
<meta name="robots" content="index,follow">
{% if event.seriesTag is not empty %}
<link rel="canonical" href="{{ path('event_series', {'seriesTag': event.seriesTag, 'lang': lang}) }}" />
{% else %}
<link rel="canonical" href="https://www.startplatz.de/event/{{ event.slug | url_encode }}{% if lang == 'en' %}?lang=en{% endif %}" />
{% endif %}
{# hreflang tags for bilingual support #}
{% if event.hasEnglishVersion %}
<link rel="alternate" hreflang="de" href="https://www.startplatz.de/event/{{ event.slug | url_encode }}?lang=de" />
<link rel="alternate" hreflang="en" href="https://www.startplatz.de/event/{{ event.slug | url_encode }}?lang=en" />
<link rel="alternate" hreflang="x-default" href="https://www.startplatz.de/event/{{ event.slug | url_encode }}" />
{% endif %}
{% else %}
<meta name="robots" content="noindex,nofollow">
{% endif %}
{# Open Graph with language support #}
<meta property="og:title" content="{{ seoTitle }}">
<meta property="og:description" content="{{ seoDescription }}">
<meta property="og:image" content="{{ event.imageLink }}">
<meta property="og:locale" content="{{ lang == 'en' ? 'en_US' : 'de_DE' }}">
{% if event.hasEnglishVersion %}
<meta property="og:locale:alternate" content="{{ lang == 'en' ? 'de_DE' : 'en_US' }}">
{% endif %}
{# Twitter Card #}
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="{{ seoTitle }}">
<meta name="twitter:description" content="{{ seoDescription }}">
<meta name="twitter:image" content="{{ event.imageLink }}">
{% endblock %}
{% block title %}{{ seoTitle|default(event.seoTitle) }}{% endblock %}
{% block styles %}
{#
╔═══════════════════════════════════════════════════════════════════════╗
║ DEFAULT STYLES - werden durch event.additionalCss überschrieben ║
║ ║
║ Anpassbar via additionalCss (Beispiel Dark Theme): ║
║ body { background-color: #0a0a0a; } ║
║ .bg-registration { background-color: #171717; } ║
║ .registration-accent { --registration-accent: #3D9DD6; } ║
║ .bg-tags { background-color: #171717; } ║
║ .bg-promote { background-color: #171717; } ║
║ .bg-admin-section { background-color: #171717; } ║
╚═══════════════════════════════════════════════════════════════════════╝
#}
<style>
/* Page Background - visible between sections */
body { background-color: #FFFFFF; }
/* Registration Section */
.bg-registration { background-color: #9632FF; }
.registration-accent { --registration-accent: #9632FF; }
/* Tags Section */
.bg-tags { background-color: #F3F4F6; }
/* Promote This Event Section */
.bg-promote { background-color: #F3F4F6; }
/* Admin Section */
.bg-admin-section { background-color: #F9FAFB; }
</style>
{% endblock %}
{% block additionalHead %}
{# Custom CSS from Event #}
{% if event.additionalCss is not empty %}
<style>
{{ include(template_from_string(event.additionalCss), {
'event': event,
'batch': batch,
'isMultiBatchEvent': isMultiBatchEvent
}) }}
</style>
{% endif %}
{# Meta Pixel tracking - PageView Event #}
{% if event.metaPixelId %}
<!-- Meta Pixel Code -->
<script>
!function(f,b,e,v,n,t,s)
{if(f.fbq)return;n=f.fbq=function(){n.callMethod?
n.callMethod.apply(n,arguments):n.queue.push(arguments)};
if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(t,s)}(window, document,'script',
'https://connect.facebook.net/en_US/fbevents.js');
fbq('init', '{{ event.metaPixelId }}');
fbq('track', 'PageView');
</script>
<noscript>
<img height="1" width="1" style="display:none"
src="https://www.facebook.com/tr?id={{ event.metaPixelId }}&ev=PageView&noscript=1"/>
</noscript>
<!-- End Meta Pixel Code -->
{% endif %}
{% endblock %}
{% block content %}
{# Select content based on language with fallback to German #}
{% set navbar = isEnglish and event.navbarEn ? event.navbarEn : event.navbar %}
{% set teaser = isEnglish and event.teaserEn ? event.teaserEn : event.teaser %}
{% set content = isEnglish and event.contentEn ? event.contentEn : event.content %}
{% set contentTwig = isEnglish and event.contentTwigEn ? event.contentTwigEn : event.contentTwig %}
{% set postCtaContent = isEnglish and event.postCtaContentEn ? event.postCtaContentEn : event.postCtaContent %}
{# Navbar Section #}
{% if navbar %}
{{ include(template_from_string(navbar), {
'event': event,
'batch': batch,
'isMultiBatchEvent': isMultiBatchEvent,
'lang': lang,
'isEnglish': isEnglish,
'phrases': phrases
}) }}
{% endif %}
{# Teaser Section #}
{% if teaser %}
{{ include(template_from_string(teaser), {
'event': event,
'batch': batch,
'isMultiBatchEvent': isMultiBatchEvent,
'lang': lang,
'isEnglish': isEnglish,
'phrases': phrases
}) }}
{% endif %}
{# Archive Banner (SEO-optimized: no redirect) #}
{% include '@StartPlatzEvent/Default/_event.part.archive-banner.html.twig' with {
'event': event,
'isEnglish': isEnglish
} %}
{# Flash Messages (Notices) #}
{% if app.session.flashbag.has('notice') %}
<section class="bg-gray-100 py-3">
<div class="max-w-4xl mx-auto px-4">
{% for flashMessage in app.session.flashbag.get('notice') %}
<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 %}">
{{ flashMessage|replace({'SUCCESS': ''})|raw }}
</div>
{% endfor %}
{{ editFeedback|raw }}
</div>
</section>
{% endif %}
{# Application Status Feedback #}
{% if batch and application and application.applicationStatus %}
{% include "@StartPlatzEvent/Default/_event.part.feedback-application-process.html.twig" %}
{% endif %}
{# Main Content Section #}
{% if content %}
{{ include(template_from_string(content), {
'event': event,
'batch': batch,
'isMultiBatchEvent': isMultiBatchEvent,
'lang': lang,
'isEnglish': isEnglish,
'phrases': phrases
}) }}
{% endif %}
{# Dynamic Twig Content #}
{% if contentTwig %}
{{ include(template_from_string(contentTwig), {
'event': event,
'batch': batch,
'isMultiBatchEvent': isMultiBatchEvent,
'futureBatches': futureBatches,
'allBatches': allBatches,
'lang': lang,
'isEnglish': isEnglish,
'phrases': phrases
}) }}
{% endif %}
{# Registration Section #}
{% include "@StartPlatzEvent/Default/_registration.batch.tailwind.html.twig" with {
'event': event,
'batch': batch,
'batchIsOpen': batchIsOpen,
'application': application,
'settings': settings,
'isMultiBatchEvent': isMultiBatchEvent,
'futureBatches': futureBatches,
'lang': lang,
'isEnglish': isEnglish,
'phrases': phrases
} %}
{# Tags Section #}
{% include "@StartPlatzEvent/Default/_section.tags.tailwind.html.twig" %}
{# Post CTA Content #}
{% if postCtaContent %}
{{ include(template_from_string(postCtaContent), {
'event': event,
'batch': batch,
'isMultiBatchEvent': isMultiBatchEvent,
'lang': lang,
'isEnglish': isEnglish,
'phrases': phrases
}) }}
{% endif %}
{# Speakers Section #}
{% if speakers %}
{% include "@StartPlatzEvent/Default/_section.speakers-and-partners.winter-2025.html.twig" %}
{% endif %}
{# Past Batches Section #}
{% include "@StartPlatzEvent/Default/_section.past-batches.html.twig" with {
'event': event,
'isMultiBatchEvent': isMultiBatchEvent,
'pastBatches': pastBatches,
'isEnglish': isEnglish
} %}
{# Promote This Event (for logged-in users) #}
{% if app.user and batch %}
{% include "@StartPlatzEvent/Default/_section.promote-this-event.tailwind.html.twig" %}
{% endif %}
{# Participant List Access #}
{% if app.user is defined and application is defined and application is not null and application.canReadList %}
<section class="bg-gray-100 py-6">
<div class="max-w-4xl mx-auto px-4 text-center">
<span class="text-gray-700">{{ isEnglish ? 'You can view the participant list here' : 'Hier kannst Du die Teilnehmerliste einsehen' }}</span>
<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} ) }}">
participants
</a>
</div>
</section>
{% endif %}
{# Admin Section #}
{% if app.user is defined %}
{% if app.user.admin is defined and app.user.admin %}
{% include "@StartPlatzEvent/Default/_section.startplatz-admin-section.tailwind.html.twig" %}
{% endif %}
{% endif %}
{# Language Switcher Component #}
{% if event.hasEnglishVersion %}
<div class="fixed top-32 right-5 z-50" x-data="{ hover: false }">
<div class="bg-white border-2 border-sp-purple rounded-full px-4 py-2 shadow-lg flex items-center gap-2">
<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">
<span class="text-xl">DE</span>
</a>
<span class="text-gray-300">|</span>
<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">
<span class="text-xl">EN</span>
</a>
</div>
</div>
{% endif %}
{% endblock %}
{% block javascripts %}
{% if event.additionalJs is not empty %}
<script>
var eventData = {
id: {{ event.id }},
title: "{{ event.title|e('js') }}",
slug: "{{ event.slug|e('js') }}",
lang: "{{ lang }}",
isEnglish: {{ isEnglish ? 'true' : 'false' }}
};
{{ include(template_from_string(event.additionalJs), {
'event': event,
'batch': batch,
'lang': lang,
'isEnglish': isEnglish
})|raw }}
</script>
{% endif %}
{% endblock %}