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.      * Public partners overview — /partners (Layer 1)
  87.      *
  88.      * Uses Partner entity (sp_team_partners) with category filter and rating sort.
  89.      */
  90.     #[Route('/partners'name'public_partners_index')]
  91.     #[Route('/en/partners'name'public_partners_index_en')]
  92.     public function partnersOverviewAction(Request $request): Response
  93.     {
  94.         $isEnglish str_contains($request->getPathInfo(), '/en/');
  95.         $language $isEnglish 'en' 'de';
  96.         // Build filters
  97.         $filters = ['active' => true];
  98.         $category $request->query->get('category');
  99.         if ($category && array_key_exists($categoryPartner::PUBLIC_CATEGORIES)) {
  100.             $filters['publicCategory'] = $category;
  101.         }
  102.         // Fetch partners sorted by rating
  103.         $result $this->partnerRepository->findWithPagination($filters1200'rating');
  104.         $partners $result['items'];
  105.         // Serialize for template
  106.         $partnersData = [];
  107.         foreach ($partners as $partner) {
  108.             $data $this->partnerService->serializePartnerEntity($partner$language);
  109.             // Add fields expected by card partial
  110.             $data['description'] = $data['bio'];
  111.             $data['teamMetadata'] = $partner->getMetadata() ?? [];
  112.             $partnersData[] = $data;
  113.         }
  114.         // Category data for filter buttons
  115.         $categories $isEnglish Partner::PUBLIC_CATEGORIES_EN Partner::PUBLIC_CATEGORIES;
  116.         return $this->render('@StartPlatzPartners/Public/partners-index.html.twig', [
  117.             'partners' => $partnersData,
  118.             'language' => $language,
  119.             'categories' => $categories,
  120.             'activeCategory' => $category,
  121.         ]);
  122.     }
  123.     // /partners/{slug} is now handled by PartnerPublicDetailController (Layer 2 with signals)
  124.     /**
  125.      * Partner detail page
  126.      *
  127.      * Shows detailed information about a single partner.
  128.      * Supports both new Partner entity and legacy Page-based partners.
  129.      */
  130.     #[Route('/accelerator/partners/{slug}'name'public_partner_detail'requirements: ['slug' => '[a-z0-9_\-]+'])]
  131.     #[Route('/en/accelerator/partners/{slug}'name'public_partner_detail_en'requirements: ['slug' => '[a-z0-9_\-]+'])]
  132.     public function partnerDetailAction(string $slugRequest $request): Response
  133.     {
  134.         $isEnglish str_contains($request->getPathInfo(), '/en/');
  135.         $language $request->query->get('lang'$isEnglish 'en' 'de');
  136.         // Try to find Partner Entity first
  137.         /** @var PartnerRepository $partnerRepository */
  138.         $partnerRepository $this->em->getRepository(Partner::class);
  139.         $partner $partnerRepository->findBySlug($slug);
  140.         $partnerData null;
  141.         $team null;
  142.         if ($partner) {
  143.             $team $partner->getTeam();
  144.             // Prepare partner data
  145.             $metadata $partner->getMetadata() ?? [];
  146.             $partnerData = [
  147.                 'id' => $partner->getId(),
  148.                 'name' => $partner->getDisplayName(),
  149.                 'slug' => $partner->getSlug(),
  150.                 'description' => $partner->getDescriptionShort(),
  151.                 'descriptionLong' => $language === 'en' && $partner->getDescriptionLongEn()
  152.                     ? $partner->getDescriptionLongEn()
  153.                     : $partner->getDescriptionLong(),
  154.                 'descriptionLongHtml' => $language === 'en' && $partner->getDescriptionLongHtmlEn()
  155.                     ? $partner->getDescriptionLongHtmlEn()
  156.                     : $partner->getDescriptionLongHtml(),
  157.                 'logo' => $partner->getLogoOverride() ?? ($team $team->getLogoURL() : null),
  158.                 'homepage' => $metadata['website'] ?? null,
  159.                 'publicCategoryLabel' => $partner->getPublicCategoryLabel($language),
  160.                 'contentTags' => $partner->getContentTags(),
  161.             ];
  162.         } else {
  163.             // Fallback: Legacy Page-based partner
  164.             $pageRepository $this->em->getRepository(Page::class);
  165.             $page $pageRepository->findOneBy([
  166.                 'slug' => $slug,
  167.                 'category' => 'Partner',
  168.             ]);
  169.             if ($page) {
  170.                 $partnerData $this->partnerService->serializePage($page$language);
  171.                 $partnerData['descriptionLong'] = $language === 'en' && $page->getDescriptionEN()
  172.                     ? $page->getDescriptionEN()
  173.                     : $page->getDescription();
  174.             }
  175.         }
  176.         if (!$partnerData) {
  177.             throw $this->createNotFoundException('Partner not found');
  178.         }
  179.         // Get menu from WordPress
  180.         $menu $this->menuService->getAcceleratorMenu($isEnglish$request->getPathInfo());
  181.         return $this->render('@StartPlatzPartners/Public/partner-detail.html.twig', [
  182.             'partner' => $partnerData,
  183.             'language' => $language,
  184.             'menu' => $menu,
  185.         ]);
  186.     }
  187. }