<?php declare(strict_types=1);
namespace App\StartPlatz\Bundle\PartnersBundle\Controller;
use App\StartPlatz\Bundle\AlphaBundle\Entity\Page;
use App\StartPlatz\Bundle\MentorsBundle\Service\WordPressMenuService;
use App\StartPlatz\Bundle\PartnersBundle\Entity\Partner;
use App\StartPlatz\Bundle\PartnersBundle\Repository\PartnerRepository;
use App\StartPlatz\Bundle\PartnersBundle\Service\PartnerService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
/**
* PublicController
*
* Public-facing partner pages
*/
class PublicController extends AbstractController
{
private PartnerService $partnerService;
private EntityManagerInterface $em;
private PartnerRepository $partnerRepository;
private WordPressMenuService $menuService;
public function __construct(
PartnerService $partnerService,
EntityManagerInterface $em,
PartnerRepository $partnerRepository,
WordPressMenuService $menuService
) {
$this->partnerService = $partnerService;
$this->em = $em;
$this->partnerRepository = $partnerRepository;
$this->menuService = $menuService;
}
/**
* Accelerator Partners page - shows all partners directly
*/
#[Route('/accelerator/partners', name: 'public_partners_overview')]
#[Route('/en/accelerator/partners', name: 'public_partners_overview_en')]
public function overviewAction(Request $request): Response
{
$isEnglish = str_contains($request->getPathInfo(), '/en/');
$language = $isEnglish ? 'en' : 'de';
// Fetch active Partner entities
$partners = $this->partnerRepository->findBy(
['isActive' => true],
['displayName' => 'ASC']
);
// Prepare partner data arrays
$partnersData = [];
foreach ($partners as $partner) {
$team = $partner->getTeam();
// Decode HTML entities in description
$description = $partner->getDescriptionShort();
if ($description) {
$description = html_entity_decode($description, ENT_QUOTES | ENT_HTML5, 'UTF-8');
}
$partnerData = [
'id' => $partner->getId(),
'name' => $partner->getDisplayName(),
'displayNameEn' => $partner->getDisplayNameEn(),
'description' => $description,
'logo' => $partner->getLogoOverride() ?? ($team ? $team->getLogoURL() : null),
'tags' => $partner->getTags() ?? '',
'teamMetadata' => $partner->getMetadata() ?? [],
'slug' => $partner->getSlug(),
// New fields for simplified card
'publicCategoryLabel' => $partner->getPublicCategoryLabel($language),
'contentTags' => $partner->getContentTags(),
];
$partnersData[] = $partnerData;
}
// Get menu from WordPress
$menu = $this->menuService->getAcceleratorMenu($isEnglish, $request->getPathInfo());
return $this->render('@StartPlatzPartners/Public/accelerator-partners.html.twig', [
'partners' => $partnersData,
'language' => $language,
'pageTitle' => $isEnglish ? 'Partners' : 'Partner',
'pageDescription' => $isEnglish
? 'Our partners support the startup ecosystem and drive innovation forward'
: 'Unsere Partner unterstützen das Startup-Ökosystem und treiben Innovation voran',
'menu' => $menu
]);
}
/**
* Partner detail page
*
* Shows detailed information about a single partner.
* Supports both new Partner entity and legacy Page-based partners.
*/
#[Route('/accelerator/partners/{slug}', name: 'public_partner_detail', requirements: ['slug' => '[a-z0-9\-]+'])]
#[Route('/en/accelerator/partners/{slug}', name: 'public_partner_detail_en', requirements: ['slug' => '[a-z0-9\-]+'])]
public function partnerDetailAction(string $slug, Request $request): Response
{
$isEnglish = str_contains($request->getPathInfo(), '/en/');
$language = $request->query->get('lang', $isEnglish ? 'en' : 'de');
// Try to find Partner Entity first
/** @var PartnerRepository $partnerRepository */
$partnerRepository = $this->em->getRepository(Partner::class);
$partner = $partnerRepository->findBySlug($slug);
$partnerData = null;
$team = null;
if ($partner) {
$team = $partner->getTeam();
// Prepare partner data
$metadata = $partner->getMetadata() ?? [];
$partnerData = [
'id' => $partner->getId(),
'name' => $partner->getDisplayName(),
'slug' => $partner->getSlug(),
'description' => $partner->getDescriptionShort(),
'descriptionLong' => $language === 'en' && $partner->getDescriptionLongEn()
? $partner->getDescriptionLongEn()
: $partner->getDescriptionLong(),
'descriptionLongHtml' => $language === 'en' && $partner->getDescriptionLongHtmlEn()
? $partner->getDescriptionLongHtmlEn()
: $partner->getDescriptionLongHtml(),
'logo' => $partner->getLogoOverride() ?? ($team ? $team->getLogoURL() : null),
'homepage' => $metadata['website'] ?? null,
'publicCategoryLabel' => $partner->getPublicCategoryLabel($language),
'contentTags' => $partner->getContentTags(),
];
} else {
// Fallback: Legacy Page-based partner
$pageRepository = $this->em->getRepository(Page::class);
$page = $pageRepository->findOneBy([
'slug' => $slug,
'category' => 'Partner',
]);
if ($page) {
$partnerData = $this->partnerService->serializePage($page, $language);
$partnerData['descriptionLong'] = $language === 'en' && $page->getDescriptionEN()
? $page->getDescriptionEN()
: $page->getDescription();
}
}
if (!$partnerData) {
throw $this->createNotFoundException('Partner not found');
}
// Get menu from WordPress
$menu = $this->menuService->getAcceleratorMenu($isEnglish, $request->getPathInfo());
return $this->render('@StartPlatzPartners/Public/partner-detail.html.twig', [
'partner' => $partnerData,
'language' => $language,
'menu' => $menu,
]);
}
}