REST APIからフェッチされ、一度にページ1に表示されるアイテムのリストがあります。これらのアイテムはDrupalデータベースは何らかの方法で使用できます。基本的なページャーはPrevious&Nextですが、設計により、リストには完全なページャーが必要です。
では、どうすればそのようなページにフルページャーを追加できますか?
コアが使用するものを使用したい場合、ページにページャーを追加するdrupal.orgの例がいくつかあります。
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をまったく注入する必要はありません。私はおそらく別のアイデアを考えていて、それを完成したことも、必要がないと思ったこともありませんでした。
かなり良い答えです、ケビン!私は改善を提案します。そして、それはサービスにrequest_stackを注入する方法です。次のように.services.ymlでサービスを宣言しているときに、create()メソッドを失う可能性があり、それを注入するだけです。
services:
yourmodule.pager_service:
class: Drupal\yourmodule\PagerService
arguments: ['@request_stack']