class Full

The plugin to handle full pager.

Plugin annotation


@Plugin(
  id = "full",
  title = @Translation("Paged output, full pager"),
  short_title = @Translation("Full"),
  help = @Translation("Paged output, full Drupal style")
)

Hierarchy

Expanded class hierarchy of Full

Related topics

1 string reference to 'Full'
PagerTest::testStorePagerSettings in drupal/core/modules/views/lib/Drupal/views/Tests/Plugin/PagerTest.php
Pagers was sometimes not stored.

File

drupal/core/modules/views/lib/Drupal/views/Plugin/views/pager/Full.php, line 25
Definition of Drupal\views\Plugin\views\pager\Full.

Namespace

Drupal\views\Plugin\views\pager
View source
class Full extends PagerPluginBase {
  public function summaryTitle() {
    if (!empty($this->options['offset'])) {
      return format_plural($this->options['items_per_page'], '@count item, skip @skip', 'Paged, @count items, skip @skip', array(
        '@count' => $this->options['items_per_page'],
        '@skip' => $this->options['offset'],
      ));
    }
    return format_plural($this->options['items_per_page'], '@count item', 'Paged, @count items', array(
      '@count' => $this->options['items_per_page'],
    ));
  }
  protected function defineOptions() {
    $options = parent::defineOptions();
    $options['items_per_page'] = array(
      'default' => 10,
    );
    $options['offset'] = array(
      'default' => 0,
    );
    $options['id'] = array(
      'default' => 0,
    );
    $options['total_pages'] = array(
      'default' => '',
    );

    // Use the same default quantity that core uses by default.
    $options['quantity'] = array(
      'default' => 9,
    );
    $options['expose'] = array(
      'contains' => array(
        'items_per_page' => array(
          'default' => FALSE,
          'bool' => TRUE,
        ),
        'items_per_page_label' => array(
          'default' => 'Items per page',
          'translatable' => TRUE,
        ),
        'items_per_page_options' => array(
          'default' => '5, 10, 20, 40, 60',
        ),
        'items_per_page_options_all' => array(
          'default' => FALSE,
          'bool' => TRUE,
        ),
        'items_per_page_options_all_label' => array(
          'default' => '- All -',
          'translatable' => TRUE,
        ),
        'offset' => array(
          'default' => FALSE,
          'bool' => TRUE,
        ),
        'offset_label' => array(
          'default' => 'Offset',
          'translatable' => TRUE,
        ),
      ),
    );
    $options['tags'] = array(
      'contains' => array(
        'first' => array(
          'default' => '« first',
          'translatable' => TRUE,
        ),
        'previous' => array(
          'default' => '‹ previous',
          'translatable' => TRUE,
        ),
        'next' => array(
          'default' => 'next ›',
          'translatable' => TRUE,
        ),
        'last' => array(
          'default' => 'last »',
          'translatable' => TRUE,
        ),
      ),
    );
    return $options;
  }

  /**
   * Provide the default form for setting options.
   */
  public function buildOptionsForm(&$form, &$form_state) {
    parent::buildOptionsForm($form, $form_state);
    $pager_text = $this->displayHandler
      ->getPagerText();
    $form['items_per_page'] = array(
      '#title' => $pager_text['items per page title'],
      '#type' => 'number',
      '#description' => $pager_text['items per page description'],
      '#default_value' => $this->options['items_per_page'],
    );
    $form['offset'] = array(
      '#type' => 'number',
      '#title' => t('Offset'),
      '#description' => t('The number of items to skip. For example, if this field is 3, the first 3 items will be skipped and not displayed.'),
      '#default_value' => $this->options['offset'],
    );
    $form['id'] = array(
      '#type' => 'number',
      '#title' => t('Pager ID'),
      '#description' => t("Unless you're experiencing problems with pagers related to this view, you should leave this at 0. If using multiple pagers on one page you may need to set this number to a higher value so as not to conflict within the ?page= array. Large values will add a lot of commas to your URLs, so avoid if possible."),
      '#default_value' => $this->options['id'],
    );
    $form['total_pages'] = array(
      '#type' => 'number',
      '#title' => t('Number of pages'),
      '#description' => t('The total number of pages. Leave empty to show all pages.'),
      '#default_value' => $this->options['total_pages'],
    );
    $form['quantity'] = array(
      '#type' => 'number',
      '#title' => t('Number of pager links visible'),
      '#description' => t('Specify the number of links to pages to display in the pager.'),
      '#default_value' => $this->options['quantity'],
    );
    $form['tags'] = array(
      '#type' => 'details',
      '#collapsible' => FALSE,
      '#collapsed' => FALSE,
      '#tree' => TRUE,
      '#title' => t('Tags'),
      '#input' => TRUE,
      '#description' => t('A lists of labels for the controls in the pager'),
    );
    $form['tags']['first'] = array(
      '#type' => 'textfield',
      '#title' => t('Text for "first"-link'),
      '#description' => t('Text for "first"-link'),
      '#default_value' => $this->options['tags']['first'],
    );
    $form['tags']['previous'] = array(
      '#type' => 'textfield',
      '#title' => t('Text for "previous"-link'),
      '#description' => t('Text for "previous"-link'),
      '#default_value' => $this->options['tags']['previous'],
    );
    $form['tags']['next'] = array(
      '#type' => 'textfield',
      '#title' => t('Text for "next"-link'),
      '#description' => t('Text for "next"-link'),
      '#default_value' => $this->options['tags']['next'],
    );
    $form['tags']['last'] = array(
      '#type' => 'textfield',
      '#title' => t('Text for "last"-link'),
      '#description' => t('Text for "last"-link'),
      '#default_value' => $this->options['tags']['last'],
    );
    $form['expose'] = array(
      '#type' => 'details',
      '#collapsible' => FALSE,
      '#collapsed' => FALSE,
      '#tree' => TRUE,
      '#title' => t('Exposed options'),
      '#input' => TRUE,
      '#description' => t('Exposing this options allows users to define their values in a exposed form when view is displayed'),
    );
    $form['expose']['items_per_page'] = array(
      '#type' => 'checkbox',
      '#title' => t('Expose items per page'),
      '#description' => t('When checked, users can determine how many items per page show in a view'),
      '#default_value' => $this->options['expose']['items_per_page'],
    );
    $form['expose']['items_per_page_label'] = array(
      '#type' => 'textfield',
      '#title' => t('Items per page label'),
      '#required' => TRUE,
      '#description' => t('Label to use in the exposed items per page form element.'),
      '#default_value' => $this->options['expose']['items_per_page_label'],
      '#states' => array(
        'invisible' => array(
          'input[name="pager_options[expose][items_per_page]"]' => array(
            'checked' => FALSE,
          ),
        ),
      ),
    );
    $form['expose']['items_per_page_options'] = array(
      '#type' => 'textfield',
      '#title' => t('Exposed items per page options'),
      '#required' => TRUE,
      '#description' => t('Set between which values the user can choose when determining the items per page. Separated by comma.'),
      '#default_value' => $this->options['expose']['items_per_page_options'],
      '#states' => array(
        'invisible' => array(
          'input[name="pager_options[expose][items_per_page]"]' => array(
            'checked' => FALSE,
          ),
        ),
      ),
    );
    $form['expose']['items_per_page_options_all'] = array(
      '#type' => 'checkbox',
      '#title' => t('Include all items option'),
      '#description' => t('If checked, an extra item will be included to items per page to display all items'),
      '#default_value' => $this->options['expose']['items_per_page_options_all'],
    );
    $form['expose']['items_per_page_options_all_label'] = array(
      '#type' => 'textfield',
      '#title' => t('All items label'),
      '#description' => t('Which label will be used to display all items'),
      '#default_value' => $this->options['expose']['items_per_page_options_all_label'],
      '#states' => array(
        'invisible' => array(
          'input[name="pager_options[expose][items_per_page_options_all]"]' => array(
            'checked' => FALSE,
          ),
        ),
      ),
    );
    $form['expose']['offset'] = array(
      '#type' => 'checkbox',
      '#title' => t('Expose Offset'),
      '#description' => t('When checked, users can determine how many items should be skipped at the beginning.'),
      '#default_value' => $this->options['expose']['offset'],
    );
    $form['expose']['offset_label'] = array(
      '#type' => 'textfield',
      '#title' => t('Offset label'),
      '#required' => TRUE,
      '#description' => t('Label to use in the exposed offset form element.'),
      '#default_value' => $this->options['expose']['offset_label'],
      '#states' => array(
        'invisible' => array(
          'input[name="pager_options[expose][offset]"]' => array(
            'checked' => FALSE,
          ),
        ),
      ),
    );
  }
  public function validateOptionsForm(&$form, &$form_state) {

    // Only accept integer values.
    $error = FALSE;
    $exposed_options = $form_state['values']['pager_options']['expose']['items_per_page_options'];
    if (strpos($exposed_options, '.') !== FALSE) {
      $error = TRUE;
    }
    $options = explode(',', $exposed_options);
    if (!$error && is_array($options)) {
      foreach ($options as $option) {
        if (!is_numeric($option) || intval($option) == 0) {
          $error = TRUE;
        }
      }
    }
    else {
      $error = TRUE;
    }
    if ($error) {
      form_set_error('pager_options][expose][items_per_page_options', t('Please insert a list of integer numeric values separated by commas: e.g: 10, 20, 50, 100'));
    }

    // Take sure that the items_per_page is part of the expose settings.
    if (!empty($form_state['values']['pager_options']['expose']['items_per_page']) && !empty($form_state['values']['pager_options']['items_per_page'])) {
      $items_per_page = $form_state['values']['pager_options']['items_per_page'];
      if (array_search($items_per_page, $options) === FALSE) {
        form_set_error('pager_options][expose][items_per_page_options', t('Please insert the items per page (@items_per_page) from above.', array(
          '@items_per_page' => $items_per_page,
        )));
      }
    }
  }
  public function query() {
    if ($this
      ->items_per_page_exposed()) {
      $query = drupal_container()
        ->get('request')->query;
      $items_per_page = $query
        ->get('items_per_page');
      if ($items_per_page > 0) {
        $this->options['items_per_page'] = $items_per_page;
      }
      elseif ($items_per_page == 'All' && $this->options['expose']['items_per_page_options_all']) {
        $this->options['items_per_page'] = 0;
      }
    }
    if ($this
      ->offset_exposed()) {
      $query = drupal_container()
        ->get('request')->query;
      $offset = $query
        ->get('offset');
      if (isset($offset) && $offset >= 0) {
        $this->options['offset'] = $offset;
      }
    }
    $limit = $this->options['items_per_page'];
    $offset = $this->current_page * $this->options['items_per_page'] + $this->options['offset'];
    if (!empty($this->options['total_pages'])) {
      if ($this->current_page >= $this->options['total_pages']) {
        $limit = $this->options['items_per_page'];
        $offset = $this->options['total_pages'] * $this->options['items_per_page'];
      }
    }
    $this->view->query
      ->set_limit($limit);
    $this->view->query
      ->set_offset($offset);
  }
  function render($input) {
    $pager_theme = views_theme_functions('pager', $this->view, $this->view->display_handler->display);

    // The 0, 1, 3, 4 index are correct. See theme_pager documentation.
    $tags = array(
      0 => $this->options['tags']['first'],
      1 => $this->options['tags']['previous'],
      3 => $this->options['tags']['next'],
      4 => $this->options['tags']['last'],
    );
    $output = theme($pager_theme, array(
      'tags' => $tags,
      'element' => $this->options['id'],
      'parameters' => $input,
      'quantity' => $this->options['quantity'],
    ));
    return $output;
  }

  /**
   * Set the current page.
   *
   * @param $number
   *   If provided, the page number will be set to this. If NOT provided,
   *   the page number will be set from the global page array.
   */
  function set_current_page($number = NULL) {
    if (isset($number)) {
      $this->current_page = max(0, $number);
      return;
    }

    // If the current page number was not specified, extract it from the global
    // page array.
    global $pager_page_array;
    if (empty($pager_page_array)) {
      $pager_page_array = array();
    }

    // Fill in missing values in the global page array, in case the global page
    // array hasn't been initialized before.
    $page = drupal_container()
      ->get('request')->query
      ->get('page');
    $page = isset($page) ? explode(',', $page) : array();
    for ($i = 0; $i <= $this->options['id'] || $i < count($pager_page_array); $i++) {
      $pager_page_array[$i] = empty($page[$i]) ? 0 : $page[$i];
    }

    // Don't allow the number to be less than zero.
    $this->current_page = max(0, intval($pager_page_array[$this->options['id']]));
  }
  function get_pager_total() {
    if ($items_per_page = intval($this
      ->get_items_per_page())) {
      return ceil($this->total_items / $items_per_page);
    }
    else {
      return 1;
    }
  }

  /**
   * Update global paging info.
   *
   * This is called after the count query has been run to set the total
   * items available and to update the current page if the requested
   * page is out of range.
   */
  function update_page_info() {
    if (!empty($this->options['total_pages'])) {
      if ($this->options['total_pages'] * $this->options['items_per_page'] < $this->total_items) {
        $this->total_items = $this->options['total_pages'] * $this->options['items_per_page'];
      }
    }

    // Don't set pager settings for items per page = 0.
    $items_per_page = $this
      ->get_items_per_page();
    if (!empty($items_per_page)) {

      // Dump information about what we already know into the globals.
      global $pager_page_array, $pager_total, $pager_total_items, $pager_limits;

      // Set the limit.
      $pager_limits[$this->options['id']] = $this->options['items_per_page'];

      // Set the item count for the pager.
      $pager_total_items[$this->options['id']] = $this->total_items;

      // Calculate and set the count of available pages.
      $pager_total[$this->options['id']] = $this
        ->get_pager_total();

      // See if the requested page was within range:
      if ($this->current_page >= $pager_total[$this->options['id']]) {

        // Pages are numbered from 0 so if there are 10 pages, the last page is 9.
        $this
          ->set_current_page($pager_total[$this->options['id']] - 1);
      }

      // Put this number in to guarantee that we do not generate notices when the pager
      // goes to look for it later.
      $pager_page_array[$this->options['id']] = $this->current_page;
    }
  }
  function uses_exposed() {
    return $this
      ->items_per_page_exposed() || $this
      ->offset_exposed();
  }
  function items_per_page_exposed() {
    return !empty($this->options['expose']['items_per_page']);
  }
  function offset_exposed() {
    return !empty($this->options['expose']['offset']);
  }
  function exposed_form_alter(&$form, &$form_state) {
    if ($this
      ->items_per_page_exposed()) {
      $options = explode(',', $this->options['expose']['items_per_page_options']);
      $sanitized_options = array();
      if (is_array($options)) {
        foreach ($options as $option) {
          $sanitized_options[intval($option)] = intval($option);
        }
        if (!empty($this->options['expose']['items_per_page_options_all']) && !empty($this->options['expose']['items_per_page_options_all_label'])) {
          $sanitized_options['All'] = $this->options['expose']['items_per_page_options_all_label'];
        }
        $form['items_per_page'] = array(
          '#type' => 'select',
          '#title' => $this->options['expose']['items_per_page_label'],
          '#options' => $sanitized_options,
          '#default_value' => $this
            ->get_items_per_page(),
        );
      }
    }
    if ($this
      ->offset_exposed()) {
      $form['offset'] = array(
        '#type' => 'textfield',
        '#size' => 10,
        '#maxlength' => 10,
        '#title' => $this->options['expose']['offset_label'],
        '#default_value' => $this
          ->get_offset(),
      );
    }
  }
  function exposed_form_validate(&$form, &$form_state) {
    if (!empty($form_state['values']['offset']) && trim($form_state['values']['offset'])) {
      if (!is_numeric($form_state['values']['offset']) || $form_state['values']['offset'] < 0) {
        form_set_error('offset', t('Offset must be an number greather or equal than 0.'));
      }
    }
  }

}

Members

Name Modifierssort descending Type Description Overrides
Full::render function Render the pager. Overrides PagerPluginBase::render 1
Full::set_current_page function Set the current page. Overrides PagerPluginBase::set_current_page
Full::get_pager_total function
Full::update_page_info function Update global paging info. Overrides PagerPluginBase::update_page_info
Full::uses_exposed function Overrides PagerPluginBase::uses_exposed
Full::items_per_page_exposed function Overrides PagerPluginBase::items_per_page_exposed
Full::offset_exposed function Overrides PagerPluginBase::offset_exposed
Full::exposed_form_alter function Overrides PagerPluginBase::exposed_form_alter
Full::exposed_form_validate function Overrides PagerPluginBase::exposed_form_validate
PagerPluginBase::get_items_per_page function Get how many items per page this pager will display. 1
PagerPluginBase::set_items_per_page function Set how many items per page this pager will display.
PagerPluginBase::get_offset function Get the page offset, or how many items to skip.
PagerPluginBase::set_offset function Set the page offset, or how many items to skip.
PagerPluginBase::get_current_page function Get the current page.
PagerPluginBase::get_total_items function Get the total number of items.
PagerPluginBase::get_pager_id function Get the pager id, if it exists
PagerPluginBase::use_pager function Determine if this pager actually uses a pager. 2
PagerPluginBase::use_count_query function Determine if a pager needs a count query. 2
PagerPluginBase::execute_count_query function Execute the count query, which will be done just prior to the query itself being executed. 1
PagerPluginBase::pre_execute function Perform any needed actions just prior to the query executing.
PagerPluginBase::pre_render function Perform any needed actions just before rendering.
PagerPluginBase::has_more_records function Determine if there are more records available.
PagerPluginBase::exposed_form_submit function
PagerPluginBase::$current_page property
PagerPluginBase::$total_items property
Full::defineOptions protected function Information about options for all kinds of purposes will be held here. @code 'option_name' => array( Overrides PluginBase::defineOptions
PluginBase::setOptionDefaults protected function
PagerPluginBase::$usesOptions protected property Overrides Drupal\views\Plugin\Plugin::$usesOptions. Overrides PluginBase::$usesOptions
PluginBase::$discovery protected property The discovery object.
PluginBase::$plugin_id protected property The plugin_id.
PluginBase::$configuration protected property Configuration information passed into the plugin. 1
Full::summaryTitle public function Return a string to display as the clickable title for the pager plugin. Overrides PagerPluginBase::summaryTitle 1
Full::buildOptionsForm public function Provide the default form for setting options. Overrides PluginBase::buildOptionsForm
Full::validateOptionsForm public function Provide the default form form for validating options Overrides PagerPluginBase::validateOptionsForm
Full::query public function Modify the query for paging Overrides PagerPluginBase::query
PagerPluginBase::init public function Initialize the plugin. 1
PagerPluginBase::submitOptionsForm public function Provide the default form form for submitting options Overrides PluginBase::submitOptionsForm
PagerPluginBase::postExecute public function Perform any needed actions just after the query executing. 1
PluginBase::__construct public function Constructs a Plugin object. Overrides PluginBase::__construct
PluginBase::unpackOptions public function Unpack options over our existing defaults, drilling down into arrays so that defaults don't get totally blown away.
PluginBase::destroy public function Clears a plugin. 2
PluginBase::themeFunctions public function Provide a full list of possible theme templates used by this style. 1
PluginBase::additionalThemeFunctions public function Provide a list of additional theme functions for the theme information page
PluginBase::validate public function Validate that the plugin is correct and can be saved. 4
PluginBase::pluginTitle public function Return the human readable name of the display.
PluginBase::usesOptions public function Returns the usesOptions property. 8
PluginBase::globalTokenReplace public function Returns a string with any core tokens replaced.
PluginBase::getAvailableGlobalTokens public function Returns an array of available token replacements.
PluginBase::globalTokenForm public function Adds elements for available core tokens to a form.
PluginBase::getPluginId public function Implements Drupal\Component\Plugin\PluginInterface::getPluginId(). Overrides PluginInspectionInterface::getPluginId
PluginBase::getDefinition public function Implements Drupal\Component\Plugin\PluginInterface::getDefinition(). Overrides PluginInspectionInterface::getDefinition
PluginBase::$options public property Options for this plugin will be held here.
PluginBase::$view public property The top object of a view. 1
PluginBase::$displayHandler public property The display object this plugin is for.
PluginBase::$definition public property Plugins's definition