UIから、その方法でリージョンにブロックを追加できます。
同じことをプログラムで行いたいと思います。既存のブロックをリージョンに追加して保存するにはどうすればよいですか?このブロックは、その領域に表示され、ブロックレイアウトページで使用できるようになります。
プラグインブロックを提供するには、設定の配列を作成し、それを \Drupal\block\Entity\Block::create()
に渡すことができますBlockオブジェクトを作成し、インスタンスを保存します。
たとえば、DevelExecute PHPブロックをSevenテーマに追加する場合は、次のようにします。
$values = array(
// A unique ID for the block instance.
'id' => 'devel_execute_php_1',
// The plugin block id as defined in the class.
'plugin' => 'devel_execute_php',
// The machine name of the theme region.
'region' => 'content',
'settings' => array(
'label' => 'Execute PHP',
),
// The machine name of the theme.
'theme' => 'seven',
'visibility' => array(),
'weight' => 100,
);
$block = \Drupal\block\Entity\Block::create($values);
$block->save();
あなたは Twig Tweak モジュールを使用できます:
Twig Tweakモジュールは、Twig拡張機能を提供し、開発者のエクスペリエンスを改善できるいくつかの便利な関数とフィルターを備えています。
そして、あなたのtwigテンプレート領域:
{{ drupal_block('block_id') }}
ブロックの各インスタンス(「ブロックタイプ」、構成、および配置)は、構成エンティティ\Drupal\block\Entity\Block
です。したがって、必要なのは、このエンティティの新しいインスタンスを正しい詳細で作成することだけです。これで完了です。
これは実行できますが、クレイジーで複雑です。プラグインシステムを理解し、プラグインシステムをブロックする必要があります。
あなたは\Drupal\block\BlockForm::submitForm
を見てこれの感触をつかむことができます\Drupal\simpletest\BlockCreationTrait::placeBlock
。これが本当に必要なものである場合、ブロックの可視性がかなり複雑であるかどうかを検討する必要があります。
私はD8を学習しているだけですが、プログラムでブロックを配置するはるかに簡単な方法を見つけたようです(googletorpの答えを読んだ後、それはかなり怖いようでした!)
ブロックを定義するカスタムモジュールを有効にすると、ブロックが自動的に正しい領域に配置されるようになりました。これを達成するために使用した手順は次のとおりです。
/admin/structure/block
にブロックを配置しますadmin/config/development/configuration/single/export
の単一アイテム構成エクスポートページに移動します。/config/install/
を作成します/config/install
ディレクトリに作成し、そこにコードをコピーします。私は Entity:Blockをプログラムで操作する方法をDrupal 8 に感謝します。
use Drupal\block\Entity\Block;
$block = Block::load('sitebranding');
$block->setRegion('content');
$block->save();
上記の例は十分に近いですが、まだ正しくありません。アイデアは、ブロックインスタンスの独自のID(私の場合はdevel_execute_php_1112(多分私は1112回動作させようとしたので、謎のままです))と、実際のブロックID(それはアノテーションのカスタムブロックとテーマで宣言されています。次に、地域を設定するだけでよい。目的の領域の下にブロックのインスタンスを作成しました。
$blockEntityManager = \Drupal::service('entity.manager')->getStorage('block');
$block = $blockEntityManager->create(
array(
'id'=> 'devel_execute_php_1112',
'plugin' => 'devel_execute_php',
'theme' => 'seven'
)
);
$block->setRegion('content');
$block->save();
edit1:私は実際に上記のコメントを後で確認しました-そしてそれは正しいです。 idがあなたが考え出さなければならないものであることははっきりしていません。私の不完全なコメントの引き換えとして、カスタムブロックエンティティのブロックインスタンスを作成する方法についてのソリューションを投稿します。
$blockEntityManager = \Drupal::service('entity.manager')->getStorage('block');
$block = $blockEntityManager->create(
array(
'id'=> 'ggggggggsssssss',
'plugin' => 'block_content:79d53b4e-9e60-4f97-befc-101da919bb7a',
'theme' => 'visitb_he_theme'
)
);
$block->setRegion('content');
基本的に同じですが、プラグインの場合はblock_content:uuid_of_custom_block_entity_instanceと記述します