UIから、その方法でリージョンにブロックを追加できます。
- [管理]-> [構造]-> [ブロックレイアウト](/ admin / structure / block)に移動します。
- 地域名の横にある「ブロックを配置」ボタンをクリックします。
同じことをプログラムで行いたいと思います。既存のブロックをリージョンに追加して保存するにはどうすればよいですか?このブロックは、その領域に表示され、ブロックレイアウトページで使用できるようになります。
UIから、その方法でリージョンにブロックを追加できます。
同じことをプログラムで行いたいと思います。既存のブロックをリージョンに追加して保存するにはどうすればよいですか?このブロックは、その領域に表示され、ブロックレイアウトページで使用できるようになります。
回答:
プラグインブロックを提供するには、設定の配列\Drupal\block\Entity\Block::create()
を作成し、それを渡してBlockオブジェクトを作成し、インスタンスを保存します。
たとえば、Devel Execute 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();
id
それがユニークである限りあなたが好きなものに名前を付けることができると信じています。たとえば、あなたはその中にモジュールの名前でそれを起動する場合があります。
Twig tweakモジュールを使用できます:
Twig Tweakモジュールは、開発者のエクスペリエンスを向上させることができるいくつかの便利な関数とフィルターを備えた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
ディレクトリに作成し、そこにコードをコピーします。Drupal 8でプログラムによってEntity:Blockを操作する方法のおかげで答えを見つけました。
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と記述します