PagerManagerInterface.php
Same filename in other branches
Namespace
Drupal\Core\PagerFile
-
core/
lib/ Drupal/ Core/ Pager/ PagerManagerInterface.php
View source
<?php
namespace Drupal\Core\Pager;
/**
* This is a service for pager information.
*
* The pager.manager service manages the pager information which will eventually
* be rendered into pager elements in the response. To gather information
* related to pager information in the request, use the pager.parameters
* service.
*
* Since there can be multiple pagers per requested page, each one is
* represented by an 'element' ID. This is an integer. It represents the index
* of the pager element within the 'page' query. The value of the element is an
* integer telling us the current page number for that pager.
*
* @see \Drupal\Core\Pager\PagerParametersInterface
*/
interface PagerManagerInterface {
/**
* Initializes a pager.
*
* This function sets up the necessary variables so that the render system
* will correctly process #type 'pager' render arrays to output pagers that
* correspond to the items being displayed.
*
* If the items being displayed result from a database query performed using
* Drupal's database API, and if you have control over the construction of the
* database query, you do not need to call this function directly; instead,
* you can extend the query object with the 'PagerSelectExtender' extender
* before executing it. For example:
* @code
* $query = $connection->select('some_table')
* ->extend(PagerSelectExtender::class);
* @endcode
*
* However, if you are using a different method for generating the items to be
* paged through, then you should call this service in preparation.
*
* The following example shows how this service can be used in a controller
* that invokes an external datastore with an SQL-like syntax:
* @code
* // First find the total number of items and initialize the pager.
* $total = my_module_select("SELECT COUNT(*) FROM data WHERE status = 1")->result();
* $num_per_page = \Drupal::config('my_module.settings')->get('num_per_page');
* $pager = \Drupal::service('pager.manager')->createPager($total, $num_per_page);
* $page = $pager->getCurrentPage();
*
* // Next, retrieve the items for the current page and put them into a
* // render array.
* $offset = $num_per_page * $page;
* $result = my_module_select("SELECT * FROM data " . $where . " LIMIT %d, %d", $offset, $num_per_page)->fetchAll();
* $render = [];
* $render[] = [
* '#theme' => 'my_module_results',
* '#result' => $result,
* ];
*
* // Finally, add the pager to the render array, and return.
* $render[] = ['#type' => 'pager'];
* return $render;
* @endcode
*
* A second example involves a controller that invokes an external search
* service where the total number of matching results is provided as part of
* the returned set (so that we do not need a separate query in order to
* obtain this information). Here, we call PagerManagerInterface->findPage()
* to calculate the desired offset before the search is invoked:
* @code
*
* // Perform the query, using the requested offset from
* // PagerManagerInterface::findPage(). This comes from a URL parameter, so
* // here we are assuming that the URL parameter corresponds to an actual
* // page of results that will exist within the set.
* $pager_manager = \Drupal::service('pager.manager');
* $page = $pager_manager->findPage();
* $num_per_page = \Drupal::config('my_module.settings')->get('num_per_page');
* $offset = $num_per_page * $page;
* $result = my_module_remote_search($keywords, $offset, $num_per_page);
*
* // Now that we have the total number of results, initialize the pager.
* $pager_manager = \Drupal::service('pager.manager');
* $pager_manager->createPager($result->total, $num_per_page);
*
* // Create a render array with the search results.
* $render = [];
* $render[] = [
* '#theme' => 'search_results',
* '#results' => $result->data,
* '#type' => 'remote',
* ];
*
* // Finally, add the pager to the render array, and return.
* $render[] = ['#type' => 'pager'];
* return $render;
* @endcode
*
* @param int $total
* The total number of items to be paged.
* @param int $limit
* The number of items the calling code will display per page.
* @param int $element
* (optional) An integer to distinguish between multiple pagers on one page.
*
* @return \Drupal\Core\Pager\Pager
* The pager.
*/
public function createPager($total, $limit, $element = 0);
/**
* Gets a pager from the static cache.
*
* @param int $element
* The pager element index.
*
* @return \Drupal\Core\Pager\Pager|null
* The pager, or null if not found.
*/
public function getPager($element = 0);
/**
* Returns the current page being requested for display within a pager.
*
* @param int $pager_id
* (optional) An integer to distinguish between multiple pagers on one page.
*
* @return int
* The number of the current requested page, within the pager represented by
* $element. This is determined from the URL query parameter
* \Drupal::request()->query->get('page'), or 0 by default. Note that this
* number may differ from the actual page being displayed. For example, if a
* search for "example text" brings up three pages of results, but a user
* visits search/node/example+text?page=10, this function will return 10,
* even though the default pager implementation adjusts for this and still
* displays the third page of search results at that URL.
*/
public function findPage(int $pager_id = 0) : int;
/**
* Gets the URL query parameter array of a pager link.
*
* Adds to or adjusts the 'page' URL query parameter so that if you follow the
* link, you'll get page $index for pager $element on the page.
*
* The 'page' URL query parameter is a comma-delimited string, where each
* value is the target content page for the corresponding pager $element. For
* instance, if we have 5 pagers on a single page, and we want to have a link
* to a page that should display the 6th content page for the 3rd pager, and
* the 1st content page for all the other pagers, then the URL query will look
* like this: ?page=0,0,5,0,0 (page numbering starts at zero).
*
* @param array $query
* An associative array of URL query parameters to add to.
* @param int $element
* An integer to distinguish between multiple pagers on one page.
* @param int $index
* The index of the target page, for the given element, in the pager array.
*
* @return array
* The altered $query parameter array.
*/
public function getUpdatedParameters(array $query, $element, $index);
/**
* Gets the extent of the pager page element IDs.
*
* @return int
* The maximum element ID available, -1 if there are no elements.
*/
public function getMaxPagerElementId();
/**
* Reserve a pager element ID.
*
* Calling code may need to reserve the ID of a pager before actually creating
* it. This methods allows to do so ensuring no collision occurs with
* ::getMaxPagerElementId().
*
* @param int $element
* The ID of the pager to be reserved.
*
* @see \Drupal\Core\Database\Query\PagerSelectExtender::element()
*/
public function reservePagerElementId(int $element) : void;
}
Interfaces
Title | Deprecated | Summary |
---|---|---|
PagerManagerInterface | This is a service for pager information. |
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.