web-dev-qa-db-ja.com

プログラムで特定のテーマのすべてのブロックを新しいテーマの同じ領域にコピーするにはどうすればよいですか?

コアをハッキングせずにカスタマイズを追加できるように、管理テーマをコアテーマ(7つ)からカスタムサブテーマに切り替えたいと思います。

新しいサブテーマをインストールすると、すべてのブロック配置設定が作成され、ヘッダーまたはコンテンツが残ります。 2つのテーマ間のリージョンを変更していません。7つのテーマから現在のテーマにすべてのブロックをコピーしたいだけです。ブロックプラグインマネージャー(plugin.manager.block)しかし、どのブロックを編集するかわかりません。古いテーマからすべてのブロックのリストを取得し、すべての配置をプログラムで新しいテーマにコピーする方法を知りたいです。

関連するブロック構成をエ​​ンティティクエリし、 Block::createDuplicateBlock() を使用してクローンエンティティオブジェクトを作成してから、新しいブロック構成をサブテーマ領域に保存する前にサブテーマクローンを変更します。

例えば:

$block_ids = \Drupal::entityQuery('block')->condition('theme', 'my_base_theme')->condition('region','my_region')->execute();
foreach ($block_ids as $block_id) {
  $parent_block = \Drupal\block\Entity\Block::load($block_id);

  $new_id = str_replace('my_base_theme', 'my_sub_theme', $parent_block->get('id'));
  $child_block = $parent_block->createDuplicateBlock($new_id, 'my_sub_theme');
  // @TODO: set other properties that might need to be unique to this new theme's block

  $child_block->save();
}
2
Shawn Conn

私はこれを以前にやったことがありますが、それはしばらくの間です。まず、リージョンが2つのテーマ間で一致していることを確認します。これは私がやったことだと思います:

  • 設定をエクスポート:
$ drush cex
  • テキストエディタを使用して、block.block...で始まるすべての構成ファイルを見つけます。

  • 一括検索theme: sevenを実行し、theme: subthemeに置き換えます。

  • 更新された各構成ファイルからuuid: ...行を削除します。

  • インポート構成:

drush cim
1
Isaiah Nixon