From 94cd7233ffc616b32aacb96dbe3d47bb00254664 Mon Sep 17 00:00:00 2001 From: jirista Date: Sat, 15 Oct 2016 21:56:18 +0200 Subject: [PATCH 1/2] Added pagination. Data loading moved to repositories. --- .gitignore | 3 + .../views/components/pagination.html.twig | 20 ++++++ .../views/homepage/homepage.html.twig | 6 ++ app/config/services.yml | 10 +++ .../Controller/HomepageController.php | 67 +++++++++++++------ .../Repository/CategoryRepository.php | 9 +++ .../Repository/ProductRepository.php | 8 +++ 7 files changed, 101 insertions(+), 22 deletions(-) create mode 100644 app/Resources/views/components/pagination.html.twig diff --git a/.gitignore b/.gitignore index dc9c2f2..32eb536 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,6 @@ /vendor/ /web/bundles/ composer.lock +workspace.xml +composer.phar +.idea diff --git a/app/Resources/views/components/pagination.html.twig b/app/Resources/views/components/pagination.html.twig new file mode 100644 index 0000000..7c9c4e7 --- /dev/null +++ b/app/Resources/views/components/pagination.html.twig @@ -0,0 +1,20 @@ +{% if maxPages > 1 %} + +{% endif %} \ No newline at end of file diff --git a/app/Resources/views/homepage/homepage.html.twig b/app/Resources/views/homepage/homepage.html.twig index 13b9283..17a1b4d 100644 --- a/app/Resources/views/homepage/homepage.html.twig +++ b/app/Resources/views/homepage/homepage.html.twig @@ -2,7 +2,13 @@ {% block body %}
+
+ {% include 'components/pagination.html.twig' with { 'page': page, 'maxPages': maxPages } %} +
{% include 'components/list.html.twig' %} +
+ {% include 'components/pagination.html.twig' with { 'page': page, 'maxPages': maxPages } %} +
{% endblock %} diff --git a/app/config/services.yml b/app/config/services.yml index 5c76fc5..cfbd9fc 100644 --- a/app/config/services.yml +++ b/app/config/services.yml @@ -7,3 +7,13 @@ services: # service_name: # class: AppBundle\Directory\ClassName # arguments: ["@another_service_name", "plain_value", "%parameter_name%"] + product_repository: + class: AppBundle\Repository\ProductRepository + factory: ["@doctrine.orm.entity_manager", getRepository] + arguments: + - AppBundle\Entity\ProductRepository + category_repository: + class: AppBundle\Repository\CategoryRepository + factory: ["@doctrine.orm.entity_manager", getRepository] + arguments: + - AppBundle\Entity\CategoryRepository \ No newline at end of file diff --git a/src/AppBundle/Controller/HomepageController.php b/src/AppBundle/Controller/HomepageController.php index 16d2edb..03b8d40 100644 --- a/src/AppBundle/Controller/HomepageController.php +++ b/src/AppBundle/Controller/HomepageController.php @@ -2,9 +2,11 @@ namespace AppBundle\Controller; use AppBundle\Entity\Category; use AppBundle\Entity\Product; +use AppBundle\Repository\ProductRepository; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\Annotation\Route; +use Doctrine\ORM\Tools\Pagination\Paginator; /** * @author Jan Klat @@ -19,34 +21,55 @@ class HomepageController extends Controller */ public function homepageAction(Request $request) { + $page = 1; + if ($request->query->has('page')) { + $page = $request->query->get('page'); + } + + $productRepository = $this->container->get('doctrine.orm.entity_manager')->getRepository + ('AppBundle\Entity\Product'); + + $limit = 9; + $paginatedProducts = $this->paginate($productRepository->getAllProducts(), $page, $limit); + $maxPages = ceil($paginatedProducts->count() / $limit); + + $categoryRepository = $this->container->get('doctrine.orm.entity_manager')->getRepository + ('AppBundle\Entity\Category'); + return $this->render("homepage/homepage.html.twig", [ - "products" => $this->getDoctrine()->getRepository(Product::class)->findBy( - [], - [ - "rank" => "desc" - ], - 20 - ), - "categories" => $this->getDoctrine()->getRepository(Category::class)->findBy( - [], - [ - "rank" => "desc", - ] - ), + "page" => $page, + "maxPages" => $maxPages, + "products" => $paginatedProducts, + "categories" => $categoryRepository->getAllCategories(), ]); } - /** - * @Route("/hello", name="hello") - * @param Request $request - * @return \Symfony\Component\HttpFoundation\Response + * Paginator Helper + * Source: https://anil.io/blog/symfony/doctrine/symfony-and-doctrine-pagination-with-twig/ + * + * Pass through a query object, current page & limit + * the offset is calculated from the page and limit + * returns an `Paginator` instance, which you can call the following on: + * + * $paginator->getIterator()->count() # Total fetched (ie: `5` posts) + * $paginator->count() # Count of ALL posts (ie: `20` posts) + * $paginator->getIterator() # ArrayIterator + * + * @param Doctrine\ORM\Query $dql DQL Query Object + * @param integer $page Current page (defaults to 1) + * @param integer $limit The total number per page (defaults to 5) + * + * @return \Doctrine\ORM\Tools\Pagination\Paginator */ - public function helloAction(Request $request) + private function paginate($dql, $page = 1, $limit = 9) { - return $this->render("homepage/hello.html.twig", [ - "who" => "world", - ]); - } + $paginator = new Paginator($dql); + $paginator->getQuery() + ->setFirstResult($limit * ($page - 1)) // Offset + ->setMaxResults($limit); // Limit + + return $paginator; + } } \ No newline at end of file diff --git a/src/AppBundle/Repository/CategoryRepository.php b/src/AppBundle/Repository/CategoryRepository.php index f9b2633..33fdfbe 100644 --- a/src/AppBundle/Repository/CategoryRepository.php +++ b/src/AppBundle/Repository/CategoryRepository.php @@ -12,4 +12,13 @@ */ class CategoryRepository extends EntityRepository { + public function getAllCategories() + { + return $this->findBy( + [], + [ + "rank" => "desc", + ] + ); + } } diff --git a/src/AppBundle/Repository/ProductRepository.php b/src/AppBundle/Repository/ProductRepository.php index 74463f1..ab5c6d3 100644 --- a/src/AppBundle/Repository/ProductRepository.php +++ b/src/AppBundle/Repository/ProductRepository.php @@ -11,4 +11,12 @@ class ProductRepository extends EntityRepository { + public function getAllProducts() + { + $query = $this->createQueryBuilder('p') + ->orderBy('p.rank', 'DESC') + ->getQuery(); + + return $query; + } } From 8cde6cee46d219d1263dc8ff050a628968538e1e Mon Sep 17 00:00:00 2001 From: jirista Date: Sat, 15 Oct 2016 22:35:19 +0200 Subject: [PATCH 2/2] Added breadcrumbs draft --- app/Resources/views/components/breadcrumbs.html.twig | 11 +++++++++++ app/Resources/views/homepage/homepage.html.twig | 3 +++ app/Resources/views/product/detail.html.twig | 9 +++------ src/AppBundle/Controller/HomepageController.php | 5 +++++ src/AppBundle/Controller/ProductController.php | 7 +++++++ 5 files changed, 29 insertions(+), 6 deletions(-) create mode 100644 app/Resources/views/components/breadcrumbs.html.twig diff --git a/app/Resources/views/components/breadcrumbs.html.twig b/app/Resources/views/components/breadcrumbs.html.twig new file mode 100644 index 0000000..4232b69 --- /dev/null +++ b/app/Resources/views/components/breadcrumbs.html.twig @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/app/Resources/views/homepage/homepage.html.twig b/app/Resources/views/homepage/homepage.html.twig index 17a1b4d..4abdef8 100644 --- a/app/Resources/views/homepage/homepage.html.twig +++ b/app/Resources/views/homepage/homepage.html.twig @@ -2,6 +2,9 @@ {% block body %}
+
+ {% include 'components/breadcrumbs.html.twig' %} +
{% include 'components/pagination.html.twig' with { 'page': page, 'maxPages': maxPages } %}
diff --git a/app/Resources/views/product/detail.html.twig b/app/Resources/views/product/detail.html.twig index eb279ca..5d33918 100644 --- a/app/Resources/views/product/detail.html.twig +++ b/app/Resources/views/product/detail.html.twig @@ -1,12 +1,9 @@ {% extends 'base.html.twig' %} {% block body %} - +
+ {% include 'components/breadcrumbs.html.twig' %} +

{{ product.title }}

{% endblock %} \ No newline at end of file diff --git a/src/AppBundle/Controller/HomepageController.php b/src/AppBundle/Controller/HomepageController.php index 03b8d40..5496cbf 100644 --- a/src/AppBundle/Controller/HomepageController.php +++ b/src/AppBundle/Controller/HomepageController.php @@ -36,11 +36,16 @@ public function homepageAction(Request $request) $categoryRepository = $this->container->get('doctrine.orm.entity_manager')->getRepository ('AppBundle\Entity\Category'); + $breadcrumbs = [ + "homepage" => ["title" => "Úvodní stránka"] + ]; + return $this->render("homepage/homepage.html.twig", [ "page" => $page, "maxPages" => $maxPages, "products" => $paginatedProducts, "categories" => $categoryRepository->getAllCategories(), + "breadcrumbs" => $breadcrumbs ]); } diff --git a/src/AppBundle/Controller/ProductController.php b/src/AppBundle/Controller/ProductController.php index ce54c46..ae5b207 100644 --- a/src/AppBundle/Controller/ProductController.php +++ b/src/AppBundle/Controller/ProductController.php @@ -28,7 +28,14 @@ public function productDetailAction(Request $request) throw new NotFoundHttpException("Produkt neexistuje"); } + $breadcrumbs = [ + "homepage" => ["title" => "Úvodní stránka"], + "#notyet" => ["title" => $product->getCategory()->getTitle()], + "product_detail" => ["title" => $product->getTitle(), "slug" => $request->attributes->get("slug")] + ]; + return $this->render("product/detail.html.twig", [ + "breadcrumbs" => $breadcrumbs, "product" => $product, "categories" => $this->getDoctrine()->getRepository(Category::class)->findBy( [],