web-dev-qa-db-ja.com

カスタムページにポケットベルを追加する方法

REST APIからフェッチされ、一度にページ1に表示されるアイテムのリストがあります。これらのアイテムはDrupalデータベースは何らかの方法で使用できます。基本的なページャーはPreviousNextですが、設計により、リストには完全なページャーが必要です。

では、どうすればそのようなページにフルページャーを追加できますか?

5
Malabya Tewari

コアが使用するものを使用したい場合、ページにページャーを追加するdrupal.orgの例がいくつかあります。

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

2番目の例はあなたのために働くはずです:

_  $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に3番目の引数_$element_を使用しなかったことに注意してください。これは、ページに複数のページャーがある場合に必要になります。

getResultCount()は、ちなみに、Search API ResultSetクラスから提供されるメソッドです。

編集:今私の答えを見て、あなたのポケットベルサービスはRequestStackをまったく注入する必要はありません。私はおそらく別のアイデアを考えていて、それを完成したことも、必要がないと思ったこともありませんでした。

13
Kevin

かなり良い答えです、ケビン!私は改善を提案します。そして、それはサービスにrequest_stackを注入する方法です。次のように.services.ymlでサービスを宣言しているときに、create()メソッドを失う可能性があり、それを注入するだけです。

services: 
  yourmodule.pager_service: 
    class: Drupal\yourmodule\PagerService 
    arguments: ['@request_stack']
1
Nikolay Borisov