web-dev-qa-db-ja.com

残りのエクスポートを表示し、その応答でページ番号を送信する

「レストエクスポート」を使用してページ分割されたビューがあり、それを使用してモバイルアプリのデータを表示しています。すべて正常に機能しますが、アプリにページ番号を表示するために、そのエンドポイントに存在するページの数を知りたいです。

プログラムでビューを変更できることはわかっていますが、これを実現する簡単な解決策があるかどうかを尋ねています。

これはビュー設定ページです。

enter image description here

3
Shirin Abdolahi

現在、ビューの残りのエクスポートで合計ページ数を表示する方法はありません。ただし、以下に示すように、既存の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
   }
}
7
Vishal Patil