Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 7 |
CRAP | |
0.00% |
0 / 37 |
| PagerSelectExtender | |
0.00% |
0 / 1 |
|
0.00% |
0 / 7 |
156 | |
0.00% |
0 / 37 |
| __construct | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 3 |
|||
| execute | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 12 |
|||
| ensureElement | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 4 |
|||
| setCountQuery | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
| getCountQuery | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 7 |
|||
| limit | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 3 |
|||
| element | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 6 |
|||
| <?php | |
| /** | |
| * @file | |
| * Contains \Drupal\Core\Database\Query\PagerSelectExtender. | |
| */ | |
| namespace Drupal\Core\Database\Query; | |
| use Drupal\Core\Database\Connection; | |
| /** | |
| * Query extender for pager queries. | |
| * | |
| * This is the "default" pager mechanism. It creates a paged query with a fixed | |
| * number of entries per page. | |
| * | |
| * When adding this extender along with other extenders, be sure to add | |
| * PagerSelectExtender last, so that its range and count are based on the full | |
| * query. | |
| */ | |
| class PagerSelectExtender extends SelectExtender { | |
| /** | |
| * The highest element we've autogenerated so far. | |
| * | |
| * @var int | |
| */ | |
| static $maxElement = 0; | |
| /** | |
| * The number of elements per page to allow. | |
| * | |
| * @var int | |
| */ | |
| protected $limit = 10; | |
| /** | |
| * The unique ID of this pager on this page. | |
| * | |
| * @var int | |
| */ | |
| protected $element = NULL; | |
| /** | |
| * The count query that will be used for this pager. | |
| * | |
| * @var \Drupal\Core\Database\Query\SelectInterface | |
| */ | |
| protected $customCountQuery = FALSE; | |
| public function __construct(SelectInterface $query, Connection $connection) { | |
| parent::__construct($query, $connection); | |
| // Add pager tag. Do this here to ensure that it is always added before | |
| // preExecute() is called. | |
| $this->addTag('pager'); | |
| } | |
| /** | |
| * Override the execute method. | |
| * | |
| * Before we run the query, we need to add pager-based range() instructions | |
| * to it. | |
| */ | |
| public function execute() { | |
| // By calling preExecute() here, we force it to preprocess the extender | |
| // object rather than just the base query object. That means | |
| // hook_query_alter() gets access to the extended object. | |
| if (!$this->preExecute($this)) { | |
| return NULL; | |
| } | |
| // A NULL limit is the "kill switch" for pager queries. | |
| if (empty($this->limit)) { | |
| return; | |
| } | |
| $this->ensureElement(); | |
| $total_items = $this->getCountQuery()->execute()->fetchField(); | |
| $current_page = pager_default_initialize($total_items, $this->limit, $this->element); | |
| $this->range($current_page * $this->limit, $this->limit); | |
| // Now that we've added our pager-based range instructions, run the query normally. | |
| return $this->query->execute(); | |
| } | |
| /** | |
| * Ensure that there is an element associated with this query. | |
| * If an element was not specified previously, then the value of the | |
| * $maxElement counter is taken, after which the counter is incremented. | |
| * | |
| * After running this method, access $this->element to get the element for this | |
| * query. | |
| */ | |
| protected function ensureElement() { | |
| if (!isset($this->element)) { | |
| $this->element = self::$maxElement++; | |
| } | |
| } | |
| /** | |
| * Specify the count query object to use for this pager. | |
| * | |
| * You will rarely need to specify a count query directly. If not specified, | |
| * one is generated off of the pager query itself. | |
| * | |
| * @param \Drupal\Core\Database\Query\SelectInterface $query | |
| * The count query object. It must return a single row with a single column, | |
| * which is the total number of records. | |
| */ | |
| public function setCountQuery(SelectInterface $query) { | |
| $this->customCountQuery = $query; | |
| } | |
| /** | |
| * Retrieve the count query for this pager. | |
| * | |
| * The count query may be specified manually or, by default, taken from the | |
| * query we are extending. | |
| * | |
| * @return \Drupal\Core\Database\Query\SelectInterface | |
| * A count query object. | |
| */ | |
| public function getCountQuery() { | |
| if ($this->customCountQuery) { | |
| return $this->customCountQuery; | |
| } | |
| else { | |
| return $this->query->countQuery(); | |
| } | |
| } | |
| /** | |
| * Specify the maximum number of elements per page for this query. | |
| * | |
| * The default if not specified is 10 items per page. | |
| * | |
| * @param int|false $limit | |
| * An integer specifying the number of elements per page. If passed a false | |
| * value (FALSE, 0, NULL), the pager is disabled. | |
| */ | |
| public function limit($limit = 10) { | |
| $this->limit = $limit; | |
| return $this; | |
| } | |
| /** | |
| * Specify the element ID for this pager query. | |
| * | |
| * The element is used to differentiate different pager queries on the same | |
| * page so that they may be operated independently. If you do not specify an | |
| * element, every pager query on the page will get a unique element. If for | |
| * whatever reason you want to explicitly define an element for a given query, | |
| * you may do so here. | |
| * | |
| * Setting the element here also increments the static $maxElement counter, | |
| * which is used for determining the $element when there's none specified. | |
| * | |
| * Note that no collision detection is done when setting an element ID | |
| * explicitly, so it is possible for two pagers to end up using the same ID | |
| * if both are set explicitly. | |
| * | |
| * @param $element | |
| * Element ID that is used to differentiate different pager queries. | |
| */ | |
| public function element($element) { | |
| $this->element = $element; | |
| if ($element >= self::$maxElement) { | |
| self::$maxElement = $element + 1; | |
| } | |
| return $this; | |
| } | |
| } |