backports murph-skeleton
This commit is contained in:
parent
cad2abca79
commit
badabf0bd6
|
@ -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);
|
||||
|
|
|
@ -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';
|
||||
}
|
||||
}
|
||||
|
|
|
@ -31,7 +31,7 @@ class PageFilterType extends AbstractType
|
|||
'navigation',
|
||||
EntityType::class,
|
||||
[
|
||||
'label' => 'Naviation',
|
||||
'label' => 'Navigation',
|
||||
'class' => Navigation::class,
|
||||
'choice_label' => 'label',
|
||||
'choice_value' => 'id',
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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 %}
|
|
@ -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 %}
|
|
@ -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">×</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>
|
|
@ -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 %}
|
Loading…
Reference in a new issue