backports murph-skeleton

This commit is contained in:
Simon Vieille 2021-05-17 15:31:04 +02:00
parent cad2abca79
commit badabf0bd6
8 changed files with 84 additions and 244 deletions

View file

@ -31,6 +31,7 @@ abstract class CrudController extends AdminController
$configuration = $this->getConfiguration();
$this->applySort('index', $query, $request);
$this->updateFilters($request, $session);
$pager = $query
->useFilters($this->filters)
@ -54,7 +55,7 @@ abstract class CrudController extends AdminController
$this->prepareEntity($entity);
$form = $this->createForm($configuration->getForm('new'), $entity);
$form = $this->createForm($configuration->getForm('new'), $entity, $configuration->getFormOptions('new'));
if ($request->isMethod('POST')) {
$form->handleRequest($request);
@ -97,7 +98,7 @@ abstract class CrudController extends AdminController
$this->prepareEntity($entity);
$form = $this->createForm($configuration->getForm('edit'), $entity);
$form = $this->createForm($configuration->getForm('edit'), $entity, $configuration->getFormOptions('edit'));
if ($request->isMethod('POST')) {
$form->handleRequest($request);

View file

@ -2,135 +2,115 @@
namespace App\Core\Controller\Site;
use App\Core\Controller\Admin\AdminController;
use App\Core\Entity\Site\Page\Page as Entity;
use App\Core\Factory\Site\Page\PageFactory as EntityFactory;
use App\Core\Form\Site\Page\Filter\PageFilterType as FilterType;
use App\Core\Form\Site\Page\PageType as EntityType;
use App\Core\Controller\Admin\Crud\CrudController;
use App\Core\Crud\CrudConfiguration;
use App\Core\Crud\Field;
use App\Core\Entity\EntityInterface;
use App\Core\Manager\EntityManager;
use App\Core\Entity\Site\Page\Page as Entity;
use App\Core\Form\Site\Page\PageType as Type;
use App\Core\Form\Site\Page\Filter\PageFilterType as FilterType;
use App\Core\Repository\Site\Page\PageRepositoryQuery as RepositoryQuery;
use App\Core\Site\PageLocator;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\Routing\Annotation\Route;
use App\Core\Site\PageLocator;
use App\Core\Repository\Site\Page\PageRepositoryQuery;
/**
* @Route("/admin/site/page")
*/
class PageAdminController extends AdminController
class PageAdminController extends CrudController
{
/**
* @Route("/{page}", name="admin_site_page_index", requirements={"page": "\d+"})
* @Route("/admin/site/page/{page}", name="admin_site_page_index", methods={"GET"}, requirements={"page":"\d+"})
*/
public function index(int $page = 1, RepositoryQuery $query, Request $request, Session $session): Response
{
$this->updateFilters($request, $session);
$pager = $query
->useFilters($this->filters)
->paginate($page)
;
return $this->render('@Core/site/page_admin/index.html.twig', [
'pager' => $pager,
'hasFilters' => !empty($this->filters),
]);
return $this->doIndex($page, $query, $request, $session);
}
/**
* @Route("/edit/{entity}", name="admin_site_page_edit")
* @Route("/admin/site/page/show/{entity}", name="admin_site_page_show", methods={"GET"})
*/
public function show(Entity $entity): Response
{
return $this->doShow($entity);
}
/**
* @Route("/admin/site/page/filter", name="admin_site_page_filter", methods={"GET"})
*/
public function filter(Session $session): Response
{
return $this->doFilter($session);
}
/**
* @Route("/admin/site/page/edit/{entity}", name="admin_site_page_edit", methods={"GET", "POST"})
*/
public function edit(
int $entity,
EntityFactory $factory,
EntityManager $entityManager,
RepositoryQuery $repositoryQuery,
PageLocator $pageLocator,
Request $request
): Response {
): Response
{
$entity = $repositoryQuery->filterById($entity)->findOne();
$form = $this->createForm(EntityType::class, $entity, [
$this->getConfiguration()->setFormOptions('edit', [
'pageConfiguration' => $pageLocator->getPage(get_class($entity)),
]);
if ($request->isMethod('POST')) {
$form->handleRequest($request);
if ($form->isValid()) {
$entityManager->update($entity);
$this->addFlash('success', 'The data has been saved.');
return $this->redirectToRoute('admin_site_page_edit', [
'entity' => $entity->getId(),
]);
}
$this->addFlash('warning', 'The form is not valid.');
}
return $this->render('@Core/site/page_admin/edit.html.twig', [
'form' => $form->createView(),
'entity' => $entity,
]);
return $this->doEdit($entity, $entityManager, $request);
}
/**
* @Route("/delete/{entity}", name="admin_site_page_delete", methods={"DELETE"})
* @Route("/admin/site/page/delete/{entity}", name="admin_site_page_delete", methods={"DELETE"})
*/
public function delete(Entity $entity, EntityManager $entityManager, Request $request): Response
{
if ($this->isCsrfTokenValid('delete'.$entity->getId(), $request->request->get('_token'))) {
$entityManager->delete($entity);
$this->addFlash('success', 'The data has been removed.');
}
return $this->redirectToRoute('admin_site_page_index');
return $this->doDelete($entity, $entityManager, $request);
}
/**
* @Route("/filters", name="admin_site_page_filters")
*/
public function filters(Session $session): Response
protected function getConfiguration(): CrudConfiguration
{
$form = $this->createForm(FilterType::class);
$form->submit($session->get('page_filter', []));
return CrudConfiguration::create()
->setPageTitle('index', 'Pages')
->setPageTitle('edit', '{name}')
->setPageTitle('show', '{name}')
return $this->render('@Core/site/page_admin/filters.html.twig', [
'form' => $form->createView(),
]);
->setPageRoute('index', 'admin_site_page_index')
->setPageRoute('edit', 'admin_site_page_edit')
->setPageRoute('delete', 'admin_site_page_delete')
->setPageRoute('filter', 'admin_site_page_filter')
->setForm('edit', Type::class, [])
->setForm('filter', FilterType::class)
->setView('form', '@Core/site/page_admin/_form.html.twig')
->setAction('index', 'new', false)
->setAction('index', 'show', false)
->setAction('edit', 'show', false)
->setField('index', 'Name', Field\TextField::class, [
'view' => '@Core/site/page_admin/fields/nodes.html.twig',
'sort' => ['name', '.name'],
])
->setField('index', 'Elements', Field\TextField::class, [
'view' => '@Core/site/page_admin/fields/nodes.html.twig',
'sort' => ['navigation', function(RepositoryQuery $query, $direction) {
$query
->leftJoin('.nodes', 'node')
->leftJoin('node.menu', 'menu')
->leftJoin('menu.navigation', 'navigation')
->orderBy('navigation.label', $direction);
}],
])
;
}
public function getSection(): string
protected function getSection(): string
{
return 'site_page';
}
protected function updateFilters(Request $request, Session $session)
{
if ($request->query->has('page_filter')) {
$filters = $request->query->get('page_filter');
if ('0' === $filters) {
$filters = [];
}
} elseif ($session->has('page_filter')) {
$filters = $session->get('page_filter');
} else {
$filters = [];
}
$form = $this->createForm(FilterType::class);
$form->submit($filters);
if (empty($filters)) {
$this->filters = $filters;
$session->set('page_filter', $filters);
} elseif ($form->isValid()) {
$this->filters = $form->getData();
$session->set('page_filter', $filters);
}
return 'page';
}
}

View file

@ -31,7 +31,7 @@ class PageFilterType extends AbstractType
'navigation',
EntityType::class,
[
'label' => 'Naviation',
'label' => 'Navigation',
'class' => Navigation::class,
'choice_label' => 'label',
'choice_value' => 'id',

View file

@ -89,6 +89,7 @@
'Edition of "%label%"': "Édition de « %label% »"
'Urls of "%label%"': "Urls de « %label% »"
"New element": "Nouvel élément"
"Elements": "Élements"
"Show all node URLs": "Afficher toutes les URLs du nœud"
"Add a menu": "Ajouter un menu"
"Actions": "Actions"

View file

@ -1,48 +0,0 @@
{% extends '@Core/admin/layout.html.twig' %}
{% block title %}{{ 'Pages'|trans }} - {{ parent() }}{% endblock %}
{% block body %}
<div class="bg-light pl-5 pr-4 pt-5 pb-5">
<div class="crud-header">
<h1 class="crud-header-title">{{ entity.name }}</h1>
<div class="crud-header-actions">
<div class="btn-group">
<button type="submit" form="form-main" class="btn btn-primary">
<span class="fa fa-save pr-1"></span>
{{ 'Save'|trans }}
</button>
<button type="button" class="btn btn-white dropdown-toggle dropdown-toggle-hide-after" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="font-weight-bold">
⋅⋅⋅
</span>
</button>
<div class="dropdown-menu dropdown-menu-right">
<button type="submit" form="form-delete" class="dropdown-item">
{{ 'Remove'|trans }}
</button>
</div>
</div>
</div>
</div>
</div>
<form action="{{ app.request.uri }}" method="post" id="form-main" enctype="multipart/form-data">
<div class="tab-content">
<div class="tab-pane active">
<div class="tab-form">
{{ include('@Core/site/page_admin/_form.html.twig') }}
</div>
</div>
</div>
{{ form_rest(form) }}
</form>
<form method="post" action="{{ path('admin_site_page_delete', {entity: entity.id}) }}" id="form-delete" data-form-confirm>
<input type="hidden" name="_method" value="DELETE">
<input type="hidden" name="_token" value="{{ csrf_token('delete' ~ entity.id) }}">
</form>
{% endblock %}

View file

@ -0,0 +1,8 @@
{% for node in entity.nodes %}
<a href="{{ path('admin_site_tree_navigation', {
navigation: node.menu.navigation.id,
'data-modal': path('admin_site_node_edit', {entity: node.id}),
}) }}" class="btn btn-sm btn-light mr-1">
{{ node.label }} ({{ node.menu.navigation.label }})
</a>
{% endfor %}

View file

@ -1,21 +0,0 @@
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">
{{ 'Filter'|trans }}
</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<form action="{{ path('admin_site_page_index') }}" id="form-filters" method="GET">
{{ form_widget(form) }}
</form>
</div>
<div class="modal-footer">
<a href="{{ path('admin_site_page_index', {page_filter: 0}) }}" class="btn btn-secondary">{{ 'Vider'|trans }}</a>
<button type="submit" form="form-filters" class="btn btn-primary">{{ 'Filter'|trans }}</button>
</div>
</div>
</div>

View file

@ -1,81 +0,0 @@
{% extends '@Core/admin/layout.html.twig' %}
{% block title %}{{ 'Pages'|trans }} - {{ parent() }}{% endblock %}
{% block body %}
<div class="bg-light pl-5 pr-4 pt-5 {% if pager.paginationData.pageCount < 2 %}pb-5{% endif %}">
<div class="crud-header">
<h1 class="crud-header-title">{{ 'Pages'|trans }}</h1>
</div>
<div class="row">
<div class="col-auto ml-auto {% if pager.getPaginationData.pageCount > 1 %}mr-3{% endif %}">
<button data-modal="{{ path('admin_site_page_filters') }}" class="btn btn-sm btn-secondary">
{{ 'Filter'|trans }} {% if hasFilters %}({{ 'Yes'|trans }}){% endif %}
</button>
</div>
<div class="col-auto">
{{ knp_pagination_render(pager) }}
</div>
</div>
</div>
<div class="table-responsive">
<table class="table">
<thead class="thead-light">
<tr>
<th class="col-5">{{ 'Name'|trans }}</th>
<th class="col-5"></th>
<th class="col-2 miw-100 text-right">{{ 'Actions'|trans }}</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-5">
<a href="{{ edit }}" class="font-weight-bold text-body d-block">
{{ item.name }}
</a>
</td>
<td class="col-5">
{% for node in item.nodes %}
<a href="{{ path('admin_site_tree_navigation', {
navigation: node.menu.navigation.id,
'data-modal': path('admin_site_node_edit', {entity: node.id}),
}) }}" class="btn btn-sm btn-light mr-1">
{{ node.label }}
</a>
{% endfor %}
</td>
<td class="col-2 miw-100 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" colspan="3">
<div class="display-1">
<span class="fa fa-search"></span>
</div>
<div class="display-5 mt-3">
{{ 'No result'|trans }}
</div>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endblock %}