<?php
namespace App\Controller\Custom;
use App\Entity\Menu;
use Doctrine\ORM\EntityManagerInterface;
use Sylius\Component\Taxonomy\Repository\TaxonRepositoryInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class MenuController extends AbstractController
{
/** @var TaxonRepositoryInterface */
protected TaxonRepositoryInterface $taxonRepository;
/** @var EntityManagerInterface */
protected EntityManagerInterface $em;
/**
* @param TaxonRepositoryInterface $taxonRepository
* @param EntityManagerInterface $em
*/
public function __construct(TaxonRepositoryInterface $taxonRepository, EntityManagerInterface $em)
{
$this->taxonRepository = $taxonRepository;
$this->em = $em;
}
/**
* @param Request $request
* @param string $type
* @return Response
*/
public function renderMenu(Request $request, string $type): Response
{
$locale = $request->getLocale();
$menu = [
'products' => $this->taxonRepository->findAll(),
'commercial_agreements' => [
'url' => '',
'parents' => []
],
'partners' => [
'url' => '',
'parents' => []
]
];
// Commercial Agreements
$commercialAgreements = $this->em->getRepository(Menu::class)->findBy(['category' => 1]);
foreach ($commercialAgreements as $agreement) {
$url = $agreement->getPage() ?
$this->generateUrl('monsieurbiz_cms_page_show', ['slug' => $agreement->getPage()->getTranslation($locale)->getSlug()]) :
null
;
$menu['commercial_agreements']['parents'][$agreement->getId()] = [
'id' => $agreement->getId(),
'name' => $agreement->getName(),
'position' => $agreement->getPosition(),
'url' => $url
];
foreach ($agreement->getChildren() as $child) {
$url = $child->getPage() ?
$this->generateUrl(
'monsieurbiz_cms_page_show',
['slug' => $child->getPage()->getTranslation($locale)->getSlug()],
UrlGeneratorInterface::ABSOLUTE_URL
) :
null
;
$menu['commercial_agreements']['parents'][$agreement->getId()]['children'][$child->getId()] = [
'id' => $child->getId(),
'name' => $child->getName(),
'position' => $child->getPosition(),
'url' => $url
];
}
}
// Partners
$partners = $this->em->getRepository(Menu::class)->findBy(['category' => 2]);
foreach ($partners as $partner) {
$url = $partner->getPage() ?
$this->generateUrl(
'monsieurbiz_cms_page_show',
['slug' => $partner->getPage()->getTranslation($locale)->getSlug()],
UrlGeneratorInterface::ABSOLUTE_URL
) :
null
;
$menu['partners']['parents'][$partner->getId()] = [
'id' => $partner->getId(),
'name' => $partner->getName(),
'position' => $partner->getPosition(),
'url' => $url
];
foreach ($partner->getChildren() as $child) {
$url = $child->getPage() ?
$this->generateUrl(
'monsieurbiz_cms_page_show',
['slug' => $child->getPage()->getTranslation($locale)->getSlug()],
UrlGeneratorInterface::ABSOLUTE_URL
) :
null
;
$menu['partners']['parents'][$partner->getId()]['children'][] = [
'id' => $child->getId(),
'name' => $child->getName(),
'position' => $child->getPosition(),
'url' => $url
];
}
}
$template = $type === 'top' ?
'bundles/SyliusShopBundle/Layout/TopMenu/_top_menu.html.twig' :
'bundles/SyliusShopBundle/Layout/TopMenu/_sidebar_menu.html.twig'
;
return $this->render($template, [
'menu' => $menu ?? []
]);
}
}