Drupal 9 Views 分頁器設置首頁顯示不同的條目個數

Posted by Y Cheung on Fri, May 27, 2022

在Drupal Views 中自帶了分頁功能 Pager,可以在界面上自定義每頁要顯示條目個數 Items to display,要跳過的個數 Offset (number of items to skip),總頁數 Number of pages,分頁的標籤 Page Link Labels,指定分頁顯示的個數 Number of pager links visible

Drupal Views Full Pager Options
Drupal Views Full Pager Options

但是如果想要首頁顯示的條目個數與其他不同就還是需要一些代碼來實現,Y Cheung 這裡使用 hook_views_pre_build() 重新安排首頁於非首頁要顯示的條目,用 hook_views_pre_render() 重新計算分頁。

例如,在Views中設置了 Items to display 為 12,那麼渲染出來的結果是首頁顯示11個條目,其餘分頁顯示12個條目。

 1<?php
 2/**
 3 * Implements hook_views_pre_build().
 4 */
 5function custom_module_views_pre_build(ViewExecutable $view) {
 6  if ($view->id() === 'view_id') {
 7    // Page is zero indexed: first page is NULL or 0.
 8    if (!$view->getRequest()->query->get('page')) {
 9      // Default is N, we set it to N-1.
10      $default_items_per_page = $view->getPager()->options['items_per_page'];
11      if ($default_items_per_page) {
12        $items_per_page = $default_items_per_page - 1;
13        $view->setItemsPerPage($items_per_page);
14      }
15    }
16    else {
17      // Set the offset on subsequent pages.
18      $view->setOffset(-1);
19    }
20  }
21}
22
23/**
24 * Implements hook_views_pre_render().
25 */
26function custom_module_views_pre_render(ViewExecutable $view) {
27  if ($view->id() === 'view_id') {
28    $result_count = $view->pager->getTotalItems();
29    $default_items_per_page = $view->pager->options['items_per_page'];
30    if (!$view->getCurrentPage()) {
31      $default_items_per_page += 1;
32    }
33    $default_total_pages = (int) ceil(($result_count + 1) / $default_items_per_page);
34    $view->pager->options['total_pages'] = $default_total_pages;
35    $view->pager->updatePageInfo();
36  }
37}