web-dev-qa-db-fra.com

Comment obtenir une valeur de champ de bloc personnalisé?

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;
    }
  }
}
4
asrob

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;
}
6
4k4

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;
2
rémy

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 }}
1
Jamie Salvage

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

0
Marcos Neves