From 5d41b6fef5574368e6fa1a79d36c5448b02ea97b Mon Sep 17 00:00:00 2001 From: lubiana Date: Mon, 8 Jul 2024 21:23:35 +0200 Subject: [PATCH] #33: limit orders on first page and paginate --- src/Controller/FoodOrderController.php | 27 +++++++++++++++++--- src/Repository/FoodOrderRepository.php | 23 ++++++++++++----- templates/food_order/index.html.twig | 22 ++++++++++------ tests/Controller/FoodOrderControllerTest.php | 4 +-- 4 files changed, 57 insertions(+), 19 deletions(-) diff --git a/src/Controller/FoodOrderController.php b/src/Controller/FoodOrderController.php index 50e5df4..9fdb77d 100644 --- a/src/Controller/FoodOrderController.php +++ b/src/Controller/FoodOrderController.php @@ -14,11 +14,32 @@ use Symfony\Component\Routing\Attribute\Route; #[Route('/food/order')] final class FoodOrderController extends AbstractController { - #[Route('/', name: 'app_food_order_index', methods: ['GET'])] - public function index(FoodOrderRepository $foodOrderRepository): Response + #[Route( + path: '/list/{page}', + name: 'app_food_order_index', + requirements: [ + 'page' => '\d+', + ], + methods: ['GET'] + )] + public function index(FoodOrderRepository $foodOrderRepository, int $page = 1): Response { + $days = 4; + if ($page > 1) { + $days = 0; + } + $nextPage = $page + 1; + $prevPage = $page - 1; + $itemsPerPage = 10; + if($foodOrderRepository->count() < $page * $itemsPerPage) { + $nextPage = $page; + } + return $this->render('food_order/index.html.twig', [ - 'food_orders' => $foodOrderRepository->findLatestEntries(), + 'food_orders' => $foodOrderRepository->findLatestEntries(page: $page, pagesize: $itemsPerPage, days: $days), + 'current_page' => $page, + 'next_page' => $nextPage, + 'prev_page' => $prevPage, ]); } diff --git a/src/Repository/FoodOrderRepository.php b/src/Repository/FoodOrderRepository.php index aea76d5..c0b2405 100644 --- a/src/Repository/FoodOrderRepository.php +++ b/src/Repository/FoodOrderRepository.php @@ -3,7 +3,10 @@ namespace App\Repository; use App\Entity\FoodOrder; +use DateInterval; +use DateTimeImmutable; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; +use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Persistence\ManagerRegistry; /** @@ -27,15 +30,23 @@ final class FoodOrderRepository extends ServiceEntityRepository /** * @return FoodOrder[] */ - public function findLatestEntries(int $limit = 5): array + public function findLatestEntries(int $page = 1, int $pagesize = 10, int $days = 4): array { - $qb = $this->createQueryBuilder('alias'); - $qb->orderBy('alias.id', 'DESC'); - $qb->setMaxResults($limit); + $result = $this->createQueryBuilder('alias') + ->orderBy('alias.id', 'DESC') + ->setFirstResult(($page - 1) * $pagesize) + ->setMaxResults($pagesize) + ->getQuery() + ->getResult(); - $query = $qb->getQuery(); + if ($days < 1) { + return $result; + } - return $query->getResult(); + $date = (new DateTimeImmutable)->sub(new DateInterval('P' . $days . 'D')); + return (new ArrayCollection($result)) + ->filter(static fn(FoodOrder $order): bool => $order->getCreatedAt() >= $date) + ->getValues(); } } diff --git a/templates/food_order/index.html.twig b/templates/food_order/index.html.twig index e0aaf6c..cdd778b 100644 --- a/templates/food_order/index.html.twig +++ b/templates/food_order/index.html.twig @@ -4,7 +4,14 @@ {% block body %}

FoodOrder index

- +
+ +
+
@@ -25,11 +32,10 @@ {% endfor %}
-
- -
+ {% if prev_page > 0 %} + previous page | + {% endif %} + {% if next_page > current_page %} + next page + {% endif %} {% endblock %} diff --git a/tests/Controller/FoodOrderControllerTest.php b/tests/Controller/FoodOrderControllerTest.php index 9e72792..59eceff 100644 --- a/tests/Controller/FoodOrderControllerTest.php +++ b/tests/Controller/FoodOrderControllerTest.php @@ -41,7 +41,7 @@ final class FoodOrderControllerTest extends DbWebTest $this->manager->persist($this->vendor); $this->manager->flush(); - $crawler = $this->client->request('GET', $this->path); + $crawler = $this->client->request('GET', "{$this->path}list"); self::assertResponseStatusCodeSame(200); self::assertPageTitleContains('FoodOrder index'); $this->assertCount( @@ -61,7 +61,7 @@ final class FoodOrderControllerTest extends DbWebTest 'food_order[foodVendor]' => $this->vendor->getId(), ]); - self::assertResponseRedirects($this->path); + self::assertResponseRedirects("{$this->path}list"); self::assertSame(1, $this->repository->count([])); } }