web-dev-qa-db-ja.com

コードを介してカスタムブロックを読み込む方法は?

フィールドタイプがimageとxyフィールドと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);

しかし、それはうまくいきませんでした。

5
user21513

ブロックをadmin/structure/blockの無効化セクションに配置します。これにより、block_contentタイプのブロックインスタンスが作成され、覚えやすいマシン名が付けられます。

place block in disabled section

無効化されたセクションに配置すると、プログラムでロードするまで表示されません。

次に、マシン名を使用します。

$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のフォーマッターなど、おそらくカスタムテンプレートを使用する方が標準的な方法です。

5
oknate
$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>')));
      }
0
sudishth

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);
0
developer

私の場合は異なりました。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;
0
user21513

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);
0
4k4