diff --git a/src/Controller/ConferenceAdminController.php b/src/Controller/ConferenceAdminController.php index 80c8f07..d7e821a 100644 --- a/src/Controller/ConferenceAdminController.php +++ b/src/Controller/ConferenceAdminController.php @@ -10,6 +10,7 @@ use App\Core\Manager\EntityManager; use App\Entity\Conference as Entity; use App\Factory\ConferenceFactory as Factory; use App\Form\ConferenceType as Type; +use App\Form\ConferenceFilterType as FilterType; use App\Repository\ConferenceRepositoryQuery as RepositoryQuery; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; @@ -101,7 +102,7 @@ class ConferenceAdminController extends CrudController ->setForm('edit', Type::class, []) ->setForm('new', Type::class) - // ->setForm('filter', Type::class) + ->setForm('filter', FilterType::class) ->setView('form', 'admin/conference/_form.html.twig') @@ -125,6 +126,11 @@ class ConferenceAdminController extends CrudController ->setField('index', 'Label', Field\TextField::class, [ 'property' => 'label', ]) + ->setField('index', 'Theme type', Field\TextField::class, [ + 'property' => 'themeType', + 'sort' => ['date', '.date'], + 'attr' => ['class' => 'col-3'], + ]) ->setField('index', 'Date', Field\DateField::class, [ 'property' => 'date', 'format' => 'd/m/Y', diff --git a/src/Controller/ProjectAdminController.php b/src/Controller/ProjectAdminController.php index 50719dd..dd6d909 100644 --- a/src/Controller/ProjectAdminController.php +++ b/src/Controller/ProjectAdminController.php @@ -10,6 +10,7 @@ use App\Core\Manager\EntityManager; use App\Entity\Project as Entity; use App\Factory\ProjectFactory as Factory; use App\Form\ProjectType as Type; +use App\Form\ProjectFilterType as FilterType; use App\Repository\ProjectRepositoryQuery as RepositoryQuery; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; @@ -101,7 +102,7 @@ class ProjectAdminController extends CrudController ->setForm('edit', Type::class, []) ->setForm('new', Type::class) - // ->setForm('filter', Type::class) + ->setForm('filter', FilterType::class) // ->setMaxPerPage('index', 20) diff --git a/src/Form/ConferenceFilterType.php b/src/Form/ConferenceFilterType.php new file mode 100644 index 0000000..d85d2f3 --- /dev/null +++ b/src/Form/ConferenceFilterType.php @@ -0,0 +1,39 @@ +add('label', null, [ + 'required' => false, + ]) + ->add('themeType', EntityType::class, [ + 'required' => false, + 'class' => ThemeType::class, + 'query_builder' => function (EntityRepository $er) { + return $er->createQueryBuilder('t') + ->addOrderBy('t.label', 'ASC') + ; + }, + ]) + ; + } + + public function configureOptions(OptionsResolver $resolver): void + { + $resolver->setDefaults([ + 'data_class' => null, + 'csrf_protection' => false, + ]); + } +} diff --git a/src/Form/ProjectFilterType.php b/src/Form/ProjectFilterType.php new file mode 100644 index 0000000..f92129d --- /dev/null +++ b/src/Form/ProjectFilterType.php @@ -0,0 +1,39 @@ +add('label', null, [ + 'required' => false, + ]) + ->add('establishment', EntityType::class, [ + 'required' => false, + 'class' => Establishment::class, + 'query_builder' => function (EntityRepository $er) { + return $er->createQueryBuilder('e') + ->addOrderBy('e.name', 'ASC') + ; + }, + ]) + ; + } + + public function configureOptions(OptionsResolver $resolver): void + { + $resolver->setDefaults([ + 'data_class' => null, + 'csrf_protection' => false, + ]); + } +} diff --git a/src/Repository/ConferenceRepositoryQuery.php b/src/Repository/ConferenceRepositoryQuery.php index c18c0ce..522470c 100644 --- a/src/Repository/ConferenceRepositoryQuery.php +++ b/src/Repository/ConferenceRepositoryQuery.php @@ -3,8 +3,9 @@ namespace App\Repository; use App\Core\Repository\RepositoryQuery; -use Knp\Component\Pager\PaginatorInterface; +use App\Entity\ThemeType; use App\Repository\ConferenceRepository as Repository; +use Knp\Component\Pager\PaginatorInterface; class ConferenceRepositoryQuery extends RepositoryQuery { @@ -12,4 +13,25 @@ class ConferenceRepositoryQuery extends RepositoryQuery { parent::__construct($repository, 'c', $paginator); } + + public function withThemeType(?ThemeType $themeType): self + { + if (!$themeType) { + return $this; + } + + $keyId = 'id'.mt_rand(); + + return $this + ->andWhere('.themeType = :'.$keyId) + ->setParameter($keyId, $themeType->getId()) + ; + } + + protected function filterHandler(string $name, $value) + { + if ('themeType' === $name) { + return $this->withThemeType($value); + } + } } diff --git a/src/Repository/ProjectRepositoryQuery.php b/src/Repository/ProjectRepositoryQuery.php index 821621b..d31eafa 100644 --- a/src/Repository/ProjectRepositoryQuery.php +++ b/src/Repository/ProjectRepositoryQuery.php @@ -3,8 +3,9 @@ namespace App\Repository; use App\Core\Repository\RepositoryQuery; -use Knp\Component\Pager\PaginatorInterface; +use App\Entity\Establishment; use App\Repository\ProjectRepository as Repository; +use Knp\Component\Pager\PaginatorInterface; class ProjectRepositoryQuery extends RepositoryQuery { @@ -24,4 +25,27 @@ class ProjectRepositoryQuery extends RepositoryQuery ->setParameter('ids', $ids) ; } + + public function withEstablishment(?Establishment $establishment): self + { + if (!$establishment) { + return $this; + } + + $keyEstablishment = 'k'.mt_rand(); + $keyId = 'id'.mt_rand(); + + return $this + ->innerJoin('.establishments', $keyEstablishment) + ->andWhere($keyEstablishment.'.id = :'.$keyId) + ->setParameter($keyId, $establishment->getId()) + ; + } + + protected function filterHandler(string $name, $value) + { + if ('establishment' === $name) { + return $this->withEstablishment($value); + } + } }