From b32b292c2210943dfe3af601775dec84e4773333 Mon Sep 17 00:00:00 2001 From: Simon Vieille Date: Mon, 22 Mar 2021 16:17:25 +0100 Subject: [PATCH] add default render params; add store --- core/Controller/Site/PageController.php | 35 +++++++-- core/Entity/Site/Navigation.php | 11 +++ .../Site/NodeEventSubscriber.php | 10 +-- core/Site/SiteStore.php | 63 ++++++++++++++++ templates/site/page/simple/page.html.twig | 75 +++++++++++++++++-- 5 files changed, 177 insertions(+), 17 deletions(-) create mode 100644 core/Site/SiteStore.php diff --git a/core/Controller/Site/PageController.php b/core/Controller/Site/PageController.php index 7100869..d85901f 100644 --- a/core/Controller/Site/PageController.php +++ b/core/Controller/Site/PageController.php @@ -6,20 +6,43 @@ use App\Core\Site\SiteRequest; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; +use App\Core\Site\SiteStore; class PageController extends AbstractController { + protected SiteRequest $siteRequest; + protected SiteStore $siteStore; + + public function __construct(SiteRequest $siteRequest, SiteStore $siteStore) + { + $this->siteRequest = $siteRequest; + $this->siteStore = $siteStore; + } + public function show(Request $request, SiteRequest $siteRequest): Response { if (!$siteRequest->getPage()) { throw $this->createNotFoundException(); } - return $this->render($siteRequest->getPage()->getTemplate(), [ - '_node' => $siteRequest->getNode(), - '_page' => $siteRequest->getPage(), - '_menu' => $siteRequest->getMenu(), - '_navigation' => $siteRequest->getNavigation(), - ]); + return $this->defaultRender($siteRequest->getPage()->getTemplate()); + } + + protected function defaultRender(string $view, array $parameters = [], Response $response = null): Response + { + $parameters = array_merge($this->getDefaultRenderParameters(), $parameters); + + return parent::render($view, $parameters, $response); + } + + protected function getDefaultRenderParameters(): array + { + return [ + '_node' => $this->siteRequest->getNode(), + '_page' => $this->siteRequest->getPage(), + '_menu' => $this->siteRequest->getMenu(), + '_navigation' => $this->siteRequest->getNavigation(), + '_store' => $this->siteStore, + ]; } } diff --git a/core/Entity/Site/Navigation.php b/core/Entity/Site/Navigation.php index 5672629..ec4ba62 100644 --- a/core/Entity/Site/Navigation.php +++ b/core/Entity/Site/Navigation.php @@ -120,6 +120,17 @@ class Navigation implements EntityInterface return $this; } + public function getMenu(string $code): ?Menu + { + foreach ($this->menus as $menu) { + if ($menu->getCode() === $code) { + return $menu; + } + } + + return $menu; + } + public function getRouteName(): string { return $this->getCode() ? $this->getCode() : 'navigation_'.$this->getId(); diff --git a/core/EventSuscriber/Site/NodeEventSubscriber.php b/core/EventSuscriber/Site/NodeEventSubscriber.php index 3608862..cd1e252 100644 --- a/core/EventSuscriber/Site/NodeEventSubscriber.php +++ b/core/EventSuscriber/Site/NodeEventSubscriber.php @@ -9,10 +9,10 @@ use App\Core\EventSuscriber\EntityManagerEventSubscriber; use App\Core\Factory\Site\NodeFactory; use App\Core\Manager\EntityManager; use App\Core\Repository\Site\NodeRepository; -use App\Core\Slugify\Slugify; -use Symfony\Component\HttpKernel\KernelInterface; use App\Core\Slugify\CodeSlugify; use App\Core\Slugify\RouteParameterSlugify; +use App\Core\Slugify\Slugify; +use Symfony\Component\HttpKernel\KernelInterface; /** * class NodeEventSubscriber. @@ -78,7 +78,7 @@ class NodeEventSubscriber extends EntityManagerEventSubscriber $generatedUrl = '/'.implode('/', $path); } - if ($generatedUrl !== '/') { + if ('/' !== $generatedUrl) { $generatedUrl = rtrim($generatedUrl, '/'); } @@ -90,7 +90,7 @@ class NodeEventSubscriber extends EntityManagerEventSubscriber $regex = '/'.preg_quote($routeParameter).'/'; if (!preg_match($regex, $generatedUrl)) { - $generatedUrl.= '/'.$routeParameter; + $generatedUrl .= '/'.$routeParameter; } $parameters[$key] = $parameter; @@ -102,7 +102,7 @@ class NodeEventSubscriber extends EntityManagerEventSubscriber $realAttributes = []; foreach ($attributes as $key => $attribute) { - $realAttributes[$attribute['label']] = $attribute; + $realAttributes[$this->routeParameterSlugify->slugify($attribute['label'])] = $attribute; } $node->setAttributes($realAttributes); diff --git a/core/Site/SiteStore.php b/core/Site/SiteStore.php new file mode 100644 index 0000000..9264137 --- /dev/null +++ b/core/Site/SiteStore.php @@ -0,0 +1,63 @@ + + */ +class SiteStore +{ + protected NavigationRepositoryQuery $navigationRepositoryQuery; + protected SiteRequest $siteRequest; + + public function __construct(NavigationRepositoryQuery $navigationRepositoryQuery, SiteRequest $siteRequest) + { + $this->navigationRepositoryQuery = $navigationRepositoryQuery; + $this->siteRequest = $siteRequest; + } + + public function getNavigations(): array + { + return $this->navigationRepositoryQuery->create() + ->find() + ; + } + + public function getNavigation(string $code): ?Navigation + { + return $this->navigationRepositoryQuery->create() + ->where('.code = :code') + ->setParameter(':code', $code) + ->findOne() + ; + } + + public function isActiveNode(Node $node, $deep = false): bool + { + $siteRequestNode = $this->siteRequest->getNode(); + + if (!$siteRequestNode) { + return false; + } + + if ($node->getRouteName() === $siteRequestNode->getRouteName()) { + return true; + } + + if ($deep) { + foreach ($node->getAllChildren() as $child) { + if ($child->getRouteName() === $siteRequestNode->getRouteName()) { + return true; + } + } + } + + return false; + } +} diff --git a/templates/site/page/simple/page.html.twig b/templates/site/page/simple/page.html.twig index 6ab1d64..4668034 100644 --- a/templates/site/page/simple/page.html.twig +++ b/templates/site/page/simple/page.html.twig @@ -1,8 +1,71 @@ -template 1
+{% import _self as macros %} -Node : {{ _node.label }}
-Menu : {{ _menu.label }}
-Navigation : {{ _navigation.label }}
+{% macro item(node, store) %} + {% set isActive = store.isActiveNode(node, true) %} -Page : {{ _page.title.value }}
-Content : {{ _page.content.value|raw }}
+ {% if node.isVisible %} + {% if node.code == 'post' %} + + {{ node.label }} + + {% elseif node.page %} + + {{ node.label }} + + {% else %} + + {{ node.label }} + + {% endif %} + + {{ dump(node.attributes) }} + + {% if node.children|length %} + + {% endif %} + {% endif %} +{% endmacro %} + +{% macro menu(menu, store) %} + +{% endmacro %} + +

{{ _page.title.value }}

+ +
{{ _page.content.value }}
+ + + +

Menu

+ +{% set menu = _navigation.menu('top') %} + +{% if menu %} + {{ macros.menu(menu, _store) }} +{% endif %}