「機能ブロック」と呼ばれるカスタムブロックタイプがあります。代替タイトルとしてフィールドを追加しました(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;
}
}
}
カスタムブロックのフィールドはブロックコンテンツ内にあります。したがって、フィールド値を取得する前に、まずブロックのコンテンツをロードする必要があります。
$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;
}
次のようにフィールドをロードできます。
$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;
今日も同じことをしようとしていましたが、これが最新の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 }}
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