diff --git a/src/Entity/Site/Menu.php b/src/Entity/Site/Menu.php index 1434a28..dea0a1d 100644 --- a/src/Entity/Site/Menu.php +++ b/src/Entity/Site/Menu.php @@ -138,4 +138,9 @@ class Menu implements EntityInterface return $this; } + + public function getRouteName(): string + { + return $this->getNavigation()->getRouteName().'_'.($this->getCode() ? $this->getCode() : $this->getId()); + } } diff --git a/src/Entity/Site/Navigation.php b/src/Entity/Site/Navigation.php index 421dbf3..a71bd27 100644 --- a/src/Entity/Site/Navigation.php +++ b/src/Entity/Site/Navigation.php @@ -119,4 +119,9 @@ class Navigation implements EntityInterface return $this; } + + public function getRouteName(): string + { + return $this->getCode() ? $this->getCode() : 'navigation_'.$this->getId(); + } } diff --git a/src/Entity/Site/Node.php b/src/Entity/Site/Node.php index b0b08f4..6c716cc 100644 --- a/src/Entity/Site/Node.php +++ b/src/Entity/Site/Node.php @@ -92,6 +92,11 @@ class Node implements EntityInterface */ private $page; + /** + * @ORM\Column(type="string", length=255, nullable=true) + */ + private $code; + public function __construct() { $this->children = new ArrayCollection(); @@ -279,4 +284,21 @@ class Node implements EntityInterface return $this; } + + public function getRouteName(): string + { + return $this->getMenu()->getRouteName().'_'.($this->getCode() ? $this->getCode() : $this->getId()); + } + + public function getCode(): ?string + { + return $this->code; + } + + public function setCode(?string $code): self + { + $this->code = $code; + + return $this; + } } diff --git a/src/EventSuscriber/Site/MenuEventSubscriber.php b/src/EventSuscriber/Site/MenuEventSubscriber.php index 855b25f..ee547b3 100644 --- a/src/EventSuscriber/Site/MenuEventSubscriber.php +++ b/src/EventSuscriber/Site/MenuEventSubscriber.php @@ -9,6 +9,7 @@ use App\EventSuscriber\EntityManagerEventSubscriber; use App\Factory\Site\NodeFactory; use App\Manager\EntityManager; use App\Repository\Site\NodeRepository; +use App\Slugify\CodeSlugify; /** * class MenuEventSubscriber. @@ -18,16 +19,20 @@ use App\Repository\Site\NodeRepository; class MenuEventSubscriber extends EntityManagerEventSubscriber { protected NodeFactory $nodeFactory; + protected NodeRepository $nodeRepository; protected EntityManager $entityManager; + protected CodeSlugify $slugify; public function __construct( NodeFactory $nodeFactory, NodeRepository $nodeRepository, - EntityManager $entityManager + EntityManager $entityManager, + CodeSlugify $slugify ) { $this->nodeFactory = $nodeFactory; $this->nodeRepository = $nodeRepository; $this->entityManager = $entityManager; + $this->slugify = $slugify; } public function support(EntityInterface $entity) @@ -35,6 +40,16 @@ class MenuEventSubscriber extends EntityManagerEventSubscriber return $entity instanceof Menu; } + public function onPreUpdate(EntityManagerEvent $event) + { + if (!$this->support($event->getEntity())) { + return; + } + + $menu = $event->getEntity(); + $menu->setCode($this->slugify->slugify($menu->getCode())); + } + public function onCreate(EntityManagerEvent $event) { if (!$this->support($event->getEntity())) { @@ -69,4 +84,9 @@ class MenuEventSubscriber extends EntityManagerEventSubscriber { return $this->onCreate($event); } + + public function onPreCreate(EntityManagerEvent $event) + { + return $this->onPreUpdate($event); + } } diff --git a/src/EventSuscriber/Site/NavigationEventSubscriber.php b/src/EventSuscriber/Site/NavigationEventSubscriber.php new file mode 100644 index 0000000..8b11922 --- /dev/null +++ b/src/EventSuscriber/Site/NavigationEventSubscriber.php @@ -0,0 +1,46 @@ + + */ +class NavigationEventSubscriber extends EntityManagerEventSubscriber +{ + public function __construct( + EntityManager $entityManager, + CodeSlugify $slugify + ) { + $this->entityManager = $entityManager; + $this->slugify = $slugify; + } + + public function support(EntityInterface $entity) + { + return $entity instanceof Navigation; + } + + public function onPreUpdate(EntityManagerEvent $event) + { + if (!$this->support($event->getEntity())) { + return; + } + + $menu = $event->getEntity(); + $menu->setCode($this->slugify->slugify($menu->getCode())); + } + + public function onPreCreate(EntityManagerEvent $event) + { + return $this->onPreUpdate($event); + } +} diff --git a/src/EventSuscriber/Site/NodeEventSubscriber.php b/src/EventSuscriber/Site/NodeEventSubscriber.php index f4e7ce5..35deb26 100644 --- a/src/EventSuscriber/Site/NodeEventSubscriber.php +++ b/src/EventSuscriber/Site/NodeEventSubscriber.php @@ -14,6 +14,8 @@ use Symfony\Bundle\FrameworkBundle\Console\Application; use Symfony\Component\Console\Input\ArrayInput; use Symfony\Component\Console\Output\BufferedOutput; use Symfony\Component\HttpKernel\KernelInterface; +use App\Entity\Site\Menu; +use App\Entity\Site\Navigation; /** * class NodeEventSubscriber. @@ -90,6 +92,12 @@ class NodeEventSubscriber extends EntityManagerEventSubscriber public function onUpdate(EntityManagerEvent $event) { + $entity = $event->getEntity(); + + if (!$entity instanceof Node && !$entity instanceof Menu && !$entity instanceof Navigation) { + return; + } + $application = new Application($this->kernel); $application->setAutoExit(false); diff --git a/src/Form/Site/NodeType.php b/src/Form/Site/NodeType.php index 66fb167..4b9889d 100644 --- a/src/Form/Site/NodeType.php +++ b/src/Form/Site/NodeType.php @@ -45,6 +45,20 @@ class NodeType extends AbstractType ] ); + $builder->add( + 'code', + TextType::class, + [ + 'label' => 'Code', + 'required' => false, + 'help' => 'Sans espace, en minusule, sans caractère spécial', + 'attr' => [ + ], + 'constraints' => [ + ], + ] + ); + $actions = [ 'Nouvelle page' => 'new', 'Associer à une page existante' => 'existing', diff --git a/src/Repository/Site/NodeRepository.php b/src/Repository/Site/NodeRepository.php index b2821d0..dde07f5 100644 --- a/src/Repository/Site/NodeRepository.php +++ b/src/Repository/Site/NodeRepository.php @@ -16,8 +16,11 @@ class NodeRepository extends NestedTreeRepository public function urlExists($url, Node $node) { $query = $this->createQueryBuilder('n') + ->join('n.menu', 'm') ->where('n.url = :url') + ->andWhere('m.navigation = :navigation') ->setParameter(':url', $url) + ->setParameter(':navigation', $node->getMenu()->getNavigation()) ; if ($node->getId()) { diff --git a/src/Router/SiteRouteLoader.php b/src/Router/SiteRouteLoader.php index 9dd6507..782ca53 100644 --- a/src/Router/SiteRouteLoader.php +++ b/src/Router/SiteRouteLoader.php @@ -48,7 +48,7 @@ class SiteRouteLoader extends Loader $route = new Route($node->getUrl(), $defaults, $requirements); $route->setHost($navigation->getDomain()); - $routes->add('site_page_'.$node->getId(), $route); + $routes->add($node->getRouteName(), $route); } } } diff --git a/src/Slugify/CodeSlugify.php b/src/Slugify/CodeSlugify.php new file mode 100644 index 0000000..83697ad --- /dev/null +++ b/src/Slugify/CodeSlugify.php @@ -0,0 +1,26 @@ + + */ +class CodeSlugify extends Slugify +{ + protected function create(): BaseSlugify + { + $slugify = new BaseSlugify([ + 'separator' => '_', + 'lowercase' => true, + ]); + + $slugify->activateRuleSet('french'); + $slugify->addRule("'", ''); + + return $slugify; + } +} diff --git a/src/Slugify/Slugify.php b/src/Slugify/Slugify.php index 76976b3..4c72ca9 100644 --- a/src/Slugify/Slugify.php +++ b/src/Slugify/Slugify.php @@ -20,7 +20,7 @@ class Slugify { $slugify = new BaseSlugify([ 'separator' => '-', - 'lowercase' => false, + 'lowercase' => true, ]); $slugify->activateRuleSet('french'); diff --git a/templates/site/node_admin/_form.html.twig b/templates/site/node_admin/_form.html.twig index 49be5c6..a97a8e3 100644 --- a/templates/site/node_admin/_form.html.twig +++ b/templates/site/node_admin/_form.html.twig @@ -5,7 +5,7 @@ {{ form_row(form.position) }} {% endif %} -
+
{% set action = form.pageAction[0] %} {% set options = not entity.id ? {'attr': {'checked': 'checked'}} : {} %} diff --git a/templates/site/node_admin/edit.html.twig b/templates/site/node_admin/edit.html.twig index 598e586..4726266 100644 --- a/templates/site/node_admin/edit.html.twig +++ b/templates/site/node_admin/edit.html.twig @@ -10,6 +10,10 @@
{{ include('site/node_admin/_form.html.twig') }}
+ +
+ Nom de la route : {{ entity.routeName }} +