フィールドタイプがimageとx
のy
フィールドとtextfield
フィールドを持つ/admin/structure/block/block-content/types
から新しいカスタムブロックタイプを作成しました。次に、同じブロックタイプのブロックを作成し、x
に画像をアップロードし、y
にいくつかのテキストをアップロードしました。ここで私の問題は、コードを介してこのブロックをロードする方法ですか?
それ以上に、ブロックをロードしてこれらのブロックフィールドx
およびy
の値を取得する方法は?
私はこれらを試しました:
$block = \Drupal\block_content\Entity\BlockContent::load($bid);
$render = \Drupal::entityManager()->getViewBuilder('block_content')->view($block);
しかし、それはうまくいきませんでした。
ブロックをadmin/structure/blockの無効化セクションに配置します。これにより、block_contentタイプのブロックインスタンスが作成され、覚えやすいマシン名が付けられます。
無効化されたセクションに配置すると、プログラムでロードするまで表示されません。
次に、マシン名を使用します。
$machine_name = 'myblock';
$block = \Drupal::entityTypeManager()
->getStorage('block')
->load($machine_name);
if (!empty($block)) {
$block_content = \Drupal::entityTypeManager()
->getViewBuilder('block')
->view($block);
$pre_render = $block_content;
}
本当にレンダリングされたフィールドを取得したい場合は、以下を実行できます。
$render = \Drupal::entityTypeManager()
->getViewBuilder('block')
->build($pre_render);
ただし、ブロックを構築してレンダリングされたレンダー配列から要素を抽出するのではなく、Drupalのフォーマッターなど、おそらくカスタムテンプレートを使用する方が標準的な方法です。
$block = \Drupal::service('entity.repository')->loadEntityByUuid('block_content', $uuid);
if (!empty($block)) {
$recArticleAdView = \Drupal::entityTypeManager()
->getViewBuilder('block_content')
->view($block);
$rendered = \Drupal::service('renderer')->render($recArticleAdView);
$response = new CacheableResponse($rendered);
$response->addCacheableDependency(CacheableMetadata::createFromRenderArray($recArticleAdView));
$variables['content']['sponsored_content'] = Markup::create(trim(strip_tags($response->getContent(), '<div>')));
}
EntityInterface
を含めてこのコードを試してください:
// Block
use Drupal\Core\Entity\EntityInterface;
// the last part of the parameter is the block id
$block = \Drupal\block\Entity\Block::load('yourblockid');
$block_content = \Drupal::entityManager()
->getViewBuilder('block')
->view($block);
\Drupal::service('renderer')->renderRoot($block_content);
私の場合は異なりました。themeファイルにカスタムブロックを読み込んでいます。数字で正確な「ブロックID」を取得できませんでした。
ブロックマシン名を取得しました。この場合、次のコードを使用します。
$block_config = \Drupal\block\Entity\Block::load($machine_blockid);
$uuid = $block_config->getPlugin()->getDerivativeId();
$block_content = \Drupal::service('entity.repository')->loadEntityByUuid('block_content', $uuid);
if ($block_content) {
$img = file_create_url($block_content->field_X_image->entity->uri->value);
$color = $block_content->field_Y_textfield->value;
}
それ以外の場合は、次のコードを使用します。 $bid
はブロックコンテンツIDです。これは/ block/[bid]にあります。
$block = \Drupal\block_content\Entity\BlockContent::load($bid);
$x_img_url = file_create_url($block_content->field_X_image->entity->uri->value);;
$y_textfield_value = $block_content->field_Y_textfield->value;
2つの質問があります。構成されたブロックをロードしてレンダリングする方法は、@ oknateによって完全に答えられます。
2番目の質問:それ以上に、ブロックをロードしてこれらのブロックフィールド「x」と「y」の値を取得する方法は?
これは簡単です。フィールドがデータベースに格納されているブロックコンテンツエンティティを既に読み込んでいるからです。
$block = \Drupal\block_content\Entity\BlockContent::load($bid);
テキストフィールドから値にアクセスできます
$text = $block->field_y->value;
画像フィールドからURLを取得します。
$image_url = file_create_url($block->field_x->entity->uri->value);