View source
<?php
namespace Drupal\pagerer;
use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
use Drupal\Core\Url;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\RequestStack;
class Pagerer implements PagererInterface, ContainerInjectionInterface {
protected $element;
protected $routeName;
protected $routeParameters = [];
protected $adaptiveKeys;
protected $factory;
protected $requestStack;
public function __construct(PagererFactoryInterface $pagerer_factory, RequestStack $request_stack) {
$this->factory = $pagerer_factory;
$this->requestStack = $request_stack;
}
public static function create(ContainerInterface $container, $element = NULL) {
$instance = new static($container
->get('pagerer.factory'), $container
->get('request_stack'));
$instance->element = $element;
if ($page_ak = $instance
->getCurrentRequest()->query
->get('page_ak')) {
$adaptive_keys = explode(',', $page_ak);
if (isset($adaptive_keys[$element])) {
$instance
->setAdaptiveKeys($adaptive_keys[$element]);
}
}
return $instance;
}
public function getRouteName() {
return $this->routeName;
}
public function setRouteName($route_name) {
$this->routeName = $route_name;
return $this;
}
public function getRouteParameters() {
return $this->routeParameters;
}
public function setRouteParameters(array $route_parameters) {
$this->routeParameters = $route_parameters;
return $this;
}
public function getElement() {
return $this->element;
}
protected function getCurrentRequest() {
return $this->requestStack
->getCurrentRequest();
}
public function init($total, $limit) {
pager_default_initialize($total, $limit, $this->element);
return $this;
}
public function getCurrentPage() {
global $pager_page_array;
return isset($pager_page_array[$this->element]) ? $pager_page_array[$this->element] : NULL;
}
public function getTotalPages() {
global $pager_total;
return isset($pager_total[$this->element]) ? $pager_total[$this->element] : 0;
}
public function getLastPage() {
global $pager_total;
return isset($pager_total[$this->element]) ? $pager_total[$this->element] - 1 : -1;
}
public function getTotalItems() {
global $pager_total_items;
return isset($pager_total_items[$this->element]) ? $pager_total_items[$this->element] : 0;
}
public function getLimit() {
global $pager_limits;
return isset($pager_limits[$this->element]) ? $pager_limits[$this->element] : 0;
}
public function getAdaptiveKeys() {
return $this->adaptiveKeys;
}
protected function setAdaptiveKeys($adaptive_keys) {
$this->adaptiveKeys = $adaptive_keys;
return $this;
}
public function getQueryParameters(array $parameters, $page, $adaptive_keys = NULL) {
$page_el = [];
$page_ak = [];
foreach ($this->factory
->all() as $i => $p) {
$page_el[$i] = $i == $this
->getElement() ? $page : $p
->getCurrentPage();
$page_ak[$i] = $i == $this
->getElement() ? $adaptive_keys : $p
->getAdaptiveKeys();
}
while (end($page_el) === NULL) {
array_pop($page_el);
}
$parameters['page'] = implode(',', $page_el);
while (end($page_ak) === NULL) {
array_pop($page_ak);
}
$parameters['page_ak'] = implode(',', $page_ak);
if ($current_request_query = $this
->getCurrentRequest()->query
->all()) {
$parameters = array_merge($current_request_query, $parameters);
}
if (empty($page_el)) {
unset($parameters['page']);
}
if (empty($page_ak)) {
unset($parameters['page_ak']);
}
return $parameters;
}
public function getHref(array $parameters, $page, $adaptive_keys = NULL, $set_query = TRUE) {
$options = $set_query ? [
'query' => $this
->getQueryParameters($parameters, $page, $adaptive_keys),
] : [];
return Url::fromRoute($this
->getRouteName(), $this
->getRouteParameters(), $options);
}
}