diff --git a/src/Element/EntityBrowserPagerElement.php b/src/Element/EntityBrowserPagerElement.php index 3fcc827..b622082 100644 --- a/src/Element/EntityBrowserPagerElement.php +++ b/src/Element/EntityBrowserPagerElement.php @@ -11,20 +11,31 @@ use Drupal\Core\Render\Element; * * Properties: * - #entities_list: List of paginated entities displayed on current page. - * For purpose of pagination can be used method paginateEntities() - * from this class. + * If #paginate flag is TRUE entities_list will be paginated using simple + * pagination method, otherwise (#paginate flag is FALSE) you must paginate + * entities using your own pagination method. * - #per_page: Items to be displayed per page. + * - #total_pages: Total number of pages. * - #paginate: Flag to indicate that pagination of entities will be done on * form element. If entities already paginated set this flag to FALSE. * + * Example: + * $form['pager'] = [ + * '#type' => 'entity_browser_pager', + * '#per_page' => 15, + * '#entities_list' => $media_list, + * '#paginate' => TRUE, + * '#total_pages' => count($media_list), + * ]; + * * @FormElement("entity_browser_pager") */ class EntityBrowserPagerElement extends FormElement { /** - * Default per page entities. + * Default entities per page. */ - const PER_PAGE = 5; + const PER_PAGE = 10; /** * {@inheritdoc} @@ -33,8 +44,13 @@ class EntityBrowserPagerElement extends FormElement { $class = get_class($this); return [ '#process' => [[$class, 'processEntityBrowserPager']], - '#pre_render' => [[$class, 'preRenderEntityBrowserPager']], '#theme_wrappers' => ['form_element'], + '#default_value' => [ + '#paginate' => FALSE, + '#per_page' => static::PER_PAGE, + '#entities_list' => [], + '#total_pages' => FALSE, + ], '#attached' => [ 'library' => ['entity_browser/pager'], ], @@ -45,17 +61,27 @@ class EntityBrowserPagerElement extends FormElement { * Process Entity browser pager element. */ public static function processEntityBrowserPager(&$element, FormStateInterface $form_state, &$complete_form) { - $page = $form_state->get('page') ?: 1; - if ($element['#paginate']) { - $entities = static::paginateEntities($element['#entities_list'], $page, $element['#per_page']); + $paginate = isset($element['#paginate']) ? $element['#paginate'] : $element['#default_value']['#paginate']; + $per_page = isset($element['#per_page']) ? $element['#per_page'] : $element['#default_value']['#per_page']; + $entities_list = isset($element['#entities_list']) ? $element['#entities_list'] : $element['#default_value']['#entities_list']; + $page = !empty($form_state->get('page')) ? $form_state->get('page') : 1; + if ($paginate) { + $entities = static::paginateEntities($entities_list, $page, $per_page); } else { $entities = $element['#entities_list']; } + if (isset($element['#total_pages'])) { + $disabled = $element['#total_pages'] == $page; + } + else { + $disabled = count($entities) < $per_page; + } + $element['previous'] = [ '#type' => 'submit', - '#submit' => [[self::class, 'submitPager']], + '#submit' => [[static::class, 'submitPager']], '#value' => t('‹ Previous'), '#name' => 'prev_page', '#disabled' => $page == 1, @@ -69,10 +95,10 @@ class EntityBrowserPagerElement extends FormElement { ]; $element['next'] = [ '#type' => 'submit', - '#submit' => [[self::class, 'submitPager']], + '#submit' => [[static::class, 'submitPager']], '#value' => t('Next ›'), '#name' => 'next_page', - '#disabled' => count($entities) < $element['#per_page'], + '#disabled' => $disabled, '#attributes' => ['class' => ['next']], ]; @@ -80,26 +106,6 @@ class EntityBrowserPagerElement extends FormElement { } /** - * Prepares a #type 'entity_browser_pager' render element. - * - * @param array $element - * An associative array containing the properties of the element. - * Properties used: #entities_list, #per_page, #paginate. - * - * @return array - * The $element with prepared variables. - */ - public static function preRenderEntityBrowserPager($element) { - Element::setAttributes($element, [ - 'entities_list', - 'per_page', - 'paginate', - ]); - - return $element; - } - - /** * Submit handler for next and previous buttons. * * @param \Drupal\Core\Form\FormStateInterface $form_state @@ -133,7 +139,7 @@ class EntityBrowserPagerElement extends FormElement { * @return array * Prepared array of entities to display on current page. */ - public static function paginateEntities($entities_list, $page, $per_page = self::PER_PAGE) { + public static function paginateEntities($entities_list, $page, $per_page) { return array_slice($entities_list, ($page - 1) * $per_page, $per_page); } diff --git a/tests/modules/entity_browser_test/src/Plugin/EntityBrowser/Widget/PagerTestWidget.php b/tests/modules/entity_browser_test/src/Plugin/EntityBrowser/Widget/PagerTestWidget.php index 2bdb95d..55b4c6a 100644 --- a/tests/modules/entity_browser_test/src/Plugin/EntityBrowser/Widget/PagerTestWidget.php +++ b/tests/modules/entity_browser_test/src/Plugin/EntityBrowser/Widget/PagerTestWidget.php @@ -38,29 +38,10 @@ class PagerTestWidget extends WidgetBase { */ public function getForm(array &$original_form, FormStateInterface $form_state, array $additional_widget_parameters) { $form = parent::getForm($original_form, $form_state, $additional_widget_parameters); - if (!$entities_list = \Drupal::entityTypeManager()->getStorage('node')->loadMultiple()) { - $node_type = NodeType::create([ - 'type' => 'example', - ]); - $node_type->save(); - - for ($i = 0; $i < 6; $i++) { - /** @var \Drupal\node\NodeInterface $node */ - $node = Node::create([ - 'type' => 'example', - 'title' => 'Test title', - 'langcode' => 'en', - ]); - $node->save(); - } - $entities_list = \Drupal::entityTypeManager()->getStorage('node')->loadMultiple(); - } $form['pager_eb'] = [ '#type' => 'entity_browser_pager', - '#per_page' => $this->configuration['items_per_page'], - '#entities_list' => $entities_list, - '#paginate' => TRUE, + '#total_pages' => 4, ]; return $form; diff --git a/tests/src/FunctionalJavascript/PagerElementFormTest.php b/tests/src/FunctionalJavascript/PagerElementFormTest.php index d2d3ec5..1472393 100644 --- a/tests/src/FunctionalJavascript/PagerElementFormTest.php +++ b/tests/src/FunctionalJavascript/PagerElementFormTest.php @@ -79,9 +79,7 @@ class PagerElementFormTest extends EntityBrowserJavascriptTestBase { * Test entity browser pager form element. */ public function testPagerElement() { - $this->drupalGet('node/add/foo'); - $this->getSession()->getPage()->clickLink('Select entities'); - $this->getSession()->switchToIFrame('entity_browser_iframe_pager'); + $this->drupalGet('/entity-browser/iframe/pager'); // Go through pager next and previous buttons and assert pages. $this->assertSession()->buttonExists('‹ Previous')->hasAttribute('disabled'); $this->assertSession()->pageTextContains('Page 1');