Dans ma page.html.twig j'ai
<h2>{{ 'Block title'|t }}</h2>
<div class="">
{{ drupal_block('leftblock') }}
{{ drupal_block('rightblock') }}
</div>
Je veux afficher Titre du bloc uniquement si mes blocs gauche et droit personnalisés sont remplis.
Merci.
j'ai essayé
Si je fais dans mon 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);
}
}
et dans ma page.html.twig
{% if leftblock or rightblock %}
<h2>{{ 'Block title'|t }}</h2>
{% endif %}
<div class="my-class">
{{ leftblock }}
{{ rightblock }}
</div>
Ce {{rightblock}} affiche le contenu réel du bloc en brindille (quand il est rempli), mais il affiche toujours Titre du bloc parce que le bloc a toujours quelque chose
si je fais {{dump (rightblock)}} je l'ai obtenu lorsque le bloc est vide ou rempli.
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 }}}
J'ai deux thèmes:
block-myLeft.html.twig
block-myRight.html.twig
Je n'ai pas pu résoudre mon problème comme ça. Ce que j'ai fait, c'est d'utiliser un seul bloc et de passer 2 variables avec une liste de contenu dans chacune. Et puis dans twig je vérifie s'il y a des éléments dans chaque variable. Donc j'affiche le titre à ce moment-là.
Block/myBlock.php
$build[] = [
'#theme' => 'my_block',
'#left_content' => $itemsL,
'#right_content' => $itemsR,
];
Mon my-block.html.twig
{% if left_content is not empty or right_content is not empty %}
<h2>{{ 'Block title'|t }}</h2>
{% endif %}
Vous pouvez prétraiter votre modèle
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);
}
}
Que vous pouvez le faire dans votre modèle
{% if rightblock or leftblock %}
<h2>{{ 'Block title'|t }}</h2>
{% endif %}
<div class="">
{{ leftblock }}
{{ rightblock }}
</div>
Il semble c'est un problème discuté ailleurs . Peut-être qu'une de ces propositions vous aidera?
Sans savoir exactement à quoi un tableau lazybuilder "complet" est censé ressembler, je ne peux que proposer une suggestion spéculative basée sur l'hypothèse concernant ce que la valeur nulle du tableau lazybuilder pourrait impliquer. Si cela signifie qu'il n'y a pas de données, vous pouvez peut-être essayer:
{% if leftblock['#lazy_builder'][1][2] is not null or rightblock['#lazy_builder'][1][2] is not null %}
<h2>{{ 'Block title'|t }}</h2>
{% endif %}
Pour plus de clarté, voici le vidage variable formaté:
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
}
}
}