add default render params; add store

This commit is contained in:
Simon Vieille 2021-03-22 16:17:25 +01:00
parent 9555ea3bca
commit b32b292c22
5 changed files with 177 additions and 17 deletions

View file

@ -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,
];
}
}

View file

@ -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();

View file

@ -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);

63
core/Site/SiteStore.php Normal file
View file

@ -0,0 +1,63 @@
<?php
namespace App\Core\Site;
use App\Core\Entity\Site\Navigation;
use App\Core\Repository\Site\NavigationRepositoryQuery;
use App\Core\Entity\Site\Node;
/**
* class SiteStore.
*
* @author Simon Vieille <simon@deblan.fr>
*/
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;
}
}

View file

@ -1,8 +1,71 @@
template 1<br>
{% import _self as macros %}
Node : {{ _node.label }}<br>
Menu : {{ _menu.label }}<br>
Navigation : {{ _navigation.label }}<br>
{% macro item(node, store) %}
{% set isActive = store.isActiveNode(node, true) %}
Page : {{ _page.title.value }}<br>
Content : {{ _page.content.value|raw }}<br>
{% if node.isVisible %}
{% if node.code == 'post' %}
<a {% if isActive %}style="color: red"{% endif %} href="{{ url(node.routeName, {post: 1}) }}">
{{ node.label }}
</a>
{% elseif node.page %}
<a {% if isActive %}style="color: red"{% endif %} href="{{ url(node.routeName) }}">
{{ node.label }}
</a>
{% else %}
<span {% if isActive %}style="color: red"{% endif %}>
{{ node.label }}
</span>
{% endif %}
{{ dump(node.attributes) }}
{% if node.children|length %}
<ul>
{% for child in node.children %}
{% if child.isVisible %}
<li>
{{ macros.item(child, store) }}
</li>
{% endif %}
{% endfor %}
</ul>
{% endif %}
{% endif %}
{% endmacro %}
{% macro menu(menu, store) %}
<ul>
{% for child in menu.rootNode.children %}
{% if child.isVisible %}
<li>
{{ macros.item(child, store) }}
</li>
{% endif %}
{% endfor %}
</ul>
{% endmacro %}
<h1>{{ _page.title.value }}</h1>
<pre>{{ _page.content.value }}</pre>
<ul>
<li>
Node : {{ _node.label }}
</li>
<li>
Menu : {{ _menu.label }}
</li>
<li>
Navigation : {{ _navigation.label }}
</li>
</ul>
<h4>Menu</h4>
{% set menu = _navigation.menu('top') %}
{% if menu %}
{{ macros.menu(menu, _store) }}
{% endif %}