add node url manager
This commit is contained in:
parent
237b105289
commit
4c30b45c0a
|
@ -5,4 +5,3 @@ app:
|
||||||
name: 'Page simple'
|
name: 'Page simple'
|
||||||
templates:
|
templates:
|
||||||
- {name: "Template 1", file: "site/page/simple/page.html.twig"}
|
- {name: "Template 1", file: "site/page/simple/page.html.twig"}
|
||||||
- {name: "Template 2", file: "site/page/simple/page2.html.twig"}
|
|
||||||
|
|
|
@ -2,11 +2,10 @@
|
||||||
# path: /
|
# path: /
|
||||||
# controller: App\Controller\DefaultController::index
|
# controller: App\Controller\DefaultController::index
|
||||||
|
|
||||||
#https://symfony.com/doc/current/routing/custom_route_loader.html
|
site_route:
|
||||||
#admin_routes:
|
resource: 'site.route_loader::loadRoutes'
|
||||||
# resource: 'admin_route_loader::loadRoutes'
|
type: extra
|
||||||
# type: service
|
|
||||||
#
|
|
||||||
2fa_login:
|
2fa_login:
|
||||||
path: /2fa
|
path: /2fa
|
||||||
defaults:
|
defaults:
|
||||||
|
|
|
@ -27,6 +27,10 @@ services:
|
||||||
resource: '../src/Controller/'
|
resource: '../src/Controller/'
|
||||||
tags: ['controller.service_arguments']
|
tags: ['controller.service_arguments']
|
||||||
|
|
||||||
|
site.route_loader:
|
||||||
|
class: App\Router\SiteRouteLoader
|
||||||
|
tags: [routing.loader]
|
||||||
|
|
||||||
gedmo.listener.tree:
|
gedmo.listener.tree:
|
||||||
class: Gedmo\Tree\TreeListener
|
class: Gedmo\Tree\TreeListener
|
||||||
tags:
|
tags:
|
||||||
|
|
|
@ -66,7 +66,8 @@ class NodeAdminController extends AdminController
|
||||||
$form->get('pageEntity')->getData(),
|
$form->get('pageEntity')->getData(),
|
||||||
$form->get('pageType')->getData(),
|
$form->get('pageType')->getData(),
|
||||||
$entity,
|
$entity,
|
||||||
$pageFactory
|
$pageFactory,
|
||||||
|
$pageLocator
|
||||||
);
|
);
|
||||||
|
|
||||||
$entityManager->update($entity);
|
$entityManager->update($entity);
|
||||||
|
@ -111,7 +112,8 @@ class NodeAdminController extends AdminController
|
||||||
$form->get('pageEntity')->getData(),
|
$form->get('pageEntity')->getData(),
|
||||||
$form->get('pageType')->getData(),
|
$form->get('pageType')->getData(),
|
||||||
$entity,
|
$entity,
|
||||||
$pageFactory
|
$pageFactory,
|
||||||
|
$pageLocator
|
||||||
);
|
);
|
||||||
|
|
||||||
$entityManager->update($entity);
|
$entityManager->update($entity);
|
||||||
|
@ -137,11 +139,15 @@ class NodeAdminController extends AdminController
|
||||||
?Page $pageEntity,
|
?Page $pageEntity,
|
||||||
string $pageType,
|
string $pageType,
|
||||||
Entity $entity,
|
Entity $entity,
|
||||||
PageFactory $pageFactory
|
PageFactory $pageFactory,
|
||||||
|
PageLocator $pageLocator
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if ($pageAction === 'new') {
|
if ($pageAction === 'new') {
|
||||||
|
$pageConfiguration = $pageLocator->getPage($pageType);
|
||||||
$page = $pageFactory->create($pageType, $entity->getLabel());
|
$page = $pageFactory->create($pageType, $entity->getLabel());
|
||||||
|
$page->setTemplate($pageConfiguration->getTemplates()[0]['file']);
|
||||||
|
|
||||||
$entity->setPage($page);
|
$entity->setPage($page);
|
||||||
} elseif ($pageAction === 'existing') {
|
} elseif ($pageAction === 'existing') {
|
||||||
if ($pageEntity) {
|
if ($pageEntity) {
|
||||||
|
|
|
@ -9,7 +9,7 @@ use App\Form\Site\Page\PageType as EntityType;
|
||||||
use App\Manager\EntityManager;
|
use App\Manager\EntityManager;
|
||||||
use App\Page\FooPage;
|
use App\Page\FooPage;
|
||||||
use App\Page\SimplePage;
|
use App\Page\SimplePage;
|
||||||
use App\Repository\Site\Page\PageRepositoryQuery as EntityRepositoryQuery;
|
use App\Repository\Site\Page\PageRepositoryQuery as RepositoryQuery;
|
||||||
use Symfony\Component\HttpFoundation\Request;
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
use Symfony\Component\HttpFoundation\Response;
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
use Symfony\Component\Routing\Annotation\Route;
|
use Symfony\Component\Routing\Annotation\Route;
|
||||||
|
@ -19,6 +19,18 @@ use Symfony\Component\Routing\Annotation\Route;
|
||||||
*/
|
*/
|
||||||
class PageAdminController extends AdminController
|
class PageAdminController extends AdminController
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* @Route("/{page}", name="admin_site_page_index", requirements={"page": "\d+"})
|
||||||
|
*/
|
||||||
|
public function index(int $page = 1, RepositoryQuery $query, Request $request): Response
|
||||||
|
{
|
||||||
|
$pager = $query->paginate($page);
|
||||||
|
|
||||||
|
return $this->render('site/page_admin/index.html.twig', [
|
||||||
|
'pager' => $pager,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Route("/new", name="admin_site_page_new")
|
* @Route("/new", name="admin_site_page_new")
|
||||||
*/
|
*/
|
||||||
|
@ -44,7 +56,7 @@ class PageAdminController extends AdminController
|
||||||
int $entity,
|
int $entity,
|
||||||
EntityFactory $factory,
|
EntityFactory $factory,
|
||||||
EntityManager $entityManager,
|
EntityManager $entityManager,
|
||||||
EntityRepositoryQuery $repositoryQuery,
|
RepositoryQuery $repositoryQuery,
|
||||||
Request $request
|
Request $request
|
||||||
): Response {
|
): Response {
|
||||||
$entity = $repositoryQuery->filterById($entity)->findOne();
|
$entity = $repositoryQuery->filterById($entity)->findOne();
|
||||||
|
@ -83,11 +95,11 @@ class PageAdminController extends AdminController
|
||||||
$this->addFlash('success', 'Données supprimée..');
|
$this->addFlash('success', 'Données supprimée..');
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->redirectToRoute('admin_site_tree_index');
|
return $this->redirectToRoute('admin_site_page_index');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getSection(): string
|
public function getSection(): string
|
||||||
{
|
{
|
||||||
return '';
|
return 'site_page';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
26
src/Controller/Site/PageController.php
Normal file
26
src/Controller/Site/PageController.php
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Controller\Site;
|
||||||
|
|
||||||
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
|
use Symfony\Component\Routing\Annotation\Route;
|
||||||
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
|
use App\Site\SiteRequest;
|
||||||
|
|
||||||
|
class PageController extends AbstractController
|
||||||
|
{
|
||||||
|
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(),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
|
@ -9,6 +9,11 @@ use App\EventSuscriber\EntityManagerEventSubscriber;
|
||||||
use App\Factory\Site\NodeFactory;
|
use App\Factory\Site\NodeFactory;
|
||||||
use App\Manager\EntityManager;
|
use App\Manager\EntityManager;
|
||||||
use App\Repository\Site\NodeRepository;
|
use App\Repository\Site\NodeRepository;
|
||||||
|
use App\Slugify\Slugify;
|
||||||
|
use Symfony\Component\HttpKernel\KernelInterface;
|
||||||
|
use Symfony\Bundle\FrameworkBundle\Console\Application;
|
||||||
|
use Symfony\Component\Console\Input\ArrayInput;
|
||||||
|
use Symfony\Component\Console\Output\BufferedOutput;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* class NodeEventSubscriber.
|
* class NodeEventSubscriber.
|
||||||
|
@ -19,15 +24,21 @@ class NodeEventSubscriber extends EntityManagerEventSubscriber
|
||||||
{
|
{
|
||||||
protected NodeFactory $nodeFactory;
|
protected NodeFactory $nodeFactory;
|
||||||
protected EntityManager $entityManager;
|
protected EntityManager $entityManager;
|
||||||
|
protected KernelInterface $kernel;
|
||||||
|
protected Slugify $slugify;
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
NodeFactory $nodeFactory,
|
NodeFactory $nodeFactory,
|
||||||
NodeRepository $nodeRepository,
|
NodeRepository $nodeRepository,
|
||||||
EntityManager $entityManager
|
EntityManager $entityManager,
|
||||||
|
KernelInterface $kernel,
|
||||||
|
Slugify $slugify
|
||||||
) {
|
) {
|
||||||
$this->nodeFactory = $nodeFactory;
|
$this->nodeFactory = $nodeFactory;
|
||||||
$this->nodeRepository = $nodeRepository;
|
$this->nodeRepository = $nodeRepository;
|
||||||
$this->entityManager = $entityManager;
|
$this->entityManager = $entityManager;
|
||||||
|
$this->kernel = $kernel;
|
||||||
|
$this->slugify = $slugify;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function support(EntityInterface $entity)
|
public function support(EntityInterface $entity)
|
||||||
|
@ -35,6 +46,61 @@ class NodeEventSubscriber extends EntityManagerEventSubscriber
|
||||||
return $entity instanceof Node;
|
return $entity instanceof Node;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function onPreUpdate(EntityManagerEvent $event)
|
||||||
|
{
|
||||||
|
if (!$this->support($event->getEntity())) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$node = $event->getEntity();
|
||||||
|
|
||||||
|
if ($node->getUrl()) {
|
||||||
|
$generatedUrl = $node->getUrl();
|
||||||
|
} else {
|
||||||
|
$path = [];
|
||||||
|
$parent = $node->getParent();
|
||||||
|
|
||||||
|
if ($parent && $parent->getUrl()) {
|
||||||
|
$pPath = trim($parent->getUrl(), '/');
|
||||||
|
|
||||||
|
if ($pPath) {
|
||||||
|
$path[] = $pPath;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$path[] = $this->slugify->slugify($node->getLabel());
|
||||||
|
|
||||||
|
$generatedUrl = '/'.implode('/', $path);
|
||||||
|
}
|
||||||
|
|
||||||
|
$urlExists = $this->nodeRepository->urlExists($generatedUrl, $node);
|
||||||
|
|
||||||
|
if ($urlExists) {
|
||||||
|
$number = 1;
|
||||||
|
|
||||||
|
while ($this->nodeRepository->urlExists($generatedUrl.'-'.$number, $node)) {
|
||||||
|
$number++;
|
||||||
|
}
|
||||||
|
|
||||||
|
$generatedUrl = $generatedUrl.'-'.$number;
|
||||||
|
}
|
||||||
|
|
||||||
|
$node->setUrl($generatedUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function onUpdate(EntityManagerEvent $event)
|
||||||
|
{
|
||||||
|
$application = new Application($this->kernel);
|
||||||
|
$application->setAutoExit(false);
|
||||||
|
|
||||||
|
$input = new ArrayInput([
|
||||||
|
'command' => 'cache:clear',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$output = new BufferedOutput();
|
||||||
|
$application->run($input, $output);
|
||||||
|
}
|
||||||
|
|
||||||
public function onDelete(EntityManagerEvent $event)
|
public function onDelete(EntityManagerEvent $event)
|
||||||
{
|
{
|
||||||
if (!$this->support($event->getEntity())) {
|
if (!$this->support($event->getEntity())) {
|
||||||
|
|
|
@ -107,7 +107,6 @@ class NodeType extends AbstractType
|
||||||
;
|
;
|
||||||
},
|
},
|
||||||
'constraints' => [
|
'constraints' => [
|
||||||
new NotBlank(),
|
|
||||||
],
|
],
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
|
|
|
@ -12,4 +12,21 @@ class NodeRepository extends NestedTreeRepository
|
||||||
{
|
{
|
||||||
parent::__construct($manager, $manager->getClassMetadata(Node::class));
|
parent::__construct($manager, $manager->getClassMetadata(Node::class));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function urlExists($url, Node $node)
|
||||||
|
{
|
||||||
|
$query = $this->createQueryBuilder('n')
|
||||||
|
->where('n.url = :url')
|
||||||
|
->setParameter(':url', $url);
|
||||||
|
|
||||||
|
if ($node->getId()) {
|
||||||
|
$query
|
||||||
|
->andWhere('n.id != :id')
|
||||||
|
->setParameter(':id', $node->getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
return $query->getQuery()
|
||||||
|
->setMaxResults(1)
|
||||||
|
->getOneOrNullResult();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
65
src/Router/SiteRouteLoader.php
Normal file
65
src/Router/SiteRouteLoader.php
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Router;
|
||||||
|
|
||||||
|
use App\Repository\Site\NavigationRepositoryQuery;
|
||||||
|
use Symfony\Component\Config\Loader\Loader;
|
||||||
|
use Symfony\Component\Routing\RouteCollection;
|
||||||
|
use App\Controller\Site\PageController;
|
||||||
|
use Symfony\Component\Routing\Route;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* class SiteRouteLoader.
|
||||||
|
*
|
||||||
|
* @author Simon Vieille <simon@deblan.fr>
|
||||||
|
*/
|
||||||
|
class SiteRouteLoader extends Loader
|
||||||
|
{
|
||||||
|
protected NavigationRepositoryQuery $navigationQuery;
|
||||||
|
protected $isLoaded = false;
|
||||||
|
|
||||||
|
public function __construct(NavigationRepositoryQuery $navigationQuery)
|
||||||
|
{
|
||||||
|
$this->navigationQuery = $navigationQuery;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function load($resource, ?string $type = null)
|
||||||
|
{
|
||||||
|
if (true === $this->isLoaded) {
|
||||||
|
throw new \RuntimeException('Do not add the "extra" loader twice');
|
||||||
|
}
|
||||||
|
|
||||||
|
$routes = new RouteCollection();
|
||||||
|
$navigations = $this->navigationQuery->find();
|
||||||
|
|
||||||
|
foreach ($navigations as $navigation) {
|
||||||
|
foreach ($navigation->getMenus() as $menu) {
|
||||||
|
foreach ($menu->getRootNode()->getAllChildren() as $node) {
|
||||||
|
$requirements = [];
|
||||||
|
|
||||||
|
$defaults = [
|
||||||
|
'_controller' => PageController::class.'::show',
|
||||||
|
'_node' => $node->getId(),
|
||||||
|
'_menu' => $menu->getId(),
|
||||||
|
'_page' => $node->getPage() ? $node->getPage()->getId() : null,
|
||||||
|
'_navigation' => $navigation->getId(),
|
||||||
|
];
|
||||||
|
|
||||||
|
$route = new Route($node->getUrl(), $defaults, $requirements);
|
||||||
|
$route->setHost($navigation->getDomain());
|
||||||
|
|
||||||
|
$routes->add('site_page_'.$node->getId(), $route);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->isLoaded = true;
|
||||||
|
|
||||||
|
return $routes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function supports($resource, string $type = null)
|
||||||
|
{
|
||||||
|
return 'extra' === $type;
|
||||||
|
}
|
||||||
|
}
|
69
src/Site/SiteRequest.php
Normal file
69
src/Site/SiteRequest.php
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Site;
|
||||||
|
|
||||||
|
use App\Entity\Site\Node;
|
||||||
|
use App\Entity\Site\Page\Page;
|
||||||
|
use App\Repository\Site\NavigationRepositoryQuery;
|
||||||
|
use App\Repository\Site\NodeRepository;
|
||||||
|
use App\Repository\Site\Page\PageRepositoryQuery;
|
||||||
|
use Symfony\Component\HttpFoundation\RequestStack;
|
||||||
|
use App\Entity\Site\Menu;
|
||||||
|
use App\Entity\Site\Navigation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* class SiteRequest.
|
||||||
|
*
|
||||||
|
* @author Simon Vieille <simon@deblan.fr>
|
||||||
|
*/
|
||||||
|
class SiteRequest
|
||||||
|
{
|
||||||
|
protected RequestStack $requestStack;
|
||||||
|
protected NodeRepository $nodeRepository;
|
||||||
|
protected NavigationRepositoryQuery $navigationRepositoryQuery;
|
||||||
|
protected PageRepositoryQuery $pageRepositoryQuery;
|
||||||
|
|
||||||
|
public function __construct(RequestStack $requestStack, NodeRepository $nodeRepository)
|
||||||
|
{
|
||||||
|
$this->requestStack = $requestStack;
|
||||||
|
$this->nodeRepository = $nodeRepository;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getNode(): ?Node
|
||||||
|
{
|
||||||
|
$request = $this->requestStack->getCurrentRequest();
|
||||||
|
|
||||||
|
if ($request->attributes->has('_node')) {
|
||||||
|
return $this->nodeRepository->findOneBy([
|
||||||
|
'id' => $request->attributes->get('_node'),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getPage(): ?Page
|
||||||
|
{
|
||||||
|
$node = $this->getNode();
|
||||||
|
|
||||||
|
if ($node && $node->getPage()) {
|
||||||
|
return $node->getPage();
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getMenu(): ?Menu
|
||||||
|
{
|
||||||
|
$node = $this->getNode();
|
||||||
|
|
||||||
|
return null !== $node ? $node->getMenu() : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getNavigation(): ?Navigation
|
||||||
|
{
|
||||||
|
$menu = $this->getMenu();
|
||||||
|
|
||||||
|
return null !== $menu ? $menu->getNavigation() : null;
|
||||||
|
}
|
||||||
|
}
|
31
src/Slugify/Slugify.php
Normal file
31
src/Slugify/Slugify.php
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Slugify;
|
||||||
|
|
||||||
|
use Cocur\Slugify\Slugify as BaseSlugify;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* class Slugify.
|
||||||
|
*
|
||||||
|
* @author Simon Vieille <simon@deblan.fr>
|
||||||
|
*/
|
||||||
|
class Slugify
|
||||||
|
{
|
||||||
|
public function slugify($data)
|
||||||
|
{
|
||||||
|
return $this->create()->slugify($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function create(): BaseSlugify
|
||||||
|
{
|
||||||
|
$slugify = new BaseSlugify([
|
||||||
|
'separator' => '-',
|
||||||
|
'lowercase' => false,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$slugify->activateRuleSet('french');
|
||||||
|
$slugify->addRule("'", '');
|
||||||
|
|
||||||
|
return $slugify;
|
||||||
|
}
|
||||||
|
}
|
|
@ -71,6 +71,14 @@
|
||||||
<span class="nav-item-label">Arborescence</span>
|
<span class="nav-item-label">Arborescence</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link {{ macros.active_class('site_page', section) }}" href="{{ path('admin_site_page_index') }}">
|
||||||
|
<span class="fa fa-file-alt"></span>
|
||||||
|
|
||||||
|
<span class="nav-item-label">Pages</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
|
6
templates/site/page/simple/page.html.twig
Normal file
6
templates/site/page/simple/page.html.twig
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
Node : {{ _node.label }}<br>
|
||||||
|
Menu : {{ _menu.label }}<br>
|
||||||
|
Navigation : {{ _navigation.label }}<br>
|
||||||
|
|
||||||
|
Page : {{ _page.title.value }}<br>
|
||||||
|
Content : {{ _page.content.value|raw }}<br>
|
59
templates/site/page_admin/index.html.twig
Normal file
59
templates/site/page_admin/index.html.twig
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
{% extends 'admin/layout.html.twig' %}
|
||||||
|
|
||||||
|
{% block body %}
|
||||||
|
<div class="bg-light pl-5 pr-4 pt-5 {% if pager.getPaginationData.pageCount < 2 %}pb-5{% endif %}">
|
||||||
|
<div class="d-flex">
|
||||||
|
<div class="mr-auto w-50">
|
||||||
|
<h1 class="display-5">Pages</h1>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{ knp_pagination_render(pager) }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<table class="table" data-table-fixed>
|
||||||
|
<thead class="thead-light">
|
||||||
|
<tr>
|
||||||
|
<th class="col-10">Nom</th>
|
||||||
|
<th class="col-2 text-right">Actions</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for item in pager %}
|
||||||
|
{% set edit = path('admin_site_page_edit', {entity: item.id}) %}
|
||||||
|
|
||||||
|
<tr data-dblclick="{{ edit }}">
|
||||||
|
<td class="col-10">
|
||||||
|
<a href="{{ edit }}" class="font-weight-bold text-body d-block">
|
||||||
|
{{ item.name }}
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
<td class="col-2 text-right">
|
||||||
|
<a href="{{ edit }}" class="btn btn-sm btn-primary mr-1">
|
||||||
|
<span class="fa fa-edit"></span>
|
||||||
|
</a>
|
||||||
|
<button type="submit" form="form-delete-{{ item.id }}" class="btn btn-sm btn-danger">
|
||||||
|
<span class="fa fa-trash"></span>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<form method="post" action="{{ path('admin_site_page_delete', {entity: item.id}) }}" id="form-delete-{{ item.id }}" data-form-confirm>
|
||||||
|
<input type="hidden" name="_method" value="DELETE">
|
||||||
|
<input type="hidden" name="_token" value="{{ csrf_token('delete' ~ item.id) }}">
|
||||||
|
</form>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% else %}
|
||||||
|
<tr>
|
||||||
|
<td class="col-12 text-center p-4 text-black-50">
|
||||||
|
<div class="display-1">
|
||||||
|
<span class="fa fa-search"></span>
|
||||||
|
</div>
|
||||||
|
<div class="display-5 mt-3">
|
||||||
|
Aucun résultat
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
{% endblock %}
|
|
@ -111,6 +111,12 @@
|
||||||
|
|
||||||
<div class="d block" style="padding-left: {{ (node.treeLevel - 1) * 30 }}px">
|
<div class="d block" style="padding-left: {{ (node.treeLevel - 1) * 30 }}px">
|
||||||
{{ node.label }}
|
{{ node.label }}
|
||||||
|
|
||||||
|
{% if node.url %}
|
||||||
|
<a href="{{ node.url }}" target="_blank" class="ml-3 btn btn-sm btn-light">
|
||||||
|
{{ node.url }}
|
||||||
|
</a>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<form method="post" action="{{ path('admin_site_node_toggle_visibility', {entity: node.id}) }}" id="form-node-visibility-{{ node.id }}">
|
<form method="post" action="{{ path('admin_site_node_toggle_visibility', {entity: node.id}) }}" id="form-node-visibility-{{ node.id }}">
|
||||||
|
|
Loading…
Reference in a new issue