* remove work from constructor * refactor twig extensions * upgrade theme * replace sub-request with direct template rendering
110 lines
3.1 KiB
PHP
110 lines
3.1 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This file is part of the Kimai time-tracking app.
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace App\Twig;
|
|
|
|
use Pagerfanta\Pagerfanta;
|
|
use Pagerfanta\View\TwitterBootstrap3View;
|
|
use Pagerfanta\View\ViewInterface;
|
|
use Symfony\Component\PropertyAccess\PropertyAccess;
|
|
use Symfony\Component\PropertyAccess\PropertyPath;
|
|
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
|
|
use Twig\Extension\AbstractExtension;
|
|
use Twig\TwigFunction;
|
|
|
|
class PaginationExtension extends AbstractExtension
|
|
{
|
|
/**
|
|
* @var ViewInterface
|
|
*/
|
|
private $view;
|
|
/**
|
|
* @var UrlGeneratorInterface
|
|
*/
|
|
private $router;
|
|
|
|
public function __construct(UrlGeneratorInterface $router)
|
|
{
|
|
$this->router = $router;
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function getFunctions()
|
|
{
|
|
return [
|
|
new TwigFunction('pagerfanta', [$this, 'renderPagerfanta'], ['is_safe' => ['html']]),
|
|
new TwigFunction('pagination', [$this, 'renderPagination'], ['is_safe' => ['html']]),
|
|
];
|
|
}
|
|
|
|
private function getView(): ViewInterface
|
|
{
|
|
if (null === $this->view) {
|
|
$this->view = new TwitterBootstrap3View();
|
|
}
|
|
|
|
return $this->view;
|
|
}
|
|
|
|
/**
|
|
* @deprecated since 1.8
|
|
*/
|
|
public function renderPagerfanta(Pagerfanta $pagerfanta, $viewName = null, array $options = [])
|
|
{
|
|
@trigger_error('Twig function pagerfanta() is deprecated and will be removed with 2.0, use pagination() instead', E_USER_DEPRECATED);
|
|
|
|
if (\is_array($viewName)) {
|
|
$options = $viewName;
|
|
}
|
|
|
|
return $this->renderPagination($pagerfanta, $options);
|
|
}
|
|
|
|
public function renderPagination(Pagerfanta $pagerfanta, array $options = [])
|
|
{
|
|
$routeGenerator = $this->createRouteGenerator($options);
|
|
|
|
$options['proximity'] = 1;
|
|
//$options['prev_message'] = '←';
|
|
//$options['next_message'] = '→';
|
|
$options['prev_message'] = '<i class="fas fa-chevron-left"></i>';
|
|
$options['next_message'] = '<i class="fas fa-chevron-right"></i>';
|
|
|
|
return $this->getView()->render($pagerfanta, $routeGenerator, $options);
|
|
}
|
|
|
|
private function createRouteGenerator(array $options = [])
|
|
{
|
|
$options = array_replace([
|
|
'routeName' => null,
|
|
'routeParams' => [],
|
|
'pageParameter' => '[page]',
|
|
], $options);
|
|
|
|
$router = $this->router;
|
|
|
|
if (null === $options['routeName']) {
|
|
throw new \Exception('Pagination is missing the "routeName" option');
|
|
}
|
|
|
|
$routeName = $options['routeName'];
|
|
$routeParams = $options['routeParams'];
|
|
$pagePropertyPath = new PropertyPath($options['pageParameter']);
|
|
|
|
return function ($page) use ($router, $routeName, $routeParams, $pagePropertyPath) {
|
|
$propertyAccessor = PropertyAccess::createPropertyAccessor();
|
|
$propertyAccessor->setValue($routeParams, $pagePropertyPath, $page);
|
|
|
|
return $router->generate($routeName, $routeParams);
|
|
};
|
|
}
|
|
}
|