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


10

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

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

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


ブロックを作成した後、次の場所
Crazyrubixfan

「リージョンにブロックを割り当てる」と間違って入力したと思います。
cilefen

@IcecreamJelly私がやろうとしているのは、これをプログラムで行うことです。cilefen、はい、それが私の意味です%-)
jmzea

@ShawnConnありがとう、それは似ていますが、完全に同じではありません。どこかで答えを見つけました。
jmzea

回答:


9

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

こんにちは、助けが必要です。UIを使用してカスタムブロックを作成し、テスト目的でプログラムによってフッター領域に配置したいと考えています。UIで作成されたカスタムブロックからプラグインを取得する方法がわかりません。おかげで
Mudassar Ali

これを別の質問として尋ねてください。コメントは質問をするためのものではありません。
Shawn Conn


ここにidとは?ブロック名と同じですか?
Crazyrubixfan 2017年

@RubberDuckIsKing私はあなたがidそれがユニークである限りあなたが好きなものに名前を付けることができると信じています。たとえば、あなたはその中にモジュールの名前でそれを起動する場合があります。
Parag

7

Twig tweakモジュールを使用できます:

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

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

{{ drupal_block('block_id') }}

このソリューションの問題は、小枝を微調整する場合でも、ブロックを配置してから「無効」にする必要があることです。
レキシカント

6

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

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

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


4
多分視界条件は別として、それほど複雑ではないと思います。\ Drupal \ simpletest \ BlockCreationTrait :: placeBlock()はおそらくより良い例です。エクスポートした構成ファイルをインポートすることもできます。
Berdir

@Berdirテスト特性へのリンクをありがとう、それを追加しました。Drupal 8はまだ非常に若いので、多くの人々はプラグインシステムについて多くを知らず、ドキュメントはより多くのユースケースなどを使用する可能性があります。
googletorp

フェリックスイブが最良の答えを持っています。それはクレイジーな複雑ではありません。
Kratos

@kratos Felixが提供した答えは、「プログラムで」ブロックを配置する方法の問題を実際に解決するのではなく、代わりに構成ファイルを使用します。構成は、drush、構成同期インターフェース、またはモジュールのインストールを介してのみインポートできます。実行中に、セクションフロントページノードタイプのfx post saveなどが発生する必要がある場合、この戦略を使用しても意味がありません:)
googletorp

4

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

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

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

これを他の開発者や環境で機能させるためにUUIDを削除する必要はありませんか?
powpow12

はい、UUIDを削除することをお勧めします。
Felix Eve

また、これらのタスクの一部を自動化するの世話をするDrupalのコンソールを、使用することができますhechoendrupal.gitbooks.io/drupal-console/content/en/commands/...
ボー


2

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.