web-dev-qa-db-ja.com

ビューが空の場合、ブロックを削除/非表示にしますか?

ブロックが空かどうかを知るAPIはありますか?基本的に私がやろうとしていることは、template_preprocess_page内のブロックを非表示/設定解除することです。

これが私の現在のコードです:

 if ($variables['page']['rail_full']) {
    foreach ($variables['page']['rail_full'] as $keys => $blocks) {
      if (isset($blocks['content']['#views_contextual_links_info'])) {
        $name = (isset($blocks['content']['#views_contextual_links_info']['views_ui'])) ? $blocks['content']['#views_contextual_links_info']['views_ui']['view']->name : '';
        $display_id = explode('-', $blocks['#block']->delta);
        $block = views_get_view_result($name, $display_id[1]);
        if (empty($block)) {
          unset($variables['page']['rail_full'][$keys]);
        } 
      }
    }
  }

しかし、上記のコードは、1を出力すると常にcount of $blockを返します。

以下は問題なく動作しますが、良い解決策ではありません。すべてのブロックでできる限り動的にしたい。

if (!isset($variables['node']->field_author_favorite_links['en'])) {
    unset($variables['page']['rail_full']['views_franchise_page-block_2']);
}

if (!isset($variables['node']->field_article_column['en'])) {
    unset($variables['page']['rail_full']['views_franchise_page-block_3']);
}
5
ninjascorner

「空の」フィールドでも同じ動作がありました。フィールド自体を非表示にしない限り、デザイン/マークアップは引き続きレンダリングされます。私にとっての解決策は、「NOT NULL」であるフィールドをフィルタリングすることでした。 (多分、私がインストールした "fences"モジュールにも依存します。テストされていないため、わかりません...)

6
user20498

デフォルトでは、ブロック表示のあるビューが結果を返さない場合、レンダリングされません。これは、ビューが空のときに表示される「結果の動作なし」を設定していない限りです。何も設定されていないことを確認してください。

enter image description here

したがって、よりカスタムなことをしようとしない限り、コーディングは必要ありません。その場合は、何を達成しようとしているのかを明確にしたい場合があります。

2
apower