web-dev-qa-db-ja.com

プログラムでブロックを配置するにはどうすればよいですか?

UIから、その方法でリージョンにブロックを追加できます。

  1. [管理]-> [構造]-> [ブロックレイアウト](/ admin/structure/block)に移動します。
  2. 地域名の横にある「ブロックを配置」ボタンをクリックします。

同じことをプログラムで行いたいと思います。既存のブロックをリージョンに追加して保存するにはどうすればよいですか?このブロックは、その領域に表示され、ブロックレイアウトページで使用できるようになります。

10
user3554770

プラグインブロックを提供するには、設定の配列を作成し、それを \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();
9
Shawn Conn

あなたは Twig Tweak モジュールを使用できます:

Twig Tweakモジュールは、Twig拡張機能を提供し、開発者のエクスペリエンスを改善できるいくつかの便利な関数とフィルターを備えています。

そして、あなたのtwigテンプレート領域:

{{ drupal_block('block_id') }}
7
rpayanm

ブロックの各インスタンス(「ブロックタイプ」、構成、および配置)は、構成エンティティ\Drupal\block\Entity\Blockです。したがって、必要なのは、このエンティティの新しいインスタンスを正しい詳細で作成することだけです。これで完了です。

これは実行できますが、クレイジーで複雑です。プラグインシステムを理解し、プラグインシステムをブロックする必要があります。

あなたは\Drupal\block\BlockForm::submitFormを見てこれの感触をつかむことができます\Drupal\simpletest\BlockCreationTrait::placeBlock。これが本当に必要なものである場合、ブロックの可視性がかなり複雑であるかどうかを検討する必要があります。

6
googletorp

私はD8を学習しているだけですが、プログラムでブロックを配置するはるかに簡単な方法を見つけたようです(googletorpの答えを読んだ後、それはかなり怖いようでした!)

ブロックを定義するカスタムモジュールを有効にすると、ブロックが自動的に正しい領域に配置されるようになりました。これを達成するために使用した手順は次のとおりです。

  1. モジュールを有効にし、UIを使用して/admin/structure/blockにブロックを配置します
  2. admin/config/development/configuration/single/exportの単一アイテム構成エクスポートページに移動します。
  3. 構成タイプブロックを選択し、構成名には、UIを使用して配置したブロックを選択し、生成されたコードをコピーします。
  4. モジュール内にフォルダ/config/install/を作成します
  5. 生成されたコードのtextareaの下に、使用する必要があるファイル名が表示されます。このファイルを/config/installディレクトリに作成し、そこにコードをコピーします。
  6. モジュールをアンインストールしてから再度有効にすると、ブロックが自動的に配置されます。
4
Felix Eve

私は Entity:Blockをプログラムで操作する方法をDrupal 8 に感謝します。

use Drupal\block\Entity\Block;

$block = Block::load('sitebranding');
$block->setRegion('content');
$block->save();
3
jmzea

上記の例は十分に近いですが、まだ正しくありません。アイデアは、ブロックインスタンスの独自の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と記述します

2
Nikolay Borisov