<?php
namespace App\EventListener;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\Extension\Core\Type\FormType;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormRendererInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
class FormThemeExtensionListener extends AbstractTypeExtension implements EventSubscriberInterface
{
private FormRendererInterface $form;
private bool $isBackofficeInde = false;
private bool $isBackofficeAdmin = false;
public function __construct(FormRendererInterface $form)
{
$this->form = $form;
}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::REQUEST => 'onKernelRequest',
];
}
public function onKernelRequest(RequestEvent $event)
{
$routeName = $event->getRequest()->attributes->get('_route', '');
// logic to determine this is a backoffice admin route
if (substr($routeName, 0, 10) === 'backoffice') {
$this->isBackofficeInde = true;
}elseif (substr($routeName, 0, 5) === 'admin') {
$this->isBackofficeAdmin = true;
}
}
public function buildView(FormView $view, FormInterface $form, array $options)
{
if ($form->getParent() instanceof FormInterface) {
// don't modify child forms, just the root
return;
}
if ($this->isBackofficeInde) {
return $this->form
->setTheme($view, 'form/backoffice_form_layout.html.twig');
}
if ($this->isBackofficeAdmin) {
return $this->form
->setTheme($view, 'form/backoffice_admin_form_layout.html.twig');
}
return $this->form
->setTheme($view, 'form/front_form_layout.html.twig');
}
public static function getExtendedTypes(): iterable
{
// extend base form type(FormType)
return [FormType::class];
}
}