extra_pagination-8.x-1.0/extra_pagination.module
extra_pagination.module
<?php
/**
* @file
* Adds a new set of pager items to the full pager.
*/
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\Url;
use Drupal\Core\Template\Attribute;
/**
* Implements hook_help().
*/
function extra_pagination_help($route_name, RouteMatchInterface $route_match) {
switch ($route_name) {
case 'help.page.extra_pagination':
$output = '<h3>' . t('About') . '</h3>';
$output .= '<p>' . t('Extra Pagination is a very simple module that provides a new set of pager items between the last visible pager link and the maximum pager number. This is mainly done for SEO reasons to make us reach any page in 3-4 clicks maximum. Suggestions and feature requests are welcome.') . '</p>';
return $output;
}
return '';
}
/**
* Implements hook_theme_registry_alter
*/
function extra_pagination_theme_registry_alter(&$theme_registry) {
$module_path = \Drupal::service('extension.list.module')->getPath('extra_pagination');
$theme_registry['pager']['path'] = $module_path . '/templates';
}
/**
* Implements template_preprocess_pager().
*/
function extra_pagination_preprocess_pager(&$variables) {
$pager_manager = \Drupal::service('pager.manager');
$element = $variables['pager']['#element'];
$parameters = $variables['pager']['#parameters'] ?? [];
$quantity = $variables['pager']['#quantity'] ?? 9;
$pager = $pager_manager->getPager($element);
if (!$pager || $pager->getTotalPages() <= 1) {
// No pager needed if there is only one page.
return;
}
$current_page = $pager->getCurrentPage();
$total_pages = $pager->getTotalPages();
$tags = $variables['pager']['#tags'] ?? [];
$route_name = $variables['pager']['#route_name'];
$route_parameters = $variables['pager']['#route_parameters'] ?? [];
$variables['items'] = [];
$variables['ellipses'] = [];
$variables['current'] = $current_page + 1;
// Add "First" and "Previous" links.
if ($current_page > 0) {
$variables['items']['first'] = [
'href' => Url::fromRoute($route_name, $route_parameters, [
'query' => $pager_manager->getUpdatedParameters($parameters, $element, 0),
])->toString(),
'text' => $tags[0] ?? t('First'),
'attributes' => new Attribute(),
];
$variables['items']['previous'] = [
'href' => Url::fromRoute($route_name, $route_parameters, [
'query' => $pager_manager->getUpdatedParameters($parameters, $element, $current_page - 1),
])->toString(),
'text' => $tags[1] ?? t('Previous'),
'attributes' => new Attribute(),
];
}
// Add numbered page links.
$start = max(1, $current_page + 1 - ceil($quantity / 2));
$end = min($total_pages, $start + $quantity - 1);
if ($start > 1) {
$variables['ellipses']['previous'] = TRUE;
}
for ($i = $start; $i <= $end; $i++) {
$variables['items']['pages'][$i] = [
'href' => Url::fromRoute($route_name, $route_parameters, [
'query' => $pager_manager->getUpdatedParameters($parameters, $element, $i - 1),
])->toString(),
'text' => $i,
'attributes' => new Attribute(),
];
}
if ($end < $total_pages) {
$variables['ellipses']['next'] = TRUE;
}
// Add "Next" and "Last" links.
if ($current_page < $total_pages - 1) {
$variables['items']['next'] = [
'href' => Url::fromRoute($route_name, $route_parameters, [
'query' => $pager_manager->getUpdatedParameters($parameters, $element, $current_page + 1),
])->toString(),
'text' => $tags[3] ?? t('Next'),
'attributes' => new Attribute(),
];
$variables['items']['last'] = [
'href' => Url::fromRoute($route_name, $route_parameters, [
'query' => $pager_manager->getUpdatedParameters($parameters, $element, $total_pages - 1),
])->toString(),
'text' => $tags[4] ?? t('Last'),
'attributes' => new Attribute(),
];
}
// Calculate various markers within this pager piece:
// Middle is used to "center" pages around the current page.
$pager_middle = ceil($quantity / 2);
// last is the last page listed by this pager piece (re quantity).
$pager_last = $current_page + $quantity - $pager_middle;
// max is the maximum page number.
$pager_max = $pager->getTotalPages();
require_once __DIR__ . "/includes/pager.inc";
$variables['items']['extra'] = pager_extra_pages($pager_last, $pager_max, $route_parameters, $parameters, $element);
}
