src/StartPlatz/Bundle/PartnersBundle/Controller/PublicController.php line 45

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace App\StartPlatz\Bundle\PartnersBundle\Controller;
  3. use App\StartPlatz\Bundle\AlphaBundle\Entity\Page;
  4. use App\StartPlatz\Bundle\MentorsBundle\Service\WordPressMenuService;
  5. use App\StartPlatz\Bundle\PartnersBundle\Entity\Partner;
  6. use App\StartPlatz\Bundle\PartnersBundle\Repository\PartnerRepository;
  7. use App\StartPlatz\Bundle\PartnersBundle\Service\PartnerService;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  10. use Symfony\Component\HttpFoundation\Request;
  11. use Symfony\Component\HttpFoundation\Response;
  12. use Symfony\Component\Routing\Annotation\Route;
  13. /**
  14.  * PublicController
  15.  *
  16.  * Public-facing partner pages
  17.  */
  18. class PublicController extends AbstractController
  19. {
  20.     private PartnerService $partnerService;
  21.     private EntityManagerInterface $em;
  22.     private PartnerRepository $partnerRepository;
  23.     private WordPressMenuService $menuService;
  24.     public function __construct(
  25.         PartnerService $partnerService,
  26.         EntityManagerInterface $em,
  27.         PartnerRepository $partnerRepository,
  28.         WordPressMenuService $menuService
  29.     ) {
  30.         $this->partnerService $partnerService;
  31.         $this->em $em;
  32.         $this->partnerRepository $partnerRepository;
  33.         $this->menuService $menuService;
  34.     }
  35.     /**
  36.      * Accelerator Partners page - shows all partners directly
  37.      */
  38.     #[Route('/accelerator/partners'name'public_partners_overview')]
  39.     #[Route('/en/accelerator/partners'name'public_partners_overview_en')]
  40.     public function overviewAction(Request $request): Response
  41.     {
  42.         $isEnglish str_contains($request->getPathInfo(), '/en/');
  43.         $language $isEnglish 'en' 'de';
  44.         // Fetch active Partner entities
  45.         $partners $this->partnerRepository->findBy(
  46.             ['isActive' => true],
  47.             ['displayName' => 'ASC']
  48.         );
  49.         // Prepare partner data arrays
  50.         $partnersData = [];
  51.         foreach ($partners as $partner) {
  52.             $team $partner->getTeam();
  53.             // Decode HTML entities in description
  54.             $description $partner->getDescriptionShort();
  55.             if ($description) {
  56.                 $description html_entity_decode($descriptionENT_QUOTES ENT_HTML5'UTF-8');
  57.             }
  58.             $partnerData = [
  59.                 'id' => $partner->getId(),
  60.                 'name' => $partner->getDisplayName(),
  61.                 'displayNameEn' => $partner->getDisplayNameEn(),
  62.                 'description' => $description,
  63.                 'logo' => $partner->getLogoOverride() ?? ($team $team->getLogoURL() : null),
  64.                 'tags' => $partner->getTags() ?? '',
  65.                 'teamMetadata' => $partner->getMetadata() ?? [],
  66.                 'slug' => $partner->getSlug(),
  67.                 // New fields for simplified card
  68.                 'publicCategoryLabel' => $partner->getPublicCategoryLabel($language),
  69.                 'contentTags' => $partner->getContentTags(),
  70.             ];
  71.             $partnersData[] = $partnerData;
  72.         }
  73.         // Get menu from WordPress
  74.         $menu $this->menuService->getAcceleratorMenu($isEnglish$request->getPathInfo());
  75.         return $this->render('@StartPlatzPartners/Public/accelerator-partners.html.twig', [
  76.             'partners' => $partnersData,
  77.             'language' => $language,
  78.             'pageTitle' => $isEnglish 'Partners' 'Partner',
  79.             'pageDescription' => $isEnglish
  80.                 'Our partners support the startup ecosystem and drive innovation forward'
  81.                 'Unsere Partner unterstützen das Startup-Ökosystem und treiben Innovation voran',
  82.             'menu' => $menu
  83.         ]);
  84.     }
  85.     /**
  86.      * Partner detail page
  87.      *
  88.      * Shows detailed information about a single partner.
  89.      * Supports both new Partner entity and legacy Page-based partners.
  90.      */
  91.     #[Route('/accelerator/partners/{slug}'name'public_partner_detail'requirements: ['slug' => '[a-z0-9\-]+'])]
  92.     #[Route('/en/accelerator/partners/{slug}'name'public_partner_detail_en'requirements: ['slug' => '[a-z0-9\-]+'])]
  93.     public function partnerDetailAction(string $slugRequest $request): Response
  94.     {
  95.         $isEnglish str_contains($request->getPathInfo(), '/en/');
  96.         $language $request->query->get('lang'$isEnglish 'en' 'de');
  97.         // Try to find Partner Entity first
  98.         /** @var PartnerRepository $partnerRepository */
  99.         $partnerRepository $this->em->getRepository(Partner::class);
  100.         $partner $partnerRepository->findBySlug($slug);
  101.         $partnerData null;
  102.         $team null;
  103.         if ($partner) {
  104.             $team $partner->getTeam();
  105.             // Prepare partner data
  106.             $metadata $partner->getMetadata() ?? [];
  107.             $partnerData = [
  108.                 'id' => $partner->getId(),
  109.                 'name' => $partner->getDisplayName(),
  110.                 'slug' => $partner->getSlug(),
  111.                 'description' => $partner->getDescriptionShort(),
  112.                 'descriptionLong' => $language === 'en' && $partner->getDescriptionLongEn()
  113.                     ? $partner->getDescriptionLongEn()
  114.                     : $partner->getDescriptionLong(),
  115.                 'descriptionLongHtml' => $language === 'en' && $partner->getDescriptionLongHtmlEn()
  116.                     ? $partner->getDescriptionLongHtmlEn()
  117.                     : $partner->getDescriptionLongHtml(),
  118.                 'logo' => $partner->getLogoOverride() ?? ($team $team->getLogoURL() : null),
  119.                 'homepage' => $metadata['website'] ?? null,
  120.                 'publicCategoryLabel' => $partner->getPublicCategoryLabel($language),
  121.                 'contentTags' => $partner->getContentTags(),
  122.             ];
  123.         } else {
  124.             // Fallback: Legacy Page-based partner
  125.             $pageRepository $this->em->getRepository(Page::class);
  126.             $page $pageRepository->findOneBy([
  127.                 'slug' => $slug,
  128.                 'category' => 'Partner',
  129.             ]);
  130.             if ($page) {
  131.                 $partnerData $this->partnerService->serializePage($page$language);
  132.                 $partnerData['descriptionLong'] = $language === 'en' && $page->getDescriptionEN()
  133.                     ? $page->getDescriptionEN()
  134.                     : $page->getDescription();
  135.             }
  136.         }
  137.         if (!$partnerData) {
  138.             throw $this->createNotFoundException('Partner not found');
  139.         }
  140.         // Get menu from WordPress
  141.         $menu $this->menuService->getAcceleratorMenu($isEnglish$request->getPathInfo());
  142.         return $this->render('@StartPlatzPartners/Public/partner-detail.html.twig', [
  143.             'partner' => $partnerData,
  144.             'language' => $language,
  145.             'menu' => $menu,
  146.         ]);
  147.     }
  148. }