「レストエクスポート」を使用してページ分割されたビューがあり、それを使用してモバイルアプリのデータを表示しています。すべて正常に機能しますが、アプリにページ番号を表示するために、そのエンドポイントに存在するページの数を知りたいです。
プログラムでビューを変更できることはわかっていますが、これを実現する簡単な解決策があるかどうかを尋ねています。
これはビュー設定ページです。
現在、ビューの残りのエクスポートで合計ページ数を表示する方法はありません。ただし、以下に示すように、既存のSerializer
クラスを拡張するカスタムモジュールで新しいカスタムスタイルを使用すると、合計ページ、現在のページ、ページごとのアイテム、およびアイテムの総数を取得できます。
<?php
namespace Drupal\custom_module\Plugin\views\style;
use Drupal\rest\Plugin\views\style\Serializer;
/**
* The style plugin for serialized output formats.
*
* @ingroup views_style_plugins
*
* @ViewsStyle(
* id = "custom_serializer",
* title = @Translation("Custom serializer"),
* help = @Translation("Serializes views row data and pager using the Serializer component."),
* display_types = {"data"}
* )
*/
class CustomSerializer extends Serializer {
/**
* {@inheritdoc}
*/
public function render() {
$rows = [];
// If the Data Entity row plugin is used, this will be an array of entities
// which will pass through Serializer to one of the registered Normalizers,
// which will transform it to arrays/scalars. If the Data field row plugin
// is used, $rows will not contain objects and will pass directly to the
// Encoder.
foreach ($this->view->result as $row_index => $row) {
$this->view->row_index = $row_index;
$rows[] = $this->view->rowPlugin->render($row);
}
unset($this->view->row_index);
// Get the content type configured in the display or fallback to the
// default.
if ((empty($this->view->live_preview))) {
$content_type = $this->displayHandler->getContentType();
}
else {
$content_type = !empty($this->options['formats']) ? reset($this->options['formats']) : 'json';
}
$pager = $this->view->pager;
$class = get_class($pager);
$current_page = $pager->getCurrentPage();
$items_per_page = $pager->getItemsPerPage();
$total_items = $pager->getTotalItems();
$total_pages = 0;
if(!in_array($class, ['Drupal\views\Plugin\views\pager\None', 'Drupal\views\Plugin\views\pager\Some'])){
$total_pages = $pager->getPagerTotal();
}
$result = [
'rows' => $rows,
'pager' => [
'current_page' => $current_page,
'total_items' => $total_items,
'total_pages' => $total_pages,
'items_per_page' => $items_per_page,
],
];
return $this->serializer->serialize($result, $content_type, ['views_style_plugin' => $this]);
}
}
上記のファイルを追加したら、drupalキャッシュをクリアしてビューを編集します。ここで、形式をSerializer
からCustom serializer
に変更する必要があります。
このスタイルでは、出力に少し違いがあります。すべての行はrows
の子であり、ポケットベル情報はpager
の一部です。出力例は次のとおりです。
{
"rows":[
{
"title":"Test"
},
{
"title":"Test"
},
{
"title":"Title 5"
},
{
"title":"Title 4"
},
{
"title":"Title 3"
}
],
"pager":{
"current_page":0,
"total_items":6,
"total_pages":2,
"items_per_page":5
}
}