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\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,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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
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>
|
||||
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 %}
|
||||
|
|
Loading…
Reference in a new issue