Как добавить пейджер на пользовательскую страницу?

У меня есть список элементов, которые извлекаются из REST API и отображаются на странице 10 за раз. Эти элементы не хранятся в базе данных Drupal каким-либо образом. У меня был базовый пейджер, который был всего лишь Предыдущий & Далее . Но согласно дизайну список должен иметь полный пейджер.

Итак, как я могу добавить Full Pager на такую ​​страницу?

4 голоса | спросил Malabya Tewari 5 J000000Tuesday16 2016, 20:06:26

2 ответа


9

На drupal.org есть несколько примеров добавления пейджера на страницу, если вы хотите использовать тот, который использует ядро:

https: //api. drupal.org/api/drupal/core%21includes%21pager.inc/function/pager_default_initialize/8.2.x

Второй пример должен работать для вас:

  $page = pager_find_page();
  $num_per_page = \Drupal::config('mymodule.settings')->get('num_per_page');
  $offset = $num_per_page * $page;
  $result = mymodule_remote_search($keywords, $offset, $num_per_page);

  // Now that we have the total number of results, initialize the pager.
  pager_default_initialize($result->total, $num_per_page);

  // Create a render array with the search results.
  $render = [];
  $render[] = [
    '#theme' => 'search_results',
    '#results' => $result->data,
    '#type' => 'remote',
  ];

  // Finally, add the pager to the render array, and return.
  $render[] = ['#type' => 'pager'];
  return $render;

Я делал это раньше на своих собственных страницах поиска, чтобы решить вашу проблему.

Вы можете заменить $ num_per_page выше на 10, если у вас нет настраиваемого модуля для сохранения настроек.

Вы можете пойти дальше, и в своем коде создайте службу, которая обрабатывает только подключение пейджера. Я делал песочницу, исследуя API поиска, и придумал это. Во-первых, вам нужно определить свою службу и ввести ее в свой контроллер (я называю мой как pager_service).

  /**
   * @var \Drupal\velirsearch\Service\PagerService
   */
  private $pager_service;

  /**
   * SearchResults constructor.
   * @param \Drupal\velirsearch\Service\PagerService $pager_service
   */
  public function __construct(PagerService $pager_service) {
    $this->pager_service = $pager_service;
  }

  /**
   * @param \Symfony\Component\DependencyInjection\ContainerInterface $container
   * @return static
   */
  public static function create(ContainerInterface $container) {
    $pager_service = $container->get('velirsearch.pager_service');
    return new static($pager_service);
  }

Затем, метод, который прикрепляет пейджер:

     /**
       * Convenient method to obtain a pager to attach from the pager service.
       * @param $totalRows
       * @param $limit
       * @return array
       */
      protected function attachPager($totalRows, $limit) {
        return $this->pager_service->getPager($totalRows, $limit);
      }

Затем служба:

namespace Drupal\velirsearch\Service;

use Symfony\Component\DependencyInjection\ContainerAwareTrait;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\HttpFoundation\RequestStack;

class PagerService implements ContainerAwareInterface {

  use ContainerAwareTrait;

  /**
   * @var \Symfony\Component\HttpFoundation\Request
   */
  private $requestStack;

  /**
   * PagerService constructor.
   * @param \Symfony\Component\HttpFoundation\RequestStack $requestStack
   */
  public function __construct(RequestStack $requestStack) {
    $this->requestStack = $requestStack;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    $requestStack = $container->get('request_stack');
    return new static($requestStack);
  }

  /**
   * @param $totalRows
   * @param $limit
   * @return array
   */
  public function getPager($totalRows, $limit = 10) {
    pager_default_initialize($totalRows, $limit);
    return ['#type' => 'pager'];
  }
}

Затем, когда вам это нужно ...

  $render[] = $this->attachPager($results->getResultCount(), 10);

  return $render;

Вам не обязательно идти так далеко, я просто искал способы уменьшить код, необходимый для подключения пейджера к различным экземплярам контроллеров результатов поиска. YMMV.

Обратите внимание, что я не использовал третий аргумент для pager_default_initialize, $element, который вам понадобится, если на вашей странице будет много пейджеров он.

getResultCount(), кстати, это метод, предоставляемый из класса ResultSet API поиска.

edit: теперь, глядя на мой ответ, вашему пейджер-сервису вообще не нужно вводить RequestStack. Я, вероятно, думал о другой идее и никогда не закончил ее или не понял, что мне это не нужно.

ответил Kevin 5 J000000Tuesday16 2016, 20:32:13
0

Это хороший чертовски хороший ответ, Кевин! Однако я бы предложил улучшение. И это в том, как вы вводите request_stack в свою службу. Вы можете потерять метод create () и просто ввести его, когда объявляете службу в своем .services.yml следующим образом:

services: 
  yourmodule.pager_service: 
    class: Drupal\yourmodule\PagerService 
    arguments: ['@request_stack']
ответил Nikolay Borisov 2 FebruaryEurope/MoscowbFri, 02 Feb 2018 19:18:47 +0300000000pmFri, 02 Feb 2018 19:18:47 +030018 2018, 19:18:47

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132