diff --git a/core/Controller/Admin/Crud/CrudController.php b/core/Controller/Admin/Crud/CrudController.php index a6351cf..c6b223e 100644 --- a/core/Controller/Admin/Crud/CrudController.php +++ b/core/Controller/Admin/Crud/CrudController.php @@ -31,7 +31,7 @@ abstract class CrudController extends AdminController $configuration = $this->getConfiguration(); $this->applySort('index', $query, $request); - $this->updatefilters($request, $session); + $this->updateFilters($request, $session); $pager = $query ->usefilters($this->filters) diff --git a/core/Controller/Site/NodeAdminController.php b/core/Controller/Site/NodeAdminController.php index 52cec5f..5411478 100644 --- a/core/Controller/Site/NodeAdminController.php +++ b/core/Controller/Site/NodeAdminController.php @@ -143,9 +143,19 @@ class NodeAdminController extends AdminController ]); } + $page = $entity->getPage(); + + if ($page !== null) { + $pageConfiguration = $pageLocator->getPages()[get_class($page)] ?? null; + } else { + $pageConfiguration = null; + } + return $this->render('@Core/site/node_admin/edit.html.twig', [ 'form' => $form->createView(), 'entity' => $entity, + 'page' => $page, + 'pageConfiguration' => $pageConfiguration, 'tab' => $tab, ]); } diff --git a/core/Controller/Site/PageAdminController.php b/core/Controller/Site/PageAdminController.php index b6b73ff..b4945aa 100644 --- a/core/Controller/Site/PageAdminController.php +++ b/core/Controller/Site/PageAdminController.php @@ -17,6 +17,7 @@ use Symfony\Component\HttpFoundation\Session\Session; use Symfony\Component\Routing\Annotation\Route; use App\Core\Event\Page\PageEditEvent; use Symfony\Component\EventDispatcher\EventDispatcherInterface; +use App\Core\Entity\EntityInterface; class PageAdminController extends CrudController { @@ -76,6 +77,14 @@ class PageAdminController extends CrudController return $this->doDelete($entity, $entityManager, $request); } + /** + * @Route("/admin/site/page/batch/{page}", name="admin_site_page_batch", methods={"POST"}, requirements={"page":"\d+"}) + */ + public function batch(int $page = 1, RepositoryQuery $query, EntityManager $entityManager, Request $request, Session $session): Response + { + return $this->doBatch($page, $query, $entityManager, $request, $session); + } + protected function getConfiguration(): CrudConfiguration { return CrudConfiguration::create() @@ -87,6 +96,7 @@ class PageAdminController extends CrudController ->setPageRoute('edit', 'admin_site_page_edit') ->setPageRoute('delete', 'admin_site_page_delete') ->setPageRoute('filter', 'admin_site_page_filter') + ->setPageRoute('batch', 'admin_site_page_batch') ->setForm('edit', Type::class, []) ->setForm('filter', FilterType::class) @@ -99,6 +109,7 @@ class PageAdminController extends CrudController ->setField('index', 'Name', Field\TextField::class, [ 'property' => 'name', 'sort' => ['name', '.name'], + 'attr' => ['class' => 'col-4'], ]) ->setField('index', 'Elements', Field\TextField::class, [ 'view' => '@Core/site/page_admin/fields/nodes.html.twig', @@ -110,7 +121,11 @@ class PageAdminController extends CrudController ->orderBy('navigation.label', $direction) ; }], + 'attr' => ['class' => 'col-6'], ]) + ->setBatchAction('index', 'delete', 'Delete', function(EntityInterface $entity, EntityManager $manager) { + $manager->delete($entity); + }) ; } diff --git a/core/Form/Site/Page/Filter/PageFilterType.php b/core/Form/Site/Page/Filter/PageFilterType.php index 3a95281..0aee47f 100644 --- a/core/Form/Site/Page/Filter/PageFilterType.php +++ b/core/Form/Site/Page/Filter/PageFilterType.php @@ -9,6 +9,7 @@ use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; +use Symfony\Component\Form\Extension\Core\Type\ChoiceType; class PageFilterType extends AbstractType { @@ -47,6 +48,19 @@ class PageFilterType extends AbstractType ], ] ); + + $builder->add( + 'isAssociated', + ChoiceType::class, + [ + 'label' => 'Associated', + 'choices' => [ + 'Anyway' => -1, + 'No' => 0, + 'Yes' => 1, + ], + ] + ); } public function configureOptions(OptionsResolver $resolver) diff --git a/core/Repository/RepositoryQuery.php b/core/Repository/RepositoryQuery.php index 2792efb..5b38eea 100644 --- a/core/Repository/RepositoryQuery.php +++ b/core/Repository/RepositoryQuery.php @@ -17,6 +17,7 @@ abstract class RepositoryQuery protected QueryBuilder $query; protected PaginatorInterface $paginator; protected string $id; + protected array $forcedFilterHandlers; public function __construct(ServiceEntityRepository $repository, string $id, PaginatorInterface $paginator = null) { @@ -24,6 +25,7 @@ abstract class RepositoryQuery $this->query = $repository->createQueryBuilder($id); $this->paginator = $paginator; $this->id = $id; + $this->forcedFilterHandlers = []; } public function __call(string $name, $params): self @@ -81,7 +83,9 @@ abstract class RepositoryQuery continue; } - if (is_int($value) || is_bool($value)) { + if (in_array($name, $this->forcedFilterHandlers)) { + $this->filterHandler($name, $value); + } elseif (is_int($value) || is_bool($value)) { $this->andWhere('.'.$name.' = :'.$name); $this->setParameter(':'.$name, $value); } elseif (is_string($value)) { diff --git a/core/Repository/Site/NodeRepository.php b/core/Repository/Site/NodeRepository.php index c83e32e..13a5c73 100644 --- a/core/Repository/Site/NodeRepository.php +++ b/core/Repository/Site/NodeRepository.php @@ -13,11 +13,13 @@ class NodeRepository extends NestedTreeRepository parent::__construct($manager, $manager->getClassMetadata(Node::class)); } - public function urlExists($url, Node $node) + public function urlExists($url, Node $node): bool { $query = $this->createQueryBuilder('n') ->join('n.menu', 'm') ->where('n.url = :url') + ->andWhere('n.disableUrl = 0') + ->andWhere('n.aliasNode is null') ->andWhere('m.navigation = :navigation') ->setParameter(':url', $url) ->setParameter(':navigation', $node->getMenu()->getNavigation()) @@ -32,7 +34,7 @@ class NodeRepository extends NestedTreeRepository return $query->getQuery() ->setMaxResults(1) - ->getOneOrNullResult() + ->getOneOrNullResult() !== null ; } } diff --git a/core/Repository/Site/Page/PageRepositoryQuery.php b/core/Repository/Site/Page/PageRepositoryQuery.php index efd9145..c22deef 100644 --- a/core/Repository/Site/Page/PageRepositoryQuery.php +++ b/core/Repository/Site/Page/PageRepositoryQuery.php @@ -16,9 +16,11 @@ class PageRepositoryQuery extends RepositoryQuery public function __construct(PageRepository $repository, PaginatorInterface $paginator) { parent::__construct($repository, 'p', $paginator); + + $this->forcedFilterHandlers[] = 'isAssociated'; } - public function filterByNavigation(Navigation $navigation) + public function filterByNavigation(Navigation $navigation): self { return $this ->leftJoin('.nodes', 'node') @@ -29,7 +31,7 @@ class PageRepositoryQuery extends RepositoryQuery ; } - public function filterById($id) + public function filterById($id): self { $this ->where('.id = :id') @@ -39,12 +41,37 @@ class PageRepositoryQuery extends RepositoryQuery return $this; } + protected function withAssociation(bool $isAssociated): self + { + $entities = $this->create()->find(); + $ids = []; + + foreach ($entities as $entity) { + if ($isAssociated && !$entity->getNodes()->isEmpty()) { + $ids[] = $entity->getId(); + } elseif (!$isAssociated && $entity->getNodes()->isEmpty()) { + $ids[] = $entity->getId(); + } + } + + $this + ->andWhere('.id IN (:ids)') + ->setParameter(':ids', $ids) + ; + + return $this; + } + protected function filterHandler(string $name, $value) { if ('navigation' === $name) { return $this->filterByNavigation($value); } + if ('isAssociated' === $name && $value > -1) { + $this->withAssociation((bool) $value); + } + return parent::filterHandler($name, $value); } } diff --git a/core/Resources/translations/messages.fr.yaml b/core/Resources/translations/messages.fr.yaml index 6127630..780f9e3 100644 --- a/core/Resources/translations/messages.fr.yaml +++ b/core/Resources/translations/messages.fr.yaml @@ -191,3 +191,4 @@ "Insert": "Insérer" "Attributes": "Attributs" "Choose": "Choisir" +"Associated": "Associé(e)" diff --git a/core/Resources/views/site/node_admin/_form.html.twig b/core/Resources/views/site/node_admin/_form.html.twig index 969eeb5..9fb460f 100644 --- a/core/Resources/views/site/node_admin/_form.html.twig +++ b/core/Resources/views/site/node_admin/_form.html.twig @@ -147,6 +147,10 @@
{{ 'No action'|trans }} + + {% if page and pageConfiguration %} + ({{ pageConfiguration.name }}) + {% endif %}
diff --git a/core/Twig/Extension/StringExtension.php b/core/Twig/Extension/StringExtension.php index bd816ca..c7f5c13 100644 --- a/core/Twig/Extension/StringExtension.php +++ b/core/Twig/Extension/StringExtension.php @@ -25,8 +25,8 @@ class StringExtension extends AbstractExtension ]; } - public function buildString(string $format, $object): string + public function buildString(?string $format, $object): string { - return $this->stringBuilder->build($format, $object); + return $this->stringBuilder->build((string) $format, $object); } }