You are here

class Progressive in Pagerer 8

Same name and namespace in other branches
  1. 8.2 src/Plugin/pagerer/Progressive.php \Drupal\pagerer\Plugin\pagerer\Progressive

Pager style with links to pages progressively more distant from current.

Besides links to the 'neigborhood' of current page, creates a list of links which are progressively more distant from current page, displaying either a page number or an offset from current page.

This is controlled via the 'progr_links' theme variable, which can take a value either 'absolute' or 'relative'.

Examples:

page 9 out of 212, progr_links 'absolute', display 'pages': ------------------------------------------------------------------- 1 . 4 . 7 8 [9] 10 11 . 14 . 19 . 59 . 109 . 212 -------------------------------------------------------------------

page 9 out of 212, progr_links 'relative', display 'pages': ------------------------------------------------------------------- 1 . -5 . 7 8 [9] 10 11 . +5 . +10 . +50 . +100 . 212 -------------------------------------------------------------------

The 'factors' theme variable controls the quantity of progressive links generated. Each value in the comma delimited string will be used as a scale factor for a progressive series of pow(10, n).

Examples: 'factors' => '10' will generate links for page offsets

..., -1000, -100, -10, 10, 100, 1000, ....

'factors' => '5,10' will generate links for page offsets

..., -1000, -500, -100, -50, -10, -5, 5, 10, 50, 100, 500, 1000, ....

etc.

Plugin annotation


@PagererStyle(
  id = "progressive",
  title = @Translation("Pager style with links to pages progressively more distant"),
  short_title = @Translation("Progressive"),
  help = @Translation("Besides links to the 'neigborhood' of current page, creates a list of links which are progressively more distant from current page, displaying either a page number or an offset from current page."),
  style_type = "base"
)

Hierarchy

Expanded class hierarchy of Progressive

File

src/Plugin/pagerer/Progressive.php, line 52

Namespace

Drupal\pagerer\Plugin\pagerer
View source
class Progressive extends Standard {

  /**
   * {@inheritdoc}
   */
  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
    $config = parent::buildConfigurationForm($form, $form_state);
    $config['display_container']['factors'] = [
      '#type' => 'textfield',
      '#title' => $this
        ->t("Scale factors"),
      '#default_value' => $this->configuration['factors'],
      '#description' => $this
        ->t("Comma delimited string of factors to use to determine progressive links."),
      '#required' => TRUE,
    ];
    return $config;
  }

  /**
   * {@inheritdoc}
   */
  protected function buildPageList() {
    $current = $this->pager
      ->getCurrentPage();
    $last = $this->pager
      ->getLastPage();

    // First.
    $pages[0] = $this
      ->getPageItem(-$current, 'absolute', FALSE, $current == 0 ? 'page_current' : 'page');

    // Last.
    $pages[$last] = $this
      ->getPageItem($last - $current, 'absolute', FALSE, $current == $last ? 'page_current' : 'page');

    // Neighborhood.
    $pages = $this
      ->buildNeighborhoodPageList($pages);

    // Progressive.
    if ($this
      ->getOption('factors')) {
      $factors = explode(',', $this
        ->getOption('factors'));
      foreach ($factors as $scale_factor) {
        $pages = $this
          ->buildProgressivePageList($pages, $scale_factor, 10);
      }
    }
    ksort($pages);
    return $pages;
  }

  /**
   * Return an array of pages progressively more distant from current.
   *
   * @param array $pages
   *   Array of pages already enlisted, to prevent override.
   * @param int $scale_factor
   *   Scale factor to be used in the progressive series.
   * @param int $ratio
   *   Ratio to be used in the progressive series.
   * @param int $limit
   *   (Optional) limit the quantity of pages enlisted.
   *
   * @return array
   *   render array of pages items.
   */
  protected function buildProgressivePageList(array $pages, $scale_factor, $ratio, $limit = NULL) {
    $current = $this->pager
      ->getCurrentPage();
    $total = $this->pager
      ->getTotalPages();
    $last = $this->pager
      ->getLastPage();

    // Avoid endless loop in converging series.
    if ($ratio < 1) {
      $ratio = 1;
    }
    $offset = 0;
    for ($i = 0; TRUE; $i++) {

      // Breaks if limit reached.
      if ($limit and $i > $limit - 1) {
        break;
      }

      // Offset for this cycle.
      $offset = intval($scale_factor * pow($ratio, $i));

      // Breaks if offset > than total pages.
      if ($offset > $total) {
        break;
      }

      // Negative offset.
      $target = $current - $offset;
      if ($target > 0 && !isset($pages[$target])) {
        $pages[$target] = $this
          ->getPageItem(-$offset, $this
          ->getOption('progr_links'), TRUE);
      }

      // Positive offset.
      $target = $current + $offset;
      if ($target < $last && !isset($pages[$target])) {
        $pages[$target] = $this
          ->getPageItem($offset, $this
          ->getOption('progr_links'), TRUE);
      }
    }
    return $pages;
  }

}

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
MessengerTrait::$messenger protected property The messenger. 29
MessengerTrait::messenger public function Gets the messenger. 29
MessengerTrait::setMessenger public function Sets the messenger.
PagererStyleBase::$configFactory protected property The config factory.
PagererStyleBase::$pager protected property The Pagerer pager object.
PagererStyleBase::$pagererPreset protected property The PagererPreset object being configured.
PagererStyleBase::$pagererPresetPane protected property The PagererPreset pane being configured.
PagererStyleBase::$parameters protected property Query parameters as requested by the theme call.
PagererStyleBase::$typedConfigManager protected property The config type plugins manager.
PagererStyleBase::buildEmptyPager protected function Render a 'no pages to display' text. 1
PagererStyleBase::create public static function Creates an instance of the plugin. Overrides ContainerFactoryPluginInterface::create
PagererStyleBase::getDisplayTag protected function Returns a translated textual element for pages/items/item ranges.
PagererStyleBase::getNavigationItem protected function Gets a link/button item to first/previous/next/last link.
PagererStyleBase::getOption protected function Returns a configuration element.
PagererStyleBase::getPageItem protected function Gets a 'page' item in the pager.
PagererStyleBase::getTag protected function Returns a translated textual element from the configuration.
PagererStyleBase::prepareJsState protected function Prepares input parameters for a JS enabled pager widget.
PagererStyleBase::preprocess public function Prepares to render the pager. Overrides PagererStyleInterface::preprocess
PagererStyleBase::setConfigurationContext public function Sets the current PagererPreset and pane being configured.
PagererStyleBase::setPager public function Sets the Pagerer pager to be rendered. Overrides PagererStyleInterface::setPager
PagererStyleBase::submitConfigurationForm public function Form submission handler. Overrides PluginFormInterface::submitConfigurationForm
PagererStyleBase::validateConfigurationForm public function Form validation handler. Overrides PluginFormInterface::validateConfigurationForm
PagererStyleBase::__construct public function Constructs a \Drupal\pagerer\Plugin\pagerer\PagererStyleBase object. Overrides PluginBase::__construct
PluginBase::$configuration protected property Configuration information passed into the plugin. 1
PluginBase::$pluginDefinition protected property The plugin implementation definition. 1
PluginBase::$pluginId protected property The plugin_id.
PluginBase::DERIVATIVE_SEPARATOR constant A string which is used to separate base plugin IDs from the derivative ID.
PluginBase::getBaseId public function Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface::getBaseId
PluginBase::getDerivativeId public function Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface::getDerivativeId
PluginBase::getPluginDefinition public function Gets the definition of the plugin implementation. Overrides PluginInspectionInterface::getPluginDefinition 3
PluginBase::getPluginId public function Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface::getPluginId
PluginBase::isConfigurable public function Determines if the plugin is configurable.
Progressive::buildConfigurationForm public function Form constructor. Overrides PagererStyleBase::buildConfigurationForm
Progressive::buildPageList protected function Return an array of pages. Overrides Standard::buildPageList
Progressive::buildProgressivePageList protected function Return an array of pages progressively more distant from current.
Standard::buildNeighborhoodPageList protected function Return an array of pages in the neighborhood of the current one.
Standard::buildPagerItems protected function Return the pager render array.
StringTranslationTrait::$stringTranslation protected property The string translation service. 1
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.