web-dev-qa-db-ja.com

最初のページのみのビューのアイテム数を変更するにはどうすればよいですか?

最初のページ(2アイテム)に対して他のアイテム(3アイテム)とは異なる数のアイテムを含むビューを作成しようとしています。アイテムをスキップしないようにするにはどうすればよいですか?
私はhook_views_pre_build()を使用してテストを行いましたが、2ページ目に1つのアイテム(アイテムC)がないため、結果は決定的ではありません。

これが私の現在のコードです:

function MYMODULE_views_pre_build(&$view) {
  if ($view->name == 'my_view' && empty($_GET['page']) {
    //The view normally has 3 items per page, put 2 for the first page.
    $view->items_per_page = 2;
  }
}

そしてこれが私が得た結果です:

一ページ目:

  • アイテムA
  • アイテムB

2ページ目:

  • アイテムD
  • アイテムE
  • アイテムF

ご覧のように、 item Cがないのは、ページあたりのアイテム数を3に設定すると、最初のページにも3つのアイテムがあることを意味するためです。

これを機能させる別の方法はありますか?

5
tostinni

Drupal 7:

できることは、ビューに2つの異なるディスプレイを使用することです。

これには、最初の表示が「ブロック」であり、2番目が「ページ」であることが必要です。

最初のディスプレイでは、ページャーを「指定した数のアイテムを表示する」に変更し、表示するアイテム数を2に設定します。

「詳細リンク」を有効にします。

2番目のディスプレイで、アイテム数を3に変更し、オフセットを2に設定します。

現在、ビューのページ表示に別の表示またはビューへのリンクを追加する方法はありません。

これは、ブロック表示からページ表示までのみ機能します。ブロックページをパネルページに表示できます。

1
corey.aufang

これは私がそれを機能させる方法であり、2つのフックを使用します。 my_viewというビューがあり、表示はpage_1であると想定します。

事前構築:最初のページについて、ページごとのアイテムを10に設定します。

事前レンダリング: "ビューにCSSクラスを追加します。

/**
 * Implements hook_views_pre_build().
 */
function my_module_views_pre_build(ViewExecutable $view) {
  if ($view->id() === 'my_view' && $view->current_display === 'page_1') {
    // Page is zero indexed: first page is NULL or 0.
    if (!$view->getRequest()->query->get('page')) {
      // Default is 9, we set it to 10.
      $view->setItemsPerPage(10);
    }
    else {
      // Set the offset on subsequent pages, because we have one more on the first page.
      $view->setOffset(1);
    }
  }
}

/**
 * Implements hook_views_pre_render().
 */
function my_module_views_pre_render(ViewExecutable $view) {
  if ($view->id() === 'my_view' && $view->current_display === 'page_1' && !$view->getCurrentPage()) {
    // Add CSS class for first page.
    $view->display_handler->setOption(
      'css_class',
      $view->display_handler->getOption('css_class') . ' is-first-page'
    );

    // To attach a library, use:
    // $view->element['#attached']['library'][] = 'my_module/view-first-page';
  }
}
0
Tim

次のように、offsetプロパティを使用できます。

function MYMODULE_views_pre_build(&$view) {
  if ($view->name == 'my_view') {
    // The view normally has 3 items per page, put 2 for the first page.
    if (!isset($_GET['page']) || $_GET['page'] <= 0) {
      $view->items_per_page = 2;
    }
    else {
      $view->offset = -1;
    }
  }
}

ビュー内のアイテム数を変更する場合は、ハードコードされた数値を変更する必要があるため、これを行うには最もクリーンな方法ではありません...しかし、高速で機能します。

0
Hervé Donner