web-dev-qa-db-ja.com

特定の場合にプログラムでビューページャーを無効にする方法

ビューを示す段落があります。エディターは、引数フィルター、ソート、ページャーの表示/非表示などのオプションを設定できます。 「通常」フィールドはこれらのオプションを収集するために使用され、_template_preprocess_paragraph__PARAGRAPH_TYPE_は実際にビューを構築します。フィルタリングはうまく機能しますが、同時に表示されるアイテムの量を制限しながらエディターが無効にしたい場合は、ページャーを取り除くことができません(ここでは、$view->setItemsPerPage(0);はオプションではありません)。 mytheme.themeの簡単なコードを次に示します。

_function mytheme_preprocess_paragraph__content_list(&$variables) {
  $view = Views::getView('content_list');
  if (!$view) {
    return;
  }

  // Simulate user input:
  $order = 'DESC';
  $disable_pager = TRUE;
  $items_per_page = 12;
  $filter_args = [1,2,3,4];


  $display_id = 'embed_content_list_title';
  $view->setDisplay($display_id);
  $view->setHandlerOption($display_id, 'sort', 'title', 'order', $order);

  if ($disable_pager) {
    $display = $view->getDisplay();
    $pager = [
      'type' => 'none',
      'options' => [
        'offset' => 0,
        'items_per_page' => 50,
      ],
    ];
    // This doesn't work:
    $display->setOption('pager', $pager);
    $display->setOverride('pager', $pager);
    // This neither works:
    $view->display_handler->setOption('pager', $pager);
    $view->display_handler->setOverride('pager', $pager);
    // I also had no luck with:
    $view->pager = NULL;

    $view->setItemsPerPage($items_per_page);
  }

  $view->execute();
  $variables['content']['content_list'] = $view->buildRenderable($display_id, [$filter_args]);
}
_

上記のコードでポケットベルを無効にするにはどうすればよいですか?回避策は、ページャーを有効にしたものとページャーを無効にしたものの異なるディスプレイを使用することです。しかし、私はそれを1つのディスプレイだけで解決したいと思います(すでに複数のディスプレイがあり、各ディスプレイに対して両方のバージョンをビルドする必要があるため)。

2
LarS

ピギーバックをオフにする プログラムでビューページャーアイテムのサイズを設定する方法? および PagerPluginBase を確認します。

値を変更するには

if ($disable_pager == FALSE) {
  $view->setOffset(0);
  $view->setItemsPerPage($items_per_page);
}

今あなたの質問に答えます

上記のコードでポケットベルを無効にするにはどうすればよいですか?

1ページあたりの項目をゼロに設定することで無効にできます。

$view->setItemsPerPage(0);

ページャーなしでアイテムの量を制限したい場合は、設定を解除するだけです。

   $view = Views::getView('content_list');
   $display_id = 'embed_content_list';
   $view->setDisplay($display_id);
   $view->setItemsPerPage(12);
   $view->execute();
   unset($view->pager); // must put this unset after the $view->execute();
   $variables['content']['content_list'] = $view->buildRenderable($display_id, [$filter_args]);
1
No Sssweat