結果がX未満の場合、ビューを(ブロックビューとして)非表示にできるかどうか疑問に思います。
ビューのフックを学ぶには少し時間がかかります。ビューテンプレートファイルについて知っていますか?もしそうなら、それを行うための迅速で汚れた方法は、最上位レベルのビューテンプレートファイルに表示出力がある行数を確認することです。 Develモジュールがインストールされている場合は、views-view.tpl.phpでdpm($variables)
を実行できます(おそらく、ビューに固有の表示出力を使用する必要があります)。
どこにあるか思い出せませんが、どこかに$variables
は行数です。ロジックをテンプレートファイルに追加して、印刷しないようにすることができます$rows
基準を満たしていない場合。
テンプレートの前処理関数では、ビューの結果(行)の数を簡単に検出し、その場合は出力に空の文字列を設定できます。
これを機能させるには、テンプレートで少し作業を行う必要がある場合があります。ビューは常に、ビューが空の場合はおそらく望ましくない折り返しHTMLを追加するためです。
私はおそらく template_preprocess_views_view() 前処理関数で行うのが最も簡単でしょう。テンプレートに関するヒントを得るために、ビューのインターフェースを調べることができます。
Googletorpが与えたヒントに基づいて、私の簡単な解決策はこれを私のtemplate.phpに入れることです:
function MY_THEME_NAME_preprocess_views_view(&$vars) {
if ($vars['display_id'] == 'MY_DISPLAY_ID' && count($vars['view']->result) < 2) {
$vars['view']->result = NULL;
}
}
この場合、結果が2つ未満の場合、ビューを非表示にします。
どうもありがとう!
この理由が主に表示指向である場合(たとえば、グリッドを構築していて、偶数/奇数のアイテムを強制したい場合)、テーマレイヤーにカスタムロジックを追加するのが最も論理的だと思います。他の答えはこれをカバーしていると思います。ただし、見つかった問題は、一部のビュー変数を変更する必要がある可能性があることです(例:$view->result = NULL
)、前処理関数の一部として安全に変更することはできません。ビューの内部キャッシュは、「レンダリングされた出力」と「クエリ結果」のキャッシュ設定の一部の組み合わせが既存のソリューションと互換性がないような方法でいくつかの変数を生成する可能性があります。
1つの代替方法は、実行されたクエリ自体の結果を変更することです。これにより、はるかに低いレベルでの制御が可能になります。マークアップが構築される前でも「空の」結果セットをシミュレートするため、ラッパーマークアップの非表示に関する問題のいくつかを回避することもできます。
/**
* Implements hook_views_post_execute().
*/
function MYMODULE_views_post_execute(&$view) {
$view_name = 'myviewname';
$view_display = 'mydisplay';
// Don't show the view if there is only one item.
if ($view->name == $view_name && $view->current_display == $view_display && count($view->result) < 2) {
$view->result = array();
}
}
もちろん、テーマや変更フックとは関係がないので、これをテーマに実装することはできませんが、この質問に興味がある人にとっては注目に値すると思います。
テーマテンプレートを使用してこれを行うこともできます。
views-view.php
_をテーマ/テンプレートディレクトリにコピーしますviews-view--view-name--display-name.tpl.php
_という名前を付けますif (count($rows) < $n):
をコードに追加して、必要に応じて結果の数に基づいて操作します場合によっては、この種の条件をビューに配置した方がいい場合があります。これにより、ビルダーは、他のモジュールやテーマフックではなく、編集ビューコンテキスト内で何が行われているのかを理解できます。
このロジックをビュー編集ページに含めたい場合は、次のようにできます。
<?php $view = views_get_current_view(); if ( count($view->result) < 5 ) { $view->result = null; } ?>