<?php
namespace App\EventSubscriber;
use App\Entity\Contact\Contact;
use App\Entity\Page;
use App\Repository\PageRepository;
use Doctrine\Common\Annotations\AnnotationReader;
use Doctrine\Common\Annotations\Reader;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityManagerInterface;
use Psr\Container\ContainerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpKernel\KernelEvents;
use Twig\Environment;
use WhiteOctober\BreadcrumbsBundle\Model\Breadcrumbs;
class KernelSubscriber implements EventSubscriberInterface
{
const ANNOTATION_EXCLUDE_CMS = "App\Annotation\ExcludeCms";
/**
* @var ContainerInterface
*/
private $container;
/**
* @var EntityManager
*/
private $entityManager;
/**
* @var Environment
*/
private $twig;
/**
* @var Breadcrumbs
*/
private $breadcrumbs;
/**
* @var AnnotationReader
*/
private $annotationReader;
/**
* @var PageRepository
*/
private $pageRepository;
public function __construct(ContainerInterface $container, EntityManagerInterface $entityManager, Environment $twig, Breadcrumbs $breadcrumbs, Reader $annotationReader, PageRepository $pageRepository)
{
$this->container = $container;
$this->entityManager = $entityManager;
$this->twig = $twig;
$this->breadcrumbs = $breadcrumbs;
$this->annotationReader = $annotationReader;
$this->pageRepository = $pageRepository;
}
public static function getSubscribedEvents()
{
return [
KernelEvents::CONTROLLER => [
['initTwigGlobals', 5],
['process', 10],
['countNotifications', 20],
]
];
}
public function initTwigGlobals(){
$days = [1 => "Lundi", 2 => "Mardi", 3 => "Mercredi", 4 => "Jeudi", 5 => "Vendredi", 6 => "Samedi", 7 => "Dimanche"];
$this->twig->addGlobal("frenchWeekDays", $days);
}
public function process(FilterControllerEvent $event)
{
$request = $event->getRequest();
/*$url = $request->getUri();
if (!empty($url) && $url[-1] === '/') {
}*/
$routeName = $request->attributes->get('_route');
if (!in_array($routeName, ["frontend_page", "frontend_home", "frontend_page_parent", "frontend_page_parent_parent", "frontend_page_parent_payment_return"])) {
return;
}
$slug = $request->attributes->get('slug');
$slugParent = $request->attributes->get('slugParent');
$slugParentParent = $request->attributes->get('slugParentParent');
$slug = ($slug == null) ? "" : $slug;
if ($slugParent) {
if($slugParentParent){
$page = $this->pageRepository->findWithParentParent($slug, $slugParent, $slugParentParent);
}
else{
$page = $this->pageRepository->findWithParent($slug, $slugParent);
}
}
else {
$page = $this->pageRepository->findOneBy(['slug' => $slug, 'isPublished' => 1]);
}
if (!$page) {
throw new NotFoundHttpException("page was not found");
}
if ($page->getParent() && !$slugParent) {
throw new NotFoundHttpException("page was not found");
}
$this->twig->addGlobal('dbPage', $page);
$this->breadcrumbs->addRouteItem("Accueil", 'frontend_home');
if ($slugParentParent != null && $slugParent != null) {
$this->breadcrumbs->addRouteItem($page->getParent()->getParent()->getTitle(), 'frontend_page', ['slug' => $slugParentParent]);
$this->breadcrumbs->addRouteItem($page->getParent()->getTitle(), 'frontend_page_parent', ['slug' => $slugParent, 'slugParent' => $slugParentParent]);
}
if ($slugParentParent == null && $slugParent != null) {
$this->breadcrumbs->addRouteItem($page->getParent()->getTitle(), 'frontend_page', ['slug' => $slugParent]);
}
$this->breadcrumbs->addItem($page->getTitle());
if ($page->getControllerPath() == null) {
return;
}
$controllerName = $page->getControllerPath();
list($class, $method) = explode('::', $controllerName, 2);
if (!$this->container->has($class)) {
throw new \LogicException("controller was not found");
}
$controller = [$this->container->get($class), $method];
$request->attributes->set('_controller', $controllerName);
$request->attributes->set('dbPage', $page);
$event->setController($controller);
}
public function countNotifications(FilterControllerEvent $event)
{
$request = $event->getRequest();
if (strpos($request->getRequestUri(), $this->container->getParameter('app.back_office_path')) === false) {
return;
}
$countContactsUntreated = $this->entityManager->getRepository(Contact::class)->countByType("untreated");
$this->twig->addGlobal('totalContactsUntreated', $countContactsUntreated);
}
public function parentBreadCrumbs(Page $page)
{
if ($parent = $page->getParent()) {
$this->parentBreadCrumbs($parent);
}
$this->breadcrumbs->addRouteItem($page->getTitle(), 'frontend_page', ['slug' => $page->getSlug()]);
}
}