web-dev-qa-db-ja.com

結果がN未満の場合はビューを非表示にします

結果がX未満の場合、ビューを(ブロックビューとして)非表示にできるかどうか疑問に思います。

6
Disco

ビューのフックを学ぶには少し時間がかかります。ビューテンプレートファイルについて知っていますか?もしそうなら、それを行うための迅速で汚れた方法は、最上位レベルのビューテンプレートファイルに表示出力がある行数を確認することです。 Develモジュールがインストールされている場合は、views-view.tpl.phpでdpm($variables)を実行できます(おそらく、ビューに固有の表示出力を使用する必要があります)。
どこにあるか思い出せませんが、どこかに$variablesは行数です。ロジックをテンプレートファイルに追加して、印刷しないようにすることができます$rows基準を満たしていない場合。

1
Jepedo

テンプレートの前処理関数では、ビューの結果(行)の数を簡単に検出し、その場合は出力に空の文字列を設定できます。

これを機能させるには、テンプレートで少し作業を行う必要がある場合があります。ビューは常に、ビューが空の場合はおそらく望ましくない折り返しHTMLを追加するためです。

私はおそらく template_preprocess_views_view() 前処理関数で行うのが最も簡単でしょう。テンプレートに関するヒントを得るために、ビューのインターフェースを調べることができます。

8
googletorp

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つ未満の場合、ビューを非表示にします。

どうもありがとう!

8
yan

この理由が主に表示指向である場合(たとえば、グリッドを構築していて、偶数/奇数のアイテムを強制したい場合)、テーマレイヤーにカスタムロジックを追加するのが最も論理的だと思います。他の答えはこれをカバーしていると思います。ただし、見つかった問題は、一部のビュー変数を変更する必要がある可能性があることです(例:$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();
  }
}

もちろん、テーマや変更フックとは関係がないので、これをテーマに実装することはできませんが、この質問に興味がある人にとっては注目に値すると思います。

1
rjacobs

テーマテンプレートを使用してこれを行うこともできます。

  • _views-view.php_をテーマ/テンプレートディレクトリにコピーします
  • そのファイルのコピーを作成し、_views-view--view-name--display-name.tpl.php_という名前を付けます
  • (どのファイル名を選択してオーバーライドするかについての詳細は、「詳細」>「その他」>「テーマ:情報」を参照してください-必要に応じて、多少具体的にすることができます)
  • if (count($rows) < $n):をコードに追加して、必要に応じて結果の数に基づいて操作します
0
squarecandy

場合によっては、この種の条件をビューに配置した方がいい場合があります。これにより、ビルダーは、他のモジュールやテーマフックではなく、編集ビューコンテキスト内で何が行われているのかを理解できます。

このロジックをビュー編集ページに含めたい場合は、次のようにできます。

  1. グローバルテキスト/ HTMLフッターフィールドを追加し、テキスト形式をPHPコード
  2. このフィールドの管理者名を非常に明確なものに設定します。 「結果が5件未満の場合はこのビューを非表示にする」。これにより、将来のサイトビルダーが混乱しないようにします(ビューが表示されなくなるのはなぜですか!?!?)
  3. 以下のPHPコードを必要に応じて変更し、フィールドで使用します。
<?php
$view = views_get_current_view();
if ( count($view->result) < 5 ) {
    $view->result = null;
}
?>
0
RogerRoger