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


6

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

回答:


1

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


1
このようなロジックをテンプレートファイルに含めることはお勧めしません。@googletorpによる前処理の使用に関する提案の方が優れています。
tim.plunkett

早くて汚いことを言った部分を見逃しましたか?ダーティは、それがベストプラクティスではないことをほのめかします。
Jepedo

8

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

どうもありがとう!


2
このコードを使用する場合は、まずMY_DISPLAY_IDがサイト全体で一意であることを確認してください(ビューの[その他-マシン名]で編集できます)。ビュー内でのみ一意である必要があるため、「ブロック」のような非常に一般的なものであることがよくあります。
ユーリ

8

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

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

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


全然分からない。とにかくすべてのラッパーHTMLが削除されていることを確認するためにtpl.phpファイル内で作業を行う必要がある場合、template.phpファイルを変更する目的も何ですか?余分な作業を作成しているようです。
レスターピーボディ

1
@LesterPeabodyベストプラクティスは、前処理にロジックを配置し、テンプレートのマークアップのみを処理することです。コードをより保守しやすくします。
googletorp

ビューテンプレートファイルのいたるところにロジックがあります...多分例を提供できますか?たとえば、単にviews-view.tpl.phpファイルのインスタンスを<?php if ($rows): ?> ... <?php endif; ?>. My understanding currently is there is no way to eliminate the extraneous wrapper HTML otherwise. If the $ rows`変数で囲んだだけで、そのファイルではすでに変数を使用できますが、なぜ余分な作業を行うのtemplate.phpですか?
レスターピーボディ

@LesterPeabody Generic、レンダリング前に何かが存在するかどうかを判断することは一般的です。ただし、特定のビューの特別なロジックはテンプレートファイルには含まれません。維持するのは難しく、複雑なサイトを構築するとき、維持する必要があることがより明白になります。
googletorp

1

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

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


0

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

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

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

うーん。これはうまくいくように思えますが、データベースにPHPコードを追加することは、別の方法がある場合は通常望ましくありません。
squarecandy '20 / 11/17

@squarecandyに同意して、特定のケースで可能な代替手段として提供してください。
RogerRoger

0

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

  • views-view.phpあなたのtheme / templatesディレクトリにコピーしてください
  • そのファイルのコピーを作成して名前を付けます views-view--view-name--display-name.tpl.php
  • (選択して上書きするファイル名の詳細については、[詳細]> [その他]> [テーマ:情報]を参照してください-必要に応じて、多少具体的にすることができます)
  • 追加 if (count($rows) < $n):コードにして、必要に応じて結果の数に基づいて操作する
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.