3 namespace Drupal\entity_browser\Element;
5 use Drupal\Core\Form\FormStateInterface;
6 use Drupal\Core\Render\Element\FormElement;
9 * Provides an Entity Browser pager form element.
12 * - #total_pages: Total number of pages. This is optional with default
13 * value set on NULL. With default value pager can't calculate last page
14 * correctly and "next" will be available even on last page. For
15 * correct functionality #total_pages must be set up.
20 * '#type' => 'entity_browser_pager',
21 * '#total_pages' => 12,
25 * Number of the current page is stored in the form state. In order to get it
26 * the provided helper function needs to be utilized:
29 * $page = EntityBrowserPagerElement::getCurrentPage($form_state);
32 * @see ::getCurrentPage($form_state).
34 * @FormElement("entity_browser_pager")
36 class EntityBrowserPagerElement extends FormElement {
41 public function getInfo() {
42 $class = get_class($this);
44 '#process' => [[$class, 'processEntityBrowserPager']],
45 '#theme_wrappers' => ['form_element'],
46 '#total_pages' => NULL,
48 'library' => ['entity_browser/pager'],
54 * Process Entity browser pager element.
56 public static function processEntityBrowserPager(&$element, FormStateInterface $form_state, &$complete_form) {
57 $page = static::getCurrentPage($form_state);
59 $element['previous'] = [
61 '#submit' => [[static::class, 'submitPager']],
62 '#value' => t('‹ Previous'),
63 '#name' => 'prev_page',
64 '#disabled' => $page === 1,
65 '#attributes' => ['class' => ['prev']],
66 '#limit_validation_errors' => [array_merge($element['#parents'], ['previous'])],
68 $element['current'] = [
69 '#type' => 'html_tag',
71 '#value' => t('Page @page', ['@page' => $page]),
72 '#attributes' => ['class' => ['current']],
76 '#submit' => [[static::class, 'submitPager']],
77 '#value' => t('Next ›'),
78 '#name' => 'next_page',
79 '#disabled' => $element['#total_pages'] === $page,
80 '#attributes' => ['class' => ['next']],
81 '#limit_validation_errors' => [array_merge($element['#parents'], ['next'])],
88 * Submit handler for next and previous buttons.
90 * @param \Drupal\Core\Form\FormStateInterface $form_state
93 public static function submitPager($form, FormStateInterface $form_state) {
94 $page = static::getCurrentPage($form_state);
96 $triggering_element = $form_state->getTriggeringElement();
97 if ($triggering_element['#name'] == 'prev_page') {
100 elseif ($triggering_element['#name'] == 'next_page') {
104 $form_state->set('page', $page);
105 $form_state->setRebuild();
109 * Gets current page from the form state.
111 * @param \Drupal\Core\Form\FormStateInterface $form_state
117 public static function getCurrentPage(FormStateInterface $form_state) {
118 return !empty($form_state->get('page')) ? $form_state->get('page') : 1;
124 * @param \Drupal\Core\Form\FormStateInterface $form_state
127 * (Optional) Page to set as current. Pager will be reset to the first page
130 public static function setCurrentPage(FormStateInterface $form_state, $page = 1) {
131 $form_state->set('page', $page);