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';
}
}
注:コードにブレークポイントをドロップすると、ヒットします。しかし、それでもデフォルトのビューモードとしてレンダリングされます。
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';
}
ビューUIを使用してそれを行うことができます。
インストール エンティティAPI モジュール
フィールドをあなたのフォーマットにする
Entity APIを持っているので、Rendered Entityをフィールドとして追加できます。
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';
}
}
}
Views Parity Row はこの問題を解決します。私のニーズにうまく機能し、最初の行の項目に別の表示モードが必要だったので、 このパッチ を適用する必要がありましたDrupal 8.他の使用例でもうまく機能します。