web-dev-qa-db-ja.com

カスタムブロックのフィールド値を取得するにはどうすればよいですか?

「機能ブロック」と呼ばれるカスタムブロックタイプがあります。代替タイトルとしてフィールドを追加しました(field_block_alt_titleはそのマシン名です)。

プログラムでこの代替タイトルをフロントページに表示したいと思います。

これで、これまでのところ、ブロックのタイトルを表示する次のコードがあります。

<?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

カスタムブロックのフィールドはブロックコンテンツ内にあります。したがって、フィールド値を取得する前に、まずブロックのコンテンツをロードする必要があります。

$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

次のようにフィールドをロードできます。

$alt_title = Drupal\block\Entity\Block::load($block_id)->get('field_block_alt_title')->value;

または

$alt_title = Drupal\block\Entity\Block::load($block_id)->field_block_alt_title->value;
2
rémy

今日も同じことをしようとしていましたが、これが最新の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;
        }

    }
}

次に、テンプレートファイルで。

{{ FIELD_VALUE_ACCESSIBLE_VIA_TEMPLATE }}
1
Jamie Salvage

Nodeからのフィールドをブロック変数に公開する必要があります。

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

} `

ブロックで使用するには--views-block--block-custom.html.twig

<div>
     {{field_name_1}}       
</div>

<div>
     {{field_name_2}}       
</div>

テスト済みDrupal 8.5.3

0
Marcos Neves