web-dev-qa-db-ja.com

hook_views_pre_renderを使用してビュー行のビューモードを変更するにはどうすればよいですか?

hook_views_pre_renderでビュー結果のビューモードを変更することはできますか?

たとえば、3つの異なる表示モード(ティーザー、ティーザーフル、ティーザーショート)があります。目標は、ビューのページ/リストでこれらの3つのティーザーテンプレートをビューに繰り返し表示させることですが、私は最初にビューモードを変更するのに苦労しています。

以下を試してみましたが、何もしないようです。

function themename_views_pre_render(ViewExecutable $view) {
  foreach ($view->result as $index => $row) {
    $view->row_index = $index;
    $view->rowPlugin->options['view_mode'] = 'teaser';
  }
}

:コードにブレークポイントをドロップすると、ヒットします。しかし、それでもデフォルトのビューモードとしてレンダリングされます。

3
Janey

Hook_views_pre_execute()フックで表示モードを変更することができました。 _views_pre_render()は遅すぎると思います。

function custom_module_views_pre_execute(ViewExecutable $view) {
  // Some logic to determine view mode...

  $view->rowPlugin->options['view_mode'] = 'list';
}
4
Inge

ビューUIを使用してそれを行うことができます。

  1. インストール エンティティAPI モジュール

  2. フィールドをあなたのフォーマットにする

    enter image description here

  3. Entity APIを持っているので、Rendered Entityをフィールドとして追加できます。

enter image description here

  1. 表示モードを選択します。

enter image description here

  1. 他のビューモードのレンダーエンティティフィールドをさらに追加します(手順3と4を繰り返します)。
0
No Sssweat

Custom_module_views_pre_execute(ViewExecutable $ view)の例を機能させることができませんでした。

Xdebugで検査した後、これを使用することができました。

function custom_module_preprocess_views_view(&$variables) {
  if ($view->id() == 'view_name' && $view->current_display == "display_name") {
    if (count($view->result) == 1) {
      // Change view mode to teaser when there is only 1 item.
      $variables['rows'][0]['#rows'][0]['#view_mode'] = 'teaser';
    }
  }
}
0
stacey.mosier

Views Parity Row はこの問題を解決します。私のニーズにうまく機能し、最初の行の項目に別の表示モードが必要だったので、 このパッチ を適用する必要がありましたDrupal 8.他の使用例でもうまく機能します。

enter image description here

0
nbaosullivan