最初のページ(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つのアイテムがあることを意味するためです。
これを機能させる別の方法はありますか?
Drupal 7:
できることは、ビューに2つの異なるディスプレイを使用することです。
これには、最初の表示が「ブロック」であり、2番目が「ページ」であることが必要です。
最初のディスプレイでは、ページャーを「指定した数のアイテムを表示する」に変更し、表示するアイテム数を2に設定します。
「詳細リンク」を有効にします。
2番目のディスプレイで、アイテム数を3に変更し、オフセットを2に設定します。
現在、ビューのページ表示に別の表示またはビューへのリンクを追加する方法はありません。
これは、ブロック表示からページ表示までのみ機能します。ブロックページをパネルページに表示できます。
これは私がそれを機能させる方法であり、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';
}
}
次のように、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;
}
}
}
ビュー内のアイテム数を変更する場合は、ハードコードされた数値を変更する必要があるため、これを行うには最もクリーンな方法ではありません...しかし、高速で機能します。