You are here

class PagererManager in Pagerer 8.2

Provides a manager for Pagerer, as an extension of core's PagerManager.

Hierarchy

Expanded class hierarchy of PagererManager

File

src/PagererManager.php, line 13

Namespace

Drupal\pagerer
View source
class PagererManager extends PagerManager {

  /**
   * Whether the URL querystring pager key is overridden.
   *
   * @var bool
   */
  protected $querystringOverride;

  /**
   * The URL querystring pager key ('page' by default, or the overriding one).
   *
   * @var string
   */
  protected $querystringKey;

  /**
   * The numbering base of the pages in the URL (zero or one).
   *
   * @var int
   */
  protected $base;

  /**
   * Construct a PagererManager object.
   *
   * @param \Drupal\Core\Pager\PagerParametersInterface $pager_params
   *   The pager parameters.
   * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
   *   The config factory.
   */
  public function __construct(PagerParametersInterface $pager_params, ConfigFactoryInterface $config_factory) {
    parent::__construct($pager_params);
    $this->configFactory = $config_factory;
    $settings = $config_factory
      ->get('pagerer.settings');
    $this->querystringOverride = $settings
      ->get('url_querystring.core_override');
    $this->querystringKey = $this->querystringOverride ? $settings
      ->get('url_querystring.querystring_key') : 'page';
    $this->base = $this->querystringOverride ? $settings
      ->get('url_querystring.index_base') : 0;
  }

  /**
   * {@inheritdoc}
   */
  public function createPager($total, $limit, $element = 0) {
    $pager = new Pagerer($total, $limit, $this->pagerParams
      ->findPage($element));
    $pager
      ->setElement($element);
    $pager
      ->setAdaptiveKeys($this->pagerParams
      ->findAdaptiveKeys($element));
    $this
      ->setPagerer($pager, $element);
    return $pager;
  }

  /**
   * {@inheritdoc}
   */
  public function getUpdatedParameters(array $query, $element, $index) {
    return $this
      ->getPagererUpdatedParameters($this
      ->getPager($element), $query, $index);
  }

  /**
   * Saves a pager to the static cache.
   *
   * @param \Drupal\pagerer\Pagerer $pager
   *   The pager.
   * @param int $element
   *   The pager index.
   */
  protected function setPagerer(Pagerer $pager, int $element = 0) {

    // @todo remove the check below in Drupal 10.
    if (property_exists($this, 'maxPagerElementId')) {
      $this->maxPagerElementId = max($element, $this->maxPagerElementId);
    }
    $this->pagers[$element] = $pager;
    if (method_exists($this, 'updateGlobals')) {

      // @todo remove in Drupal 10.
      $this
        ->updateGlobals();
    }
  }

  /**
   * Gets the URL query parameter array of a pager link.
   *
   * @param Drupal\pagerer\Pagerer $pager
   *   The pager object.
   * @param array $parameters
   *   An associative array of query string parameters to append to the pager
   *   links.
   * @param int $page
   *   The target page.
   * @param array $adaptive_keys
   *   The adaptive keys array, in the format 'L,R,X', where L is the
   *   adaptive lock to left page, R is the adaptive lock to right page,
   *   and X is the adaptive center lock for calculation of neighborhood.
   *
   * @return array
   *   The updated array of query parameters.
   */
  public function getPagererUpdatedParameters(Pagerer $pager, array $parameters, $page, array $adaptive_keys = []) : array {
    $max = $this
      ->getMaxPagerElementId();

    // Build the 'page' and 'page_ak' query parameter elements.
    // This is built based on the current page of each pager element (or NULL
    // if the pager is not set), with the exception of the requested page index
    // for the current element.
    $page_el = [];
    $page_ak = [];
    for ($i = 0; $i <= $max; $i++) {
      if (isset($this->pagers[$i])) {
        if ($i === $pager
          ->getElement()) {
          $page_el[$i] = is_string($page) ? $page : $this
            ->pageIndexToUrl($page);
          $page_ak[$i] = $this
            ->adaptiveKeysToUrl($adaptive_keys, $this->pagers[$i]
            ->getLastPage());
        }
        else {
          $page_el[$i] = $this
            ->pageIndexToUrl($this->pagers[$i]
            ->getCurrentPage());
          $page_ak[$i] = $this
            ->adaptiveKeysToUrl($this->pagers[$i]
            ->getAdaptiveKeys(), $this->pagers[$i]
            ->getLastPage());
        }
      }
      else {
        $page_el[$i] = NULL;
        $page_ak[$i] = NULL;
      }
    }

    // Build the 'page' and 'page_ak' fragments, removing unneeded trailing
    // keys.
    while (end($page_el) === NULL) {
      array_pop($page_el);
    }
    while (end($page_ak) === NULL) {
      array_pop($page_ak);
    }
    if (!$this->querystringOverride) {

      // Legacy URL format.
      $parameters[$this->querystringKey] = implode(',', $page_el);
      if (!empty($page_ak)) {
        $parameters['page_ak'] = implode(',', $page_ak);
      }
    }
    else {

      // Pagerer URL format.
      $page = implode(PagererParameters::VALUE_SEPARATOR, $page_el);
      if (!empty($page_ak)) {
        $ak = implode(PagererParameters::VALUE_SEPARATOR, $page_ak);
      }
      $parameters[$this->querystringKey] = $page . (isset($ak) ? PagererParameters::ITEM_SEPARATOR . 'ak' . PagererParameters::ITEM_SEPARATOR . $ak : NULL);
    }

    // Merge the updated pager query parameters, with any parameters coming from
    // the current request. In case of collision, current parameters take
    // precedence over the request ones.
    if ($current_request_query = $this->pagerParams
      ->getQueryParameters()) {
      $parameters = array_merge($current_request_query, $parameters);
    }

    // Explicitly remove the segments if not relevant.
    if ($this->querystringKey !== 'page') {
      unset($parameters['page']);
      unset($parameters['page_ak']);
    }
    if ($this->querystringOverride && empty($page_el) && empty($page_ak)) {
      unset($parameters[$this->querystringKey]);
    }
    return $parameters;
  }

  /**
   * Returns an adaptive keys fragment for use on the URL.
   *
   * @param int[] $ak
   *   The adaptive keys array, in the format 'L,R,X', where L is the adaptive
   *   lock to left page, R is the adaptive lock to right page, and X is the
   *   adaptive center lock for calculation of neighborhood.
   * @param int $last_page
   *   The last page of the queryset.
   *
   * @return string|null
   *   The 0-based or 1-based adaptive keys fragment, depending on the
   *   configuration.
   */
  protected function adaptiveKeysToUrl(array $ak, int $last_page) {
    if (empty($ak)) {
      return NULL;
    }
    if (!isset($ak[2]) && ($ak[0] ?? 0) === 0 && ($ak[1] ?? $last_page) === $last_page) {
      return NULL;
    }
    $tmp[0] = $this
      ->pageIndexToUrl($ak[0] ?? 0);
    $tmp[1] = $this
      ->pageIndexToUrl($ak[1] ?? $last_page);
    if (isset($ak[2])) {
      $tmp[2] = $this
        ->pageIndexToUrl($ak[2]);
    }
    return implode($this->querystringOverride ? '_' : '.', $tmp);
  }

  /**
   * Returns a page index for use on the URL.
   *
   * @param int $page
   *   The target page.
   *
   * @return int
   *   A 0-based or 1-based page index, depending on the configuration.
   */
  protected function pageIndexToUrl(int $page) : int {
    return $page + $this->base;
  }

  /**
   * Gets a pager link.
   *
   * @param Drupal\pagerer\Pagerer $pager
   *   The pager object.
   * @param array $parameters
   *   An associative array of query string parameters to append to the pager
   *   links.
   * @param int $page
   *   The target page.
   * @param array $adaptive_keys
   *   (Optional) The adaptive keys array, in the format 'L,R,X', where L is the
   *   adaptive lock to left page, R is the adaptive lock to right page,
   *   and X is the adaptive center lock for calculation of neighborhood.
   * @param bool $set_query
   *   (Optional) Whether the link should contain the query parameters.
   *
   * @return \Drupal\Core\Url
   *   The Url object for the link.
   */
  public function getHref(Pagerer $pager, array $parameters, $page, array $adaptive_keys = [], bool $set_query = TRUE) : Url {
    $options = $set_query ? [
      'query' => $this
        ->getPagererUpdatedParameters($pager, $parameters, $page, $adaptive_keys),
    ] : [];
    return Url::fromRoute($pager
      ->getRouteName(), $pager
      ->getRouteParameters(), $options);
  }

}

Members

Namesort descending Modifiers Type Description Overrides
DependencySerializationTrait::$_entityStorages protected property An array of entity type IDs keyed by the property name of their storages.
DependencySerializationTrait::$_serviceIds protected property An array of service IDs keyed by property name used for serialization.
DependencySerializationTrait::__sleep public function 1
DependencySerializationTrait::__wakeup public function 2
PagererManager::$base protected property The numbering base of the pages in the URL (zero or one).
PagererManager::$querystringKey protected property The URL querystring pager key ('page' by default, or the overriding one).
PagererManager::$querystringOverride protected property Whether the URL querystring pager key is overridden.
PagererManager::adaptiveKeysToUrl protected function Returns an adaptive keys fragment for use on the URL.
PagererManager::createPager public function Initializes a pager. Overrides PagerManager::createPager
PagererManager::getHref public function Gets a pager link.
PagererManager::getPagererUpdatedParameters public function Gets the URL query parameter array of a pager link.
PagererManager::getUpdatedParameters public function Gets the URL query parameter array of a pager link. Overrides PagerManager::getUpdatedParameters
PagererManager::pageIndexToUrl protected function Returns a page index for use on the URL.
PagererManager::setPagerer protected function Saves a pager to the static cache.
PagererManager::__construct public function Construct a PagererManager object. Overrides PagerManager::__construct
PagerManager::$pagerParams protected property The pager parameters.
PagerManager::$pagers protected property An associative array of pagers.
PagerManager::getMaxPagerElementId protected function Gets the extent of the pager page element IDs.
PagerManager::getPager public function Gets a pager from the static cache. Overrides PagerManagerInterface::getPager
PagerManager::setPager protected function Saves a pager to the static cache.
PagerManager::updateGlobals protected function Updates global variables with a pager data for backwards compatibility.