TwitterBootstrap4PagelessView and PagelessDoctrineORMAdapter implemented to remove unnecessary COUNT() queries.
This commit is contained in:
parent
9a6b5e258d
commit
8663e9f5d9
|
@ -1,2 +1,2 @@
|
|||
white_october_pagerfanta:
|
||||
default_view: twitter_bootstrap4
|
||||
default_view: twitter_bootstrap4_pageless
|
||||
|
|
|
@ -48,3 +48,9 @@ services:
|
|||
|
||||
Monolog\Processor\PsrLogMessageProcessor:
|
||||
tags: { name: monolog.processor, handler: sentry }
|
||||
|
||||
# Pagerfanta overrides
|
||||
pagerfanta.view.bootstrap4_pageless:
|
||||
class: App\Pager\View\TwitterBootstrap4PagelessView
|
||||
public: false
|
||||
tags: [{ name: pagerfanta.view, alias: twitter_bootstrap4_pageless }]
|
||||
|
|
|
@ -4,8 +4,8 @@ namespace App\Api\V1\Controller;
|
|||
|
||||
use App\Api\V1\DTO\ListPage;
|
||||
use App\Magnetico\Entity\Torrent;
|
||||
use App\Pager\PagelessDoctrineORMAdapter;
|
||||
use App\Search\TorrentSearcher;
|
||||
use Pagerfanta\Adapter\DoctrineORMAdapter;
|
||||
use Pagerfanta\Pagerfanta;
|
||||
use Symfony\Component\HttpFoundation\{JsonResponse, Request};
|
||||
|
||||
|
@ -20,9 +20,10 @@ class TorrentController extends AbstractApiController
|
|||
$orderBy = $request->query->get('order-by');
|
||||
$order = $request->query->get('order', 'asc');
|
||||
|
||||
$pagerAdapter = new DoctrineORMAdapter($searcher->createSearchQueryBuilder($query, $orderBy, $order));
|
||||
$pagerAdapter = new PagelessDoctrineORMAdapter($searcher->createSearchQueryBuilder($query, $orderBy, $order));
|
||||
$pager = new Pagerfanta($pagerAdapter);
|
||||
$pager
|
||||
->setAllowOutOfRangePages(true)
|
||||
->setCurrentPage($page)
|
||||
->setMaxPerPage(self::PER_PAGE)
|
||||
;
|
||||
|
|
|
@ -4,7 +4,7 @@ namespace App\Controller;
|
|||
|
||||
use App\Magnetico\Entity\Torrent;
|
||||
use App\Search\TorrentSearcher;
|
||||
use Pagerfanta\Adapter\DoctrineORMAdapter;
|
||||
use App\Pager\PagelessDoctrineORMAdapter;
|
||||
use Pagerfanta\Pagerfanta;
|
||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||
use Symfony\Component\HttpFoundation\{Request, Response};
|
||||
|
@ -20,9 +20,10 @@ class TorrentController extends AbstractController
|
|||
$orderBy = $request->query->get('order-by');
|
||||
$order = $request->query->get('order', 'asc');
|
||||
|
||||
$pagerAdapter = new DoctrineORMAdapter($searcher->createSearchQueryBuilder($query, $orderBy, $order));
|
||||
$pagerAdapter = new PagelessDoctrineORMAdapter($searcher->createSearchQueryBuilder($query, $orderBy, $order));
|
||||
$pager = new Pagerfanta($pagerAdapter);
|
||||
$pager
|
||||
->setAllowOutOfRangePages(true)
|
||||
->setCurrentPage($page)
|
||||
->setMaxPerPage(self::PER_PAGE)
|
||||
;
|
||||
|
|
16
src/Pager/PagelessDoctrineORMAdapter.php
Normal file
16
src/Pager/PagelessDoctrineORMAdapter.php
Normal file
|
@ -0,0 +1,16 @@
|
|||
<?php
|
||||
|
||||
namespace App\Pager;
|
||||
|
||||
use Pagerfanta\Adapter\DoctrineORMAdapter;
|
||||
|
||||
/**
|
||||
* This adapter don't make COUNT() queries.
|
||||
*/
|
||||
class PagelessDoctrineORMAdapter extends DoctrineORMAdapter
|
||||
{
|
||||
public function getNbResults()
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
96
src/Pager/View/TwitterBootstrap4PagelessView.php
Normal file
96
src/Pager/View/TwitterBootstrap4PagelessView.php
Normal file
|
@ -0,0 +1,96 @@
|
|||
<?php
|
||||
|
||||
namespace App\Pager\View;
|
||||
|
||||
use Pagerfanta\Pagerfanta;
|
||||
use Pagerfanta\PagerfantaInterface;
|
||||
use Pagerfanta\View\Template\TemplateInterface;
|
||||
use Pagerfanta\View\Template\TwitterBootstrap4Template;
|
||||
use Pagerfanta\View\ViewInterface;
|
||||
|
||||
/**
|
||||
* Modified TwitterBootstrap4View.
|
||||
*
|
||||
* Removes page list and don't disable 'non-existing' pages.
|
||||
*/
|
||||
class TwitterBootstrap4PagelessView implements ViewInterface
|
||||
{
|
||||
private TemplateInterface $template;
|
||||
|
||||
/** @var Pagerfanta */
|
||||
private PagerfantaInterface $pagerfanta;
|
||||
|
||||
private int $currentPage;
|
||||
|
||||
public function __construct(TemplateInterface $template = null)
|
||||
{
|
||||
$this->template = $template ?: $this->createDefaultTemplate();
|
||||
}
|
||||
|
||||
public function render(PagerfantaInterface $pagerfanta, $routeGenerator, array $options = array())
|
||||
{
|
||||
$this->initializePagerfanta($pagerfanta);
|
||||
|
||||
$this->configureTemplate($routeGenerator, $options);
|
||||
|
||||
return $this->generate();
|
||||
}
|
||||
|
||||
public function getName()
|
||||
{
|
||||
return 'twitter_bootstrap4_pageless';
|
||||
}
|
||||
|
||||
protected function createDefaultTemplate()
|
||||
{
|
||||
return new TwitterBootstrap4Template();
|
||||
}
|
||||
|
||||
private function initializePagerfanta(PagerfantaInterface $pagerfanta)
|
||||
{
|
||||
$this->pagerfanta = $pagerfanta;
|
||||
$this->currentPage = $pagerfanta->getCurrentPage();
|
||||
}
|
||||
|
||||
private function configureTemplate($routeGenerator, $options)
|
||||
{
|
||||
$this->template->setRouteGenerator($routeGenerator);
|
||||
$this->template->setOptions($options);
|
||||
}
|
||||
|
||||
private function generate()
|
||||
{
|
||||
$pages = $this->generatePages();
|
||||
|
||||
return $this->generateContainer($pages);
|
||||
}
|
||||
|
||||
private function generateContainer($pages)
|
||||
{
|
||||
return str_replace('%pages%', $pages, $this->template->container());
|
||||
}
|
||||
|
||||
private function generatePages()
|
||||
{
|
||||
return $this->previous().$this->currentPage().$this->next();
|
||||
}
|
||||
|
||||
private function previous(): string
|
||||
{
|
||||
if ($this->currentPage > 1) {
|
||||
return $this->template->previousEnabled($this->pagerfanta->getPreviousPage());
|
||||
}
|
||||
|
||||
return $this->template->previousDisabled();
|
||||
}
|
||||
|
||||
private function next(): string
|
||||
{
|
||||
return $this->template->nextEnabled($this->currentPage + 1);
|
||||
}
|
||||
|
||||
private function currentPage(): string
|
||||
{
|
||||
return $this->template->current($this->currentPage);
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue