J'ai un type de bloc personnalisé, appelé "Bloc de fonctionnalités". J'ai ajouté un champ comme titre alternatif (field_block_alt_title est le nom de cette machine).
Je voudrais afficher ce titre alternatif sur la première page par programme.
Maintenant, j'ai jusqu'à présent ce code qui affiche le titre des blocs:
<?php
use Drupal\Component\Utility\Html;
use Drupal\Core\Render\Element;
function neft_preprocess_region(&$variables) {
if ($variables['region'] == 'flick') {
$titles = array();
$ids = array();
$block_ids = Element::children($variables['elements']);
foreach ($block_ids as $block_id) {
$block_title = Drupal\block\Entity\Block::load($block_id)->label();
$titles[] = Html::escape($block_title);
$ids[] = 'block-' . Html::getUniqueId($block_id);
}
if (count($titles) && count($ids)) {
$tabs = '<ul>';
foreach ($titles as $key => $title) {
$tabs .= "<li><a href=\"#$ids[$key]\">$title</a></li>";
}
$tabs .= '</ul>';
$variables['tabs'] = $tabs;
}
}
}
Les champs des blocs personnalisés sont dans le contenu du bloc. Vous devez donc d'abord charger le contenu du bloc, avant d'obtenir la valeur du champ:
$block = \Drupal\block\Entity\Block::load($block_id);
$uuid = $block->getPlugin()->getDerivativeId();
$block_content = \Drupal::service('entity.repository')->loadEntityByUuid('block_content', $uuid);
if ($block_content) {
$field_value = $block_content->field_block_alt_title->value;
}
Vous pouvez charger le champ comme:
$alt_title = Drupal\block\Entity\Block::load($block_id)->get('field_block_alt_title')->value;
ou
$alt_title = Drupal\block\Entity\Block::load($block_id)->field_block_alt_title->value;
J'essayais de faire la même chose aujourd'hui et c'est le seul qui a fonctionné pour moi sur la dernière version Drupal (8.6.12)).
use \Drupal\block_content\BlockContentInterface;
function HOOK_preprocess_block(&$variables)
{
$content = $variables['elements']['content'];
if (isset($content['#block_content']) && $content['#block_content'] instanceof BlockContentInterface) {
$blockType = $content['#block_content']->bundle();
if ($blockType === 'CUSTOM_BLOCK_TYPE') {
$variables['FIELD_VALUE_ACCESSIBLE_VIA_TEMPLATE'] = $content['#block_content']->get('FIELD_NAME')->value;
}
}
}
Puis dans votre fichier modèle.
{{ FIELD_VALUE_ACCESSIBLE_VIA_TEMPLATE }}
Vous devez exposer les champs de Node à Block variables.
function MYTHEME_preprocess_block(&$variables) {
if(isset($variables['elements']['content']['#view'])){
$node = $variables['elements']['content']['#view']->result[0]->_entity;
if($node){
if ($node instanceof \Drupal\node\Entity\Node) {
if ($node->hasField('field_name_1')) {
$variables['field_name_1'] = $node->get('field_name_1')->value;
}
if ($node->hasField('field_name_2')) {
$variables['field_name_2'] = $node->get('field_name_2')->value;
}
}
}
}
} `
A utiliser dans votre bloc - views-block - block-custom.html.twig
<div>
{{field_name_1}}
</div>
<div>
{{field_name_2}}
</div>
Testé sur Drupal 8.5.3