add default render params; add store
This commit is contained in:
parent
9555ea3bca
commit
b32b292c22
|
@ -6,20 +6,43 @@ use App\Core\Site\SiteRequest;
|
||||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
use Symfony\Component\HttpFoundation\Request;
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
use Symfony\Component\HttpFoundation\Response;
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
|
use App\Core\Site\SiteStore;
|
||||||
|
|
||||||
class PageController extends AbstractController
|
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
|
public function show(Request $request, SiteRequest $siteRequest): Response
|
||||||
{
|
{
|
||||||
if (!$siteRequest->getPage()) {
|
if (!$siteRequest->getPage()) {
|
||||||
throw $this->createNotFoundException();
|
throw $this->createNotFoundException();
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->render($siteRequest->getPage()->getTemplate(), [
|
return $this->defaultRender($siteRequest->getPage()->getTemplate());
|
||||||
'_node' => $siteRequest->getNode(),
|
}
|
||||||
'_page' => $siteRequest->getPage(),
|
|
||||||
'_menu' => $siteRequest->getMenu(),
|
protected function defaultRender(string $view, array $parameters = [], Response $response = null): Response
|
||||||
'_navigation' => $siteRequest->getNavigation(),
|
{
|
||||||
]);
|
$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,
|
||||||
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -120,6 +120,17 @@ class Navigation implements EntityInterface
|
||||||
return $this;
|
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
|
public function getRouteName(): string
|
||||||
{
|
{
|
||||||
return $this->getCode() ? $this->getCode() : 'navigation_'.$this->getId();
|
return $this->getCode() ? $this->getCode() : 'navigation_'.$this->getId();
|
||||||
|
|
|
@ -9,10 +9,10 @@ use App\Core\EventSuscriber\EntityManagerEventSubscriber;
|
||||||
use App\Core\Factory\Site\NodeFactory;
|
use App\Core\Factory\Site\NodeFactory;
|
||||||
use App\Core\Manager\EntityManager;
|
use App\Core\Manager\EntityManager;
|
||||||
use App\Core\Repository\Site\NodeRepository;
|
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\CodeSlugify;
|
||||||
use App\Core\Slugify\RouteParameterSlugify;
|
use App\Core\Slugify\RouteParameterSlugify;
|
||||||
|
use App\Core\Slugify\Slugify;
|
||||||
|
use Symfony\Component\HttpKernel\KernelInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* class NodeEventSubscriber.
|
* class NodeEventSubscriber.
|
||||||
|
@ -78,7 +78,7 @@ class NodeEventSubscriber extends EntityManagerEventSubscriber
|
||||||
$generatedUrl = '/'.implode('/', $path);
|
$generatedUrl = '/'.implode('/', $path);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($generatedUrl !== '/') {
|
if ('/' !== $generatedUrl) {
|
||||||
$generatedUrl = rtrim($generatedUrl, '/');
|
$generatedUrl = rtrim($generatedUrl, '/');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -90,7 +90,7 @@ class NodeEventSubscriber extends EntityManagerEventSubscriber
|
||||||
$regex = '/'.preg_quote($routeParameter).'/';
|
$regex = '/'.preg_quote($routeParameter).'/';
|
||||||
|
|
||||||
if (!preg_match($regex, $generatedUrl)) {
|
if (!preg_match($regex, $generatedUrl)) {
|
||||||
$generatedUrl.= '/'.$routeParameter;
|
$generatedUrl .= '/'.$routeParameter;
|
||||||
}
|
}
|
||||||
|
|
||||||
$parameters[$key] = $parameter;
|
$parameters[$key] = $parameter;
|
||||||
|
@ -102,7 +102,7 @@ class NodeEventSubscriber extends EntityManagerEventSubscriber
|
||||||
$realAttributes = [];
|
$realAttributes = [];
|
||||||
|
|
||||||
foreach ($attributes as $key => $attribute) {
|
foreach ($attributes as $key => $attribute) {
|
||||||
$realAttributes[$attribute['label']] = $attribute;
|
$realAttributes[$this->routeParameterSlugify->slugify($attribute['label'])] = $attribute;
|
||||||
}
|
}
|
||||||
|
|
||||||
$node->setAttributes($realAttributes);
|
$node->setAttributes($realAttributes);
|
||||||
|
|
63
core/Site/SiteStore.php
Normal file
63
core/Site/SiteStore.php
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,8 +1,71 @@
|
||||||
template 1<br>
|
{% import _self as macros %}
|
||||||
|
|
||||||
Node : {{ _node.label }}<br>
|
{% macro item(node, store) %}
|
||||||
Menu : {{ _menu.label }}<br>
|
{% set isActive = store.isActiveNode(node, true) %}
|
||||||
Navigation : {{ _navigation.label }}<br>
|
|
||||||
|
|
||||||
Page : {{ _page.title.value }}<br>
|
{% if node.isVisible %}
|
||||||
Content : {{ _page.content.value|raw }}<br>
|
{% 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 %}
|
||||||
|
|
Loading…
Reference in a new issue