ブロックが空かどうかを知る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']);
}
「空の」フィールドでも同じ動作がありました。フィールド自体を非表示にしない限り、デザイン/マークアップは引き続きレンダリングされます。私にとっての解決策は、「NOT NULL」であるフィールドをフィルタリングすることでした。 (多分、私がインストールした "fences"モジュールにも依存します。テストされていないため、わかりません...)
デフォルトでは、ブロック表示のあるビューが結果を返さない場合、レンダリングされません。これは、ビューが空のときに表示される「結果の動作なし」を設定していない限りです。何も設定されていないことを確認してください。
したがって、よりカスタムなことをしようとしない限り、コーディングは必要ありません。その場合は、何を達成しようとしているのかを明確にしたい場合があります。