diff --git a/src/Controller/CapsuleController.php b/src/Controller/CapsuleController.php index 19d03946061ce6ed580a73db2609cd2e23577310..6fbd799131d62149fc04229d95a78c87bf046a69 100755 --- a/src/Controller/CapsuleController.php +++ b/src/Controller/CapsuleController.php @@ -13,6 +13,7 @@ use App\Repository\CapsuleRepository; use App\Builder\CapsuleBuilder; use App\Form\CreateCapsuleFormType; use Doctrine\ORM\EntityManagerInterface; +use Knp\Bundle\PaginatorBundle\Pagination\SlidingPagination; use Knp\Component\Pager\PaginatorInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\Filesystem\Filesystem; @@ -75,45 +76,53 @@ class CapsuleController extends AbstractController $all_capsules = $current_user->getCapsules()->toArray(); $groups = $this->prependGroupAllToUserGroups($current_user); - $form = $this->createForm(FilterByGroupFormType::class, ['groups' => $groups, 'method' => 'GET']); + $group_id = $request->query->getInt('group', Group::$GROUP_ALL_ID); + $group = $this->getGroupByIdOrNull($groups, $group_id, $groups[0]); - // Retrieve group from GET data and update form data if required - $paginatorGroupName = $request->query->get('group', ''); - $forceForm = false; - if ($paginatorGroupName != '') { - $form->submit(['name' => $paginatorGroupName]); - $forceForm = true; - } else { - $form->handleRequest($request); - } + $filter_by_group_form = $this->createForm( + FilterByGroupFormType::class, + ['groups' => $groups, 'method' => 'GET', 'selected_group' => $group] + ); - if ($forceForm || $form->isSubmitted() && $form->isValid()) { - $group = $form->getData()['name']; + $filter_by_group_form->handleRequest($request); + if ($filter_by_group_form->isSubmitted() && $filter_by_group_form->isValid()) { + $group = $filter_by_group_form->getData()['name']; if (! $group instanceof Group) { throw new \Exception('Group not found'); } + } - if ($group->getId() !== Group::$GROUP_ALL_ID) { - $all_capsules = $group->getCapsules()->toArray(); - } - } else { - $group = null; + if ($group instanceof Group && $group->getId() !== Group::$GROUP_ALL_ID) { + $all_capsules = $group->getCapsules()->toArray(); } + $nb_elements_per_page = 5; + + // Fix the current page. + // For example, the user is on the page 5 without filter and apply a filter that reduce the number of pages. + // We display the last page. + $current_page = min( + [ + intval((count($all_capsules) / $nb_elements_per_page) + 1), + $request->query->getInt('page', 1) + ] + ); + $request->query->set('page', $current_page); + + // Pass group param to the paginator (it will be sent as GET data) $capsules = $paginator->paginate( $all_capsules, - $request->query->getInt('page', 1), - 5 + $current_page, + $nb_elements_per_page ); - // Pass group param to the paginator (it will be sent as GET data) - if ($group) { - $capsules->setParam('group', $group->getName()); + if ($capsules instanceof SlidingPagination) { + $capsules->setParam('group', $group->getId()); } return $this->renderForm('capsule/index.html.twig', [ - 'filterByGroupForm' => $form, + 'filterByGroupForm' => $filter_by_group_form, 'capsules' => $capsules, 'current_user' => $current_user, 'legacy_url' => $this->getParameter('app.legacy_external_prefix'), @@ -387,4 +396,25 @@ class CapsuleController extends AbstractController return $groups; } + + /** + * @param array<Group> $groups + * @param int|null $id + * @param Group $defaultGroup The returned group if current groups isn't found + * @return Group + */ + private function getGroupByIdOrNull(array $groups, ?int $id, Group $defaultGroup): Group + { + if (null === $id) { + return $defaultGroup; + } + + foreach ($groups as $g) { + if ($g->getId() === $id) { + return $g; + } + } + + return $defaultGroup; + } } diff --git a/src/Form/FilterByGroupFormType.php b/src/Form/FilterByGroupFormType.php index e2f8087a1df2c0d3783d688355eb9bbb7a59cefc..2e19fb28a02e40526267e017b6fd1c95ede51a4e 100644 --- a/src/Form/FilterByGroupFormType.php +++ b/src/Form/FilterByGroupFormType.php @@ -15,7 +15,7 @@ class FilterByGroupFormType extends AbstractType public function buildForm(FormBuilderInterface $builder, array $options): void { $groups = $options['data']['groups']; - + $selected_group = $options['data']['selected_group']; $builder ->add('name', ChoiceType::class, [ 'choices' => $groups, @@ -24,9 +24,10 @@ class FilterByGroupFormType extends AbstractType 'choice_label' => function (?Group $entity) { return $entity ? $entity->getName() : ''; }, - 'choice_value' => 'name', - 'choice_name' => 'name', - 'expanded' => false + 'choice_value' => 'id', + 'choice_name' => 'id', + 'expanded' => false, + 'data' => $selected_group ]); }