web-dev-qa-db-ja.com

page.html.twigでブロックが空かどうかを確認する方法

私のpage.html.twigに私が持っています

<h2>{{ 'Block title'|t }}</h2>
<div class="">
  {{ drupal_block('leftblock') }}
  {{ drupal_block('rightblock') }}
</div>

Block titleを表示したいのは、カスタムの左ブロックと右ブロックが入力されている場合のみです。

ありがとう。


試してみました

My_module.moduleで行う場合

function my_module_preprocess_page(&$variables) {
  $block = Block::load('leftblock');
  if ($block) {
    $variables['leftblock'] = \Drupal::entityTypeManager()
      ->getViewBuilder('block')
      ->view($block);
  }
  $block = Block::load('rightblock');
  if ($block) {
    $variables['rightblock'] = \Drupal::entityTypeManager()
      ->getViewBuilder('block')
      ->view($block);
  }
}

そして私のpage.html.twigに

{% if leftblock or rightblock %}
  <h2>{{ 'Block title'|t }}</h2>
{% endif %}
<div class="my-class">
  {{ leftblock }}
  {{ rightblock }}
</div>

この{{rightblock}}は、ブロックの実際のコンテンツをtwig(が満たされた場合)に表示しますが、ブロックには常に何かがあるため、常にBlock titleを表示します

{{dump(rightblock)}}を実行すると、ブロックが空または一杯になったときにこれが表示されます。

array(3){["#cache"] => array(4){["keys"] => array(3){[0] => string(11) "entity_view" [1] => string(5 ) "block" [2] => string(22) "rightblock"} ["contexts"] => array(2){[0] => string(28) "languages:language_interface" [1] => string( 8) "url.site"} ["tags"] => array(2){[0] => string(10) "block_view" [1] => string(41) "config:block.block.rightblock" } ["max-age"] => int(-1)} ["#weight"] => int(0)["#lazy_builder"] => array(2){[0] => string(42) "Drupal\block\BlockViewBuilder :: lazyBuilder" [1] => array(3){[0] => string(22) "rightblock" [1] => string(4) "full" [2] => NULL }}}

私には2つのテーマがあります。

block-myLeft.html.twig

block-myRight.html.twig

1
Carlos

私はそのような私の問題を解決することができませんでした。私がしたことは、1つのブロックのみを使用し、それぞれにコンテンツのリストを含む2つの変数を渡すことでした。そしてtwigで、各変数に要素があるかどうかを確認します。そのため、その瞬間にタイトルを表示します。

Block/myBlock.php

$build[] = [
  '#theme' => 'my_block',
  '#left_content' => $itemsL,
  '#right_content' => $itemsR,
];

私のmy-block.html.twig

{% if left_content is not empty or right_content is not empty %}
  <h2>{{ 'Block title'|t }}</h2>
{% endif %}
0
Carlos

テンプレートを前処理できます

function mytheme_preprocess_page(&$variables) {
  $block = \Drupal\block\Entity\Block::load('leftblock');
  if ($block) {
    $variables['leftblock'] = \Drupal::entityTypeManager()
      ->getViewBuilder('block')
      ->view($block);
  }
  $block = \Drupal\block\Entity\Block::load('rightblock');
  if ($block) {
    $variables['rightblock'] = \Drupal::entityTypeManager()
      ->getViewBuilder('block')
      ->view($block);
  }
}

テンプレートでこれを行うことができるよりも

{% if rightblock or leftblock %}
  <h2>{{ 'Block title'|t }}</h2>
{% endif %}
<div class="">
  {{ leftblock }}
  {{ rightblock }}
</div>
0
Insasse

これは別の場所で議論されている問題です のようです。おそらくそれらの提案の1つがあなたを助けるでしょうか?

「完全な」レイジービルダー配列がどのように見えるかを正確に知らない場合、私はレイジービルダー配列のnull値が何を意味するかに関する仮定に基づいた推測的な提案しか提供できません。データがないことを意味している場合は、おそらく次のことを試すことができます。

{% if leftblock['#lazy_builder'][1][2] is not null or rightblock['#lazy_builder'][1][2] is not null %}
    <h2>{{ 'Block title'|t }}</h2>
{% endif %}

明確にするために、フォーマットされた変数ダンプを次に示します。

array(3) { 
    ["#cache"]=> array(4) { 
        ["keys"]=> array(3) { 
            [0]=> string(11) "entity_view" 
            [1]=> string(5) "block" 
            [2]=> string(22) "rightblock" 
        } 
        ["contexts"]=> array(2) { 
            [0]=> string(28) "languages:language_interface" 
            [1]=> string(8) "url.site" 
        } 
        ["tags"]=> array(2) { 
            [0]=> string(10) "block_view" 
            [1]=> string(41) "config:block.block.rightblock" 
        } 
        ["max-age"]=> int(-1) 
    } 
    ["#weight"]=> int(0) 
    ["#lazy_builder"]=> array(2) { 
        [0]=> string(42) "Drupal\block\BlockViewBuilder::lazyBuilder" 
        [1]=> array(3) { 
            [0]=> string(22) "rightblock" 
            [1]=> string(4) "full" 
            [2]=> NULL 
        } 
    } 
}
0
evantish