src/StartPlatz/Bundle/EventBundle/Controller/EventPublicController.php line 84

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace App\StartPlatz\Bundle\EventBundle\Controller;
  3. use App\StartPlatz\Bundle\EventBundle\Entity\Event;
  4. use App\StartPlatz\Bundle\EventBundle\Entity\EventRepository;
  5. use App\StartPlatz\Bundle\EventBundle\Model\EventBaseRepository;
  6. use App\StartPlatz\Bundle\EventBundle\Model\EventCommonRepository;
  7. use App\StartPlatz\Bundle\EventBundle\Service\EventViewHelper;
  8. use App\StartPlatz\Bundle\MetaBundle\Entity\Tag;
  9. use App\StartPlatz\Bundle\StartupBundle\Entity\Application;
  10. use App\StartPlatz\Bundle\StartupBundle\Entity\Batch;
  11. use App\StartPlatz\Bundle\WebsiteBundle\MenuTranslationService;
  12. use Doctrine\ORM\EntityManagerInterface;
  13. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  14. use Symfony\Component\Form\Extension\Core\Type\HiddenType;
  15. use Symfony\Component\Form\Extension\Core\Type\SubmitType;
  16. use Symfony\Component\Form\Extension\Core\Type\TextareaType;
  17. use Symfony\Component\Form\Extension\Core\Type\TextType;
  18. use Symfony\Component\Form\FormFactoryInterface;
  19. use Symfony\Component\HttpFoundation\Request;
  20. use Symfony\Component\HttpFoundation\Response;
  21. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  22. use Symfony\Component\Routing\Annotation\Route;
  23. class EventPublicController extends AbstractController
  24. {
  25.     public function __construct(
  26.         private readonly EntityManagerInterface $entityManager,
  27.         private readonly EventCommonRepository $eventCommonRepository,
  28.         private readonly EventBaseRepository $eventBaseRepository,
  29.         private readonly MenuTranslationService $menuTranslationService,
  30.         private readonly FormFactoryInterface $formFactory,
  31.         private readonly SessionInterface $session,
  32.         private readonly EventViewHelper $eventViewHelper,
  33.     ) {
  34.     }
  35.     /**
  36.      */
  37.     public function showEventsAction($time "upcoming"$term=''$title=""$text '')
  38.     {
  39.         // sanitize variable from wordPress
  40.         $time str_replace('&#8220;''', (string) $time);
  41.         $term str_replace('&#8220;''', (string) $term);
  42.         $title str_replace('&#8220;''', (string) $title);
  43.         $text str_replace('&#8220;''', (string) $text);
  44.         $terms explode('#'$term);
  45.         $events $this->entityManager->getRepository(Event::class)->findPublicByTerms($terms, [], ($time == 'upcoming') ? 'future' 'past');
  46.         return $this->render('@StartPlatzEventBundle/Default/show_events.html.twig', [
  47.             'events' => $events,
  48.             'title'  => $title,
  49.             'templateVars' => [],
  50.             'term' => $term,
  51.             'text'=>$text,
  52.         ]);
  53.     }
  54.     /**
  55.      */
  56.     public function showFutureEventsAction($term 'startup'$variant 'default')
  57.     {
  58.         $term ltrim((string) $term'#');
  59.         $events $this->entityManager->getRepository(Event::class)->findPublicEventsByTerm($term);
  60.         $view '@StartPlatzEventBundle/Default/show_future_events.html.twig';
  61.         if ($variant == 'black-rows') {
  62.             $view '@StartPlatzEventBundle/Default/show_future_events.black-rows.html.twig';
  63.         }
  64.         return $this->render($view, [
  65.             'events' => $events,
  66.             'term'   => $term,
  67.             'templateVars' => [],
  68.         ]);
  69.     }
  70.     /**
  71.      */
  72.     public function showNextEventsAction(Request $request$limit 3)
  73.     {
  74.         $events $this->entityManager->getRepository(Event::class)->findNextEvents($limit);
  75.         return $this->render('@StartPlatzEventBundle/Default/show_next_events.html.twig', [
  76.             'events' => $events,
  77.             'templateVars' => [],
  78.             'lang' =>  $this->menuTranslationService->getLang($request->server->get('REDIRECT_URL')),
  79.         ]);
  80.     }
  81.     /**
  82.      */
  83.     public function showListGroupEventsAction(Request $request$limit 15)
  84.     {
  85.         $events $this->entityManager->getRepository(Event::class)->findNextEvents($limit);
  86.         return $this->render('@StartPlatzEvent/Default/show_list_group_events.html.twig', [
  87.             'events' => $events,
  88.             'templateVars' => [],
  89.             'lang' =>  $this->menuTranslationService->getLang($request->server->get('REDIRECT_URL')),
  90.         ]);
  91.     }
  92.     /**
  93.      */
  94.     public function showPastEventsAction($term)
  95.     {
  96.         $events $this->entityManager->getRepository(Event::class)->findPastPublicEventsByTerm($term);
  97.         return $this->render('@StartPlatzEventBundle/Default/show_past_events.html.twig', [
  98.             'events' => $events,
  99.             'term' => $term,
  100.             'templateVars' => [],
  101.         ]);
  102.     }
  103.     #[Route('/events'name'events_list')]
  104.     #[Route('/en/events'name'events_list_english')]
  105.     #[Route('/fr/evenements'name'events_list_french')]
  106.     #[Route('/events/bevorstehend/')]
  107.     #[Route('/events/list')]
  108.     #[Route('/en/events/list')]
  109.     #[Route('/fr/evenements/list')]
  110.     #[Route('/events/embed/list')]
  111.     #[Route('/en/events/embed/list')]
  112.     #[Route('/fr/evenements/embed/list')]
  113.     public function eventsAction(Request $request)
  114.     {
  115.         $templateVars $this->eventCommonRepository->getStartPlatzEventBaseTemplateVars($request);
  116.         $em $this->entityManager;
  117.         // Get the current path
  118.         $path $request->getPathInfo();
  119.         // Check if the path starts with '/en/' or '/fr/'
  120.         if (strpos($path'/en/') === 0) {
  121.             $lang 'EN';
  122.         } elseif (strpos($path'/fr/') === 0) {
  123.             $lang 'FR';
  124.         } else {
  125.             $lang 'DE';
  126.         }
  127.         // Check if the path contains  '/en/'
  128.         $embed false;
  129.         if (str_contains($path'/embed/') ) {
  130.             $embed true;
  131.         }
  132.         // Fetch u tags
  133.         $uTags $em->getRepository(Tag::class)->findBy(['domain' => 'event''isEditableByUser' => 1], ['tag' => 'ASC']);
  134.         // Convert to key-value array
  135.         $uTagsArray array_map(function (Tag $entity) {
  136.             return [
  137.                 'tag' => $entity->getTag(),  // Dies entspricht dem 'slug' in deiner URL-Struktur
  138.                 'label' => $entity->getLabel()
  139.             ];
  140.         }, $uTags);
  141.         // Fetch w tags
  142.         $wTags $em->getRepository(Tag::class)->findBy(['domain' => 'event''isUsedInWordPress' => 1], ['tag' => 'ASC']);
  143.         // Convert to key-value array
  144.         $wTagsArray array_map(function (Tag $entity) {
  145.             return [
  146.                 'tag' => $entity->getTag(),  // Dies entspricht dem 'slug' in deiner URL-Struktur
  147.                 'label' => $entity->getLabel()
  148.             ];
  149.         }, $wTags);
  150.         $additionalEvents = [];
  151.         $queryString '';
  152.         // Check for location filter first (location-based filtering)
  153.         if (isset($templateVars['location']) and $location $templateVars['location']) {
  154.             $futureEvents $this->entityManager->getRepository(Event::class)->findPublicByLocationWithBatches($location$this->eventCommonRepository->setBaseCriteria($templateVars), 'future');
  155.             $pastEvents   $this->entityManager->getRepository(Event::class)->findPublicByLocationWithBatches($location$this->eventCommonRepository->setBaseCriteria($templateVars), 'past');
  156.             $moreFutureEvents $this->eventBaseRepository->countFutureEvents($this->eventCommonRepository->setBaseCriteria($templateVars));
  157.         }
  158.         // Check for tag filter (tag-based filtering)
  159.         elseif (isset($templateVars['tag']) and $tag $templateVars['tag']) {
  160.             $futureEvents $this->entityManager->getRepository(Event::class)->findPublicByTagWithBatches('#' $tag$this->eventCommonRepository->setBaseCriteria($templateVars), 'future');
  161. /*
  162.  * falls einer der zielgruppen tags == uTags gewählt ist
  163.  * dann hole auch die events für alle fTags und startplatz-ai-hub
  164.  */
  165. // Extrahiere alle 'tag' Werte aus dem $uTagsArray
  166.             $uTagsSlugs array_column($uTagsArray'tag');
  167. // Ãœberprüfe, ob der gewählte $tag in den $uTagsSlugs enthalten ist
  168.             $isUTag in_array($tag$uTagsSlugs);
  169.             if ($isUTag) {
  170.                 // Fetch f tags
  171.                 $fTags $em->getRepository(Tag::class)->findBy(['domain' => 'event''isFavorite' => 1], ['tag' => 'ASC']);
  172.                 // Extract just the tags to a simple array
  173.                 $fTagsList array_map(function (Tag $entity) {
  174.                     return $entity->getTag(); // Dies gibt nur den 'tag' zurück
  175.                 }, $fTags);
  176.                 $additionalEvents $this->entityManager->getRepository(Event::class)->findPublicByTagsExcludingTag($fTagsList'#' $tag$this->eventCommonRepository->setBaseCriteria($templateVars), 'future');
  177.             }
  178.             $pastEvents   $this->entityManager->getRepository(Event::class)->findPublicByTagWithBatches('#' $tag$this->eventCommonRepository->setBaseCriteria($templateVars), 'past');
  179.             $moreFutureEvents $this->eventBaseRepository->countFutureEvents($this->eventCommonRepository->setBaseCriteria($templateVars));
  180.         }
  181.         // No filter - show all events
  182.         else {
  183.             $futureEvents $this->entityManager->getRepository(Event::class)->findPublicByWithBatches($queryString$this->eventCommonRepository->setBaseCriteria($templateVars), 'future');
  184.             $moreFutureEvents $this->eventBaseRepository->countFutureEvents($this->eventCommonRepository->setBaseCriteria($templateVars));
  185.             $pastEvents   $this->entityManager->getRepository(Event::class)->findPublicByWithBatches($queryString$this->eventCommonRepository->setBaseCriteria($templateVars), 'past');
  186.         }
  187.         if ($request->get('format') === 'json') {
  188.             $events = [];
  189.             foreach ($futureEvents as $event) {
  190.                 $events[] = $event->toArray();
  191.             }
  192.             return Response::create(
  193.                 json_encode($events),
  194.                 200,
  195.                 [
  196.                     'Content-Type' => 'application/json',
  197.                     'Access-Control-Allow-Origin' => '*',
  198.                 ]
  199.             );
  200.         }
  201.         $targetPath $request->server->get('REDIRECT_URL');
  202.         if ($this->getUser()) {
  203.             if (!$email $this->getUser()->getEmail()) {
  204.                 $email null;
  205.             }
  206.         } else {
  207.             $email null;
  208.         }
  209.         $form $this->setFeedbackForm($targetPath$this->generateUrl('feedback_translation'), $email);
  210.         $eventTypes $em->getRepository(Tag::class)->findBy(['domain'=>'event''isThema'=>1], ['tag'=>'ASC']);
  211.         $eventTypesTags   array_map(fn (Tag $entity) => $entity->getTag(), $eventTypes);
  212.         $eventTypesLabels array_map(fn (Tag $entity) => $entity->getLabel(), $eventTypes);
  213.         $eventTypesTagLabel array_combine($eventTypesTags$eventTypesLabels);
  214.         // Fetch popular tags
  215.         $popularTags $em->getRepository(Tag::class)->findBy(['domain' => 'event''isModul' => 1], ['tag' => 'ASC']);
  216.         // Convert to key-value array
  217.         $popularTagsArray array_map(function (Tag $entity) {
  218.             return [
  219.                 'tag' => $entity->getTag(),  // Dies entspricht dem 'slug' in deiner URL-Struktur
  220.                 'label' => $entity->getLabel()
  221.             ];
  222.         }, $popularTags);
  223.         $view '@StartPlatzEventBundle/Default/events.html.twig';
  224.         if ($embed){
  225.             $view '@StartPlatzEventBundle/Default/events-embed.html.twig';
  226.         }
  227.         return $this->render($view, [
  228.             'templateVars' => $templateVars,
  229.             'lang'           => $lang,
  230.             'embed'          => $embed,
  231.             'nextConference' => $this->entityManager->getRepository(Event::class)->findNextPublicBy("Konferenz"),
  232.             'nextWorkshop'   => $this->entityManager->getRepository(Event::class)->findNextPublicBy("Workshop"),
  233.             'futureEvents'   => $futureEvents,
  234.             'pastEvents'     => $pastEvents,
  235.             'events'         => $this->entityManager->getRepository(Event::class)->findNextEvents(100),
  236.             'moreFutureEvents' => $moreFutureEvents,
  237.             'additionalEvents' => $additionalEvents,
  238.             'eventArten'         => $eventTypes,
  239.             'eventTypesTagLabel' => $eventTypesTagLabel,
  240.             'popularTagsArray'   => $popularTagsArray,
  241.             'uTagsArray'         => $uTagsArray,
  242.             'wTagsArray'         => $wTagsArray,
  243.             'form'           => $form->createView(),
  244.             'menuLinksAndPhrases' => $this->menuTranslationService->getMenuLinksAndPhrases($request->server->get('REQUEST_URI')),
  245.         ]);
  246.     }
  247.     #[Route('/event-series/{seriesTag}'name'event_series')]
  248.     public function eventSeriesAction($seriesTagRequest $request )
  249.     {
  250.         $templateVars $this->eventCommonRepository->getStartPlatzEventBaseTemplateVars($request);
  251.         $em $this->entityManager;
  252.         $eventRepo $em->getRepository(Event::class);
  253.         $batchRepo $em->getRepository(Batch::class);
  254.         // Retrieve the UTM parameters from the URL
  255.         $utmParameters = [
  256.             'utmSource'   => $request->query->get('utm_source'),
  257.             'utmMedium'   => $request->query->get('utm_medium'),
  258.             'utmCampaign' => $request->query->get('utm_campaign'),
  259.             'utmTerm'     => $request->query->get('utm_term'),
  260.             'utmContent'  => $request->query->get('utm_content'),
  261.         ];
  262.         // Fetch data related to the event series using $seriesName
  263.         // For example, using a repository method:
  264.         $nextEvent $eventRepo->findNextEventInSeries($seriesTag, new \DateTime());
  265.         // Check if the result is null (no future events)
  266.         if ($nextEvent === null) {
  267.             // Fetch the most recent past event in the series
  268.             $nextEvent $eventRepo->findMostRecentPastEventInSeries($seriesTag, new \DateTime());
  269.         }
  270.         // Initialize variables with default values
  271.         $noEventsAvailable false// Default to false, indicating events are available
  272.         $alternativeContent ''// Default empty string or a default alternative message
  273.         $nextBatch null;
  274.         $futureEventsData = [];
  275.         $pastEventsData = [];
  276.         // Proceed only if there is an event (either upcoming or past)
  277.         if ($nextEvent !== null) {
  278.             // Fetch all future events in the series, excluding the $nextEvent
  279.             $futureEvents $eventRepo->findAllFutureEventsExcluding($seriesTag$nextEvent->getId());
  280.             // Fetch all past events in the series, excluding the $nextEvent
  281.             $pastEvents $eventRepo->findAllPastEventsExcluding($seriesTag$nextEvent->getId());
  282.             // If the main event is multi-batch, get the next batch
  283.             if ($nextEvent->isMultiBatchEvent()) {
  284.                 $nextBatch $batchRepo->findNextOpenBatchByEvent($nextEvent);
  285.             }
  286.             // Get batch data for future and past events
  287.             $futureBatches $eventRepo->findAllFutureBatchesInSeries($seriesTag$nextEvent->getId());
  288.             $pastBatches $eventRepo->findAllPastBatchesInSeries($seriesTag$nextEvent->getId());
  289.             // Merge events and batches data for display
  290.             $futureEventsData $this->mergeEventsAndBatches($futureEvents$futureBatches);
  291.             $pastEventsData $this->mergeEventsAndBatches($pastEvents$pastBatches);
  292.         } else {
  293.             // No events are available, display alternative content or a message
  294.             $noEventsAvailable true;
  295.             $alternativeContent "Sorry, there are no events available for this series.";
  296.             $nextEvent = new Event();
  297.             $futureEvents = [];
  298.             $pastEvents = [];
  299.             // $alternativeContent can also be fetched from a repository if needed
  300.         }
  301.         return $this->render('@StartPlatzEventBundle/Default/event-series.html.twig', [
  302.             'event'             => $nextEvent,
  303.             'nextEvent'         => $nextEvent,          // The next or most recent event
  304.             'nextBatch'         => $nextBatch,          // The next batch for multi-batch events
  305.             'futureEvents'      => $futureEvents,    // Collection of future events, excluding $nextEvent
  306.             'pastEvents'        => $pastEvents,        // Collection of past events, excluding $nextEvent
  307.             'futureEventsData'  => $futureEventsData,  // Combined events and batches data for future
  308.             'pastEventsData'    => $pastEventsData,    // Combined events and batches data for past
  309.             'noEventsAvailable' => $noEventsAvailable,  // Flag for no events availability
  310.             'alternativeContent' => $alternativeContent// Alternative content when no events are available
  311.             'utmParameters'     => $utmParameters,
  312.             'showTeaser'         => $nextEvent->getTeaser() > '',
  313.             'batch'              => $nextBatch ?: new Batch(),
  314.             'application'        => new Application(),
  315.             'batchIsOpen'        => $nextBatch true false,
  316.             'seriesEvents'       => $futureEvents,
  317.             'promotionUrl'       => "/event-series/{$seriesTag}",
  318.             'templateVars'       => $this->eventCommonRepository->getStartPlatzEventBaseTemplateVars($request),
  319.             'speakers'           => $this->eventViewHelper->getSpeakers($nextEvent),
  320.             'lang' => $lang ?? "DE",  // Default to "DE" if $lang is not set
  321.             'menuLinksAndPhrases' => $this->menuTranslationService->getMenuLinksAndPhrases$request->server->get('REQUEST_URI')  ),
  322.         ]);
  323.     }
  324.     /**
  325.      * Merge events and batches data for display in series pages
  326.      * Combines single-batch events with multi-batch event batches
  327.      *
  328.      * @param array $events Array of Event entities
  329.      * @param array $batches Array of batch data from raw SQL query
  330.      * @return array Combined and sorted data
  331.      */
  332.     private function mergeEventsAndBatches(array $events, array $batches): array
  333.     {
  334.         $merged = [];
  335.         // Add single-batch events
  336.         foreach ($events as $event) {
  337.             if (!$event->isMultiBatchEvent()) {
  338.                 $merged[] = [
  339.                     'type' => 'event',
  340.                     'event' => $event,
  341.                     'date' => $event->getStartDate(),
  342.                     'endDate' => $event->getEndDate(),
  343.                     'title' => $event->getTitle(),
  344.                     'location' => $event->getLocation(),
  345.                     'slug' => $event->getSlug(),
  346.                     'trainer' => $event->getTrainer()
  347.                 ];
  348.             }
  349.         }
  350.         // Add batches (which are from multi-batch events)
  351.         foreach ($batches as $batch) {
  352.             $merged[] = [
  353.                 'type' => 'batch',
  354.                 'batch_id' => $batch['batch_id'],
  355.                 'event_id' => $batch['event_id'],
  356.                 'date' => new \DateTime($batch['batch_date']),
  357.                 'title' => $batch['event_title'],
  358.                 'batch_name' => $batch['batch_name'],
  359.                 'location' => $batch['location'],
  360.                 'event_slug' => $batch['event_slug'],
  361.                 'batch_slug' => $batch['batch_slug'],
  362.                 'trainer' => $batch['trainer']
  363.             ];
  364.         }
  365.         // Sort by date
  366.         usort($merged, function($a$b) {
  367.             return $a['date'] <=> $b['date'];
  368.         });
  369.         return $merged;
  370.     }
  371.     private function setFeedbackForm $targetPath$actionPath$email NULL ) {
  372.         return $this->formFactory->createNamedBuilder'feedback' )
  373.             ->setAction$actionPath )
  374.             ->add('targetPath'HiddenType::class, array( 'data' => $targetPath, ) )
  375.             ->add('email'TextType::class,  array( 'data' => $email'label' => '-''required' => false))
  376.             ->add('note'TextareaType::class, array( 'label' => '-''required' => true))
  377.             ->add('save'SubmitType::class,array('label'=>'Save'))
  378.             ->getForm();
  379.     }
  380.     #[Route('/events/list/month/{year}/{month}'name'events_list_month')]
  381.     public function listMonthAction($year$monthRequest $request)
  382.     {
  383.         $templateVars $this->eventCommonRepository->getStartPlatzEventBaseTemplateVars($request);
  384.         if (!isset($templateVars['tag'])) {
  385.             $templateVars['tag'] = '';
  386.         }
  387.         $queryString '';
  388.         if (isset($templateVars['tag']) and $tag $templateVars['tag']) {
  389.             $events $this->eventBaseRepository->getEventsByMonth($this->eventCommonRepository->setBaseCriteria($templateVars), $year$month);
  390.         } else {
  391.             $events $this->eventBaseRepository->getEventsByMonth($this->eventCommonRepository->setBaseCriteria($templateVars), $year$month);
  392.         }
  393.         $targetPath $request->server->get('REDIRECT_URL');
  394.         $lang $this->menuTranslationService->getLang($targetPath);
  395.         $menuLinksDe2En $this->menuTranslationService->getMenuLinksSwitcher();
  396.         return $this->render('@StartPlatzEventBundle/Default/list_month.html.twig', [
  397.             'templateVars' => $templateVars,
  398.             'events' => $events,
  399.             'month' => $month,
  400.             'year' => $year,
  401.             'targetPath'      => $targetPath,
  402.             'moreFutureEvents' => $this->eventBaseRepository->countFutureEvents($this->eventCommonRepository->setBaseCriteria($templateVars)),
  403.             'menuLinksDe2En' => $menuLinksDe2En,
  404.             'menuLinksEn2De' => array_flip($menuLinksDe2En) ,
  405.             'menuPhrases'    => $this->menuTranslationService->getMenuPhrases($lang),
  406.             'menuLinks'      => $this->menuTranslationService->getMenuLinks($lang),
  407.             'footerPhrases'  => $this->menuTranslationService->getFooterPhrases($lang),
  408.             'footerLinks'    => $this->menuTranslationService->getFooterLinks($lang),
  409.             'lang'           => $lang,
  410.         ]);
  411.     }
  412.     /** redirecting routes */
  413.     #[Route('/event/corporate-services-event/')]
  414.     public function eventRedirectAction()
  415.     {
  416.         return $this->redirect($this->generateUrl('event_show_single', ['slug' => 'best-practice-digitalisierung']));
  417.     }
  418.     ### section signup starts here ###
  419.     #[Route('/ai-summer-school-single-ticket'name'ai-summer-school-single-ticket')]
  420.     public function aisummerschoolSingleTicketAction(Request $request)
  421.     {
  422.         $lang 'DE';
  423.         if ($targetPath $request->server->get('REDIRECT_URL')) {
  424.             $lang $this->menuTranslationService->getLang($targetPath);
  425.         }
  426.         return $this->render('@StartPlatzEventBundle/Default/ai-summer-school-single-ticket.html.twig', [
  427.             'menuLinksAndPhrases' => $this->menuTranslationService->getMenuLinksAndPhrases($request->server->get('REQUEST_URI')),
  428.             'lang'            => $lang,
  429.         ]);
  430.     }
  431.     #[Route('/ai-summer-school-firmen-pakete'name'ai-summer-school-firmen-pakete')]
  432.     public function aisummerschoolFirmenPaketeAction(Request $request)
  433.     {
  434.         $lang 'DE';
  435.         if ($targetPath $request->server->get('REDIRECT_URL')) {
  436.             $lang $this->menuTranslationService->getLang($targetPath);
  437.         }
  438.         return $this->render('@StartPlatzEventBundle/Default/ai-summer-school-firmen-pakete.html.twig', [
  439.             'menuLinksAndPhrases' => $this->menuTranslationService->getMenuLinksAndPhrases($request->server->get('REQUEST_URI')),
  440.             'lang'            => $lang,
  441.         ]);
  442.     }
  443.     #[Route('/ai-summer-school-stipendien'name'ai-summer-school-stipendien')]
  444.     public function aisummerschoolStipendienAction(Request $request)
  445.     {
  446.         $lang 'DE';
  447.         if ($targetPath $request->server->get('REDIRECT_URL')) {
  448.             $lang $this->menuTranslationService->getLang($targetPath);
  449.         }
  450.         return $this->render('@StartPlatzEventBundle/Default/ai-summer-school-stipendien.html.twig', [
  451.             'menuLinksAndPhrases' => $this->menuTranslationService->getMenuLinksAndPhrases($request->server->get('REQUEST_URI')),
  452.             'lang'            => $lang,
  453.         ]);
  454.     }
  455.     #[Route('/ai-summer-school-volunteers'name'ai-summer-school-volunteers')]
  456.     public function aisummerschoolVolunteersAction(Request $request)
  457.     {
  458.         $lang 'DE';
  459.         if ($targetPath $request->server->get('REDIRECT_URL')) {
  460.             $lang $this->menuTranslationService->getLang($targetPath);
  461.         }
  462.         return $this->render('@StartPlatzEventBundle/Default/ai-summer-school-volunteers.html.twig', [
  463.             'menuLinksAndPhrases' => $this->menuTranslationService->getMenuLinksAndPhrases($request->server->get('REQUEST_URI')),
  464.             'lang'            => $lang,
  465.         ]);
  466.     }
  467.     #[Route('/ai-summer-school-sponsoring'name'ai-summer-school-sponsoring')]
  468.     public function aisummerschoolSponsoringAction(Request $request)
  469.     {
  470.         $lang 'DE';
  471.         if ($targetPath $request->server->get('REDIRECT_URL')) {
  472.             $lang $this->menuTranslationService->getLang($targetPath);
  473.         }
  474.         return $this->render('@StartPlatzEventBundle/Default/ai-summer-school-sponsoring.html.twig', [
  475.             'menuLinksAndPhrases' => $this->menuTranslationService->getMenuLinksAndPhrases($request->server->get('REQUEST_URI')),
  476.             'lang'            => $lang,
  477.         ]);
  478.     }
  479.     #[Route('/archiv/event/{slug}/'name'event_archiv_show')]
  480.     public function showAction(Request $request$slug)
  481.     {
  482.         if ($slug == '22-rheinland-pitch-mai-2015-2015-04-27-1430300112') {
  483.             return $this->redirect($this->generateUrl('event_archiv_show', ['slug' => '23-rheinland-pitch-juni-2015-finale-duesseldorf']));
  484.         }
  485.         if ($slug == 'rheinland-pitch') {
  486.             return $this->redirect($this->generateUrl('event_archiv_show', ['slug' => '01-rheinland-pitch-april-2013']));
  487.         }
  488.         if ($slug == 'rheinland-pitch-mai') {
  489.             return $this->redirect($this->generateUrl('event_archiv_show', ['slug' => '02-rheinland-pitch-mai-2013']));
  490.         }
  491.         if ($slug == 'rheinland-pitch-juni') {
  492.             return $this->redirect($this->generateUrl('event_archiv_show', ['slug' => '03-rheinland-pitch-juni-2013']));
  493.         }
  494.         if ($slug == 'rheinland-pitch-august') {
  495.             return $this->redirect($this->generateUrl('event_archiv_show', ['slug' => '05-rheinland-pitch-august-2013']));
  496.         }
  497.         if ($slug == 'rheinland-pitch-september') {
  498.             return $this->redirect($this->generateUrl('event_archiv_show', ['slug' => '06-rheinland-pitch-september-2013']));
  499.         }
  500.         if ($slug == 'rheinland-pitch-oktober') {
  501.             return $this->redirect($this->generateUrl('event_archiv_show', ['slug' => '07-rheinland-pitch-oktober-2013']));
  502.         }
  503.         if ($slug == 'rheinland-pitch-november') {
  504.             return $this->redirect($this->generateUrl('event_archiv_show', ['slug' => '08-rheinland-pitch-november-2013']));
  505.         }
  506.         if ($slug == 'rheinland-pitch-januar') {
  507.             return $this->redirect($this->generateUrl('event_archiv_show', ['slug' => '09-rheinland-pitch-januar-2014']));
  508.         }
  509.         if ($slug == 'rheinland-pitch-februar') {
  510.             return $this->redirect($this->generateUrl('event_archiv_show', ['slug' => '10-rheinland-pitch-februar-2014']));
  511.         }
  512.         if ($slug == 'rheinland-pitch-marz') {
  513.             return $this->redirect($this->generateUrl('event_archiv_show', ['slug' => '11-rheinland-pitch-maerz-2014']));
  514.         }
  515.         if ($slug == 'rheinland-pitch-april') {
  516.             return $this->redirect($this->generateUrl('event_archiv_show', ['slug' => '12-rheinland-pitch-april-2014']));
  517.         }
  518.         if ($slug == 'rheinland-pitch-mai-3') {
  519.             return $this->redirect($this->generateUrl('event_archiv_show', ['slug' => '13-rheinland-pitch-mai-2014']));
  520.         }
  521.         if ($slug == 'rheinland-pitch-juni-2') {
  522.             return $this->redirect($this->generateUrl('event_archiv_show', ['slug' => '14-rheinland-pitch-juni-2014']));
  523.         }
  524.         if ($slug == '22-rheinland-pitch-mai-2015-2015-04-27') {
  525.             return $this->redirect($this->generateUrl('event_archiv_show', ['slug' => '22-rheinland-pitch-mai-2015']));
  526.         }
  527.         $templateVars $this->eventCommonRepository->getStartPlatzEventBaseTemplateVars($request);
  528.         if (!$event $this->entityManager->getRepository(Event::class)->findOneBy(['slug' => $slug])) {
  529.             $querySlug '/' $slug;
  530.             if (!$event $this->entityManager->getRepository(Event::class)->findOneBy(['slug' => $querySlug])) {
  531.                 $this->session->getFlashBag()->add('notice''ERROR Veranstaltung nicht gefunden');
  532.                 return $this->redirect($this->generateUrl('events_list'));
  533.             } else {
  534.                 $em $this->entityManager;
  535.                 $event->setSlug($slug);
  536.                 $em->persist($event);
  537.                 $em->flush();
  538.             }
  539.         }
  540.         if ($event->getStatus() != 'publish') {
  541.             if (!$this->getUser()) {
  542.                 return $this->redirect($this->generateUrl('events_list'$templateVars));
  543.             }
  544.         }
  545.         //previous @StartPlatzEventBundle/Default/show.html.twig
  546.         return $this->render('@StartPlatzEventBundle/Default/event-single.html.twig', [
  547.             'templateVars' => $templateVars,
  548.             'event'        => $event,
  549.             'batch'        => false,
  550.             'speakers'     => [],
  551.             'menuLinksAndPhrases' => $this->menuTranslationService->getMenuLinksAndPhrases($request->server->get('REQUEST_URI')),
  552.         ]);
  553.     }
  554.     /**
  555.      */
  556.     public function eventsThisWeekAction()
  557.     {
  558.         $year date('Y');
  559.         $month date('m');
  560.         $moreFutureEvents $this->eventBaseRepository->getEventsByWeek($this->eventCommonRepository->setBaseCriteria([]), $year$month);
  561.         return $this->render('@StartPlatzEventBundle/Default/events_this_week.html.twig', [
  562.             'moreFutureEvents' => $moreFutureEvents,
  563.         ]);
  564.     }
  565.     private function getRedirects()
  566.     {
  567.         return [
  568.             'Best-Practice-Digitalisierung-Januar-2018' => 'best-practice-digitalisierung',
  569.             'best-practice-digitalisierung-3' => 'best-practice-digitalisierung',
  570.             'adwords-fuer-einsteiger-' => 'adwords-fuer-einsteiger-koeln-2017-01-24',
  571.             'adwords-fur-einsteiger-'  => 'adwords-fuer-einsteiger-koeln-2016-06-06',
  572.             'adwords-fur-einsteiger-DUS' => 'adwords-fuer-einsteiger-dus-2016-06-07',
  573.             '-adwords-fuer-einsteiger' => 'adwords-fur-einsteiger',
  574.             'adwords-fur-einsteiger-2016-02-16' => 'adwords-fuer-einsteiger-koeln-2016-02-16',
  575.             'digital-networking-week-1611257320' => 'digital-networking-week',
  576.             'chatgpt3-how-to-prompt-duesseldorf' => 'chatgpt-how-to-prompt-duesseldorf'
  577.         ];
  578.     }
  579.     #[Route('/sntm'name'legacy_sntm_redirect')]
  580.     #[Route('/sntm/{path}'name'legacy_sntm_redirect_sub'requirements: ['path' => '.+'])]
  581.     public function sntmRedirectAction(): Response
  582.     {
  583.         return $this->redirect($this->generateUrl('events_list'), 301);
  584.     }
  585.     #[Route('/mg2019'name'legacy_mg2019_redirect')]
  586.     #[Route('/mg2019/{path}'name'legacy_mg2019_redirect_sub'requirements: ['path' => '.+'])]
  587.     public function mg2019RedirectAction(): Response
  588.     {
  589.         return $this->redirect($this->generateUrl('events_list'), 301);
  590.     }
  591. }