ブロックコンテンツを開発者から本番サイトに移行するにはどうすればよいですか?


24

私はついにDrupal 8を真剣に検討し始めました。特に構成管理に興味があります。少し問題があり、カスタムブロックコンテンツに関するものに出くわしました。

構成管理システムはブロック構成をエ​​クスポートできることがわかります-地域、テーマ、重み、可視性など。ただし、実際のブロックの内容は構成エクスポートでは発生しません。これは合理的で理解できます。

そのブロック構成を実稼働サイトにインポートすると、ブロック構成が作成され、保留メッセージが配置され、ブロックが壊れているか欠落していると報告されます。明らかに、ブロックコンテンツは運用サーバーに存在しません。

カスタムブロックを開発/ステージングサーバーから運用サーバーに移行するにはどうすればよいですか?Drupal 8のブロックはノードのようなフィールド化可能なエンティティであり、同じ方法で移行する必要があり、Drupal 8にはMigrate APIがあることを理解していますが、これはDrupal 6および7サイトからコンテンツを移行するために構築されているようですDrupal 8からDrupal 8のサイトではなく、Drupal 8。

この問題は、ビューなどの他のモジュールによって生成されたブロックが設定として明らかに移行するため、カスタムブロックに特に関連しています。

blocks  8 

デプロイモジュールとentitypilot.comなど、作品のいくつかのコンテンツのステージング・ソリューションがあります(免責条項は、それは私の物です)
larowlan

回答:


7

私がここで言及していない別の答えは、コアの「カスタムブロック」セットアップとほとんど同じであるシンプルブロックモジュールを使用することですが、コンテンツ+構成の奇妙なハイブリッドの代わりに、すべてのブロック設定とコンテンツがあります構成に保存され、きれいにエクスポートおよびインポートできます。

Drupal 8コアの詳細については、カスタムブロックを適切にエクスポートおよびインポートできないことを参照してください。


3

これを解決する寄稿モジュールを公開しました。基本的に、このモジュールは、カスタムブロック(コンテンツブロック)をラップする構成(固定ブロック)に基づいたタイプのブロックを提供します。コンテンツブロックが存在しない場合、デフォルトコンテンツで作成されます。デフォルトコンテンツが設定されていない場合は空になります。すべてはUIを介して行われ、特別なファイルやカスタムモジュールは必要ありません。

固定ブロックコンテンツと名付け、次の場所で公開されています。

https://www.drupal.org/project/fixed_block_content


1

開発の一環として追加されたコンテンツをライブにプッシュする別の方法は、デフォルトコンテンツモジュールを使用してコンテンツをエクスポートすることです。コンテンツがインストールプロファイルの「コンテンツ」フォルダーにエクスポートされるように構築され、有効になっている場合、モジュールはサイトのインストール時にコンテンツを自動的に取り込みますが、一度に1アイテムずつコンテンツをインポートすることも可能です、たとえば、更新フックのように、example.installまたはexample.profileに以下のコードを追加します。

<?php
/**
* Import a piece of content exported by default content module.
*/
function example_import_default_content($path_to_content_json) {
  list($entity_type_id, $filename) = explode('/', $path_to_content_json);
  $p = drupal_get_path('profile', 'guts');
  $encoded_content = file_get_contents($p . '/content/' . $path_to_content_json);
  $serializer = \Drupal::service('serializer');
  $content = $serializer->decode($encoded_content, 'hal_json');
  global $base_url;
  $url = $base_url . base_path();
  $content['_links']['type']['href'] = str_replace('http://drupal.org/', $url, $content['_links']['type']['href']);
  $contents = $serializer->encode($content, 'hal_json');
  $class = 'Drupal\\' . $entity_type_id . '\Entity\\' . str_replace(' ', '', ucwords(str_replace('_', ' ', $entity_type_id)));
  $entity = $serializer->deserialize($contents, $class, 'hal_json', array('request_method' => 'POST'));
  $entity->enforceIsNew(TRUE);
  $entity->save();
}

IDが8のカスタムブロックをエクスポートします。

drush dcer block_content 8

Drush設定でプロファイルパスを設定しない場合は、上記で指定する必要があります。)

次のように、example.installファイルで結果のエクスポートを使用します。

<?php
/**
* Add the footer block content.
*
* Implements hook_update_N().
*/
function example_update_8001() {
  example_import_default_content('block_content/136efd63-021e-42ea-8202-8b97305cc07f.json');
}

http://data.agaric.com/easily-add-content-update-hooks-use-default-content-module-exports-create-content-needs-be-sync-conf


0

ブロックはコンテンツと非常に絡み合っているため、複数の環境間でブロック構成を同期することの強力な利点を確認できません。

この理由は、タイトル/本文(コンテンツ)を持たないymlファイルから作成された新しいブロックがあり、そのため 'broken / missing'メッセージが表示されるためです。

開発用のblock_contentテーブルにあるUUID(両方の場所でブロックを作成したい場合は、マシン名が一致することを確認してください...)を作成してみてください(他の関係はエンティティを使用しているようです) id)。次に、設定の同期を行うと、ymlファイルの「差分の表示」が表示され、場合によっては本番uuidに一致させるためにdevで変更する必要があるものが表示される場合があります。このプロセスを実行するか、block_content、block_content__body、block_content_field_dataを使用して何らかの種類のデータベースブロック同期を作成しない限り、コード内のすべてのブロック構成を無視するのが最も簡単です。

あまりエレガントではありませんが、ブロック構成をコード内に保持できる可能性があります。それ以外の場合、configを使用してブロックを展開し続けると、ブロックは常に「破損または欠落」します。

別のブログ投稿では、ライブ環境でカスタムブロックを作成することを提案していますが、配置はしていません。データベースをdevに同期した後、カスタムブロックを構成し、構成をエクスポートできます。また、配置のライブインポートに既に存在するため、可能です。


0

同じ問題があり、実際にはソリューションではなく、追加のみがあります。共同開発では、リポジトリからプルしてすべての構成をリセットするステージングサーバーを使用しています。これは、ブロック構成がすべて自動でリセットされることを意味し、「コンテンツ」とみなされるブロックをそのサーバーに直接配置することはできません。

drush config-export syncを使用するのは簡単です。実行した内容を正確に把握し、構成の変更が展開用であることを確認してください。しかし、Drupalはブロックが構成であると判断します(明らかにブロックコンテンツはコンテンツとして処理されます)。したがって、これは設計上壊れているようです。

与えられた時間について、最も実用的な解決策は、ブロック関連のymlファイルを.gitignoreに追加することです。


1
Config Ignoreは.gitignoreよりも優れている可能性が高い:drupal.org/project/config_ignore
bdanin


0

これを処理する最善の方法は次のようになると思います:

これは私が普段使っている人のことで、個人的に使っています。ただし、ブロックコンテンツのみと比較して、データベース全体が同期されます。


データベースの上書きに問題がなければ、それは機能します。現在、新しいカスタムブロックを既存のデータベースに移動することが唯一の目的である場合、このメソッドの実装は困難です。
カロルス

理論的には、この答えには場所があります。しかし、実際には、特にプロジェクトが構成分割を使用している場合、または環境間で異なる構成を使用している場合(これは可能性が高い)、これは良い解決策ではありません。
-komlenic

0

Structure Syncモジュールをお試しください。

構造の同期は、構成と見なされるコンテンツを同期するためのDrushコマンドと管理インターフェイス画面を提供します。メニュー項目、カスタムブロック、分類用語など。

手順:

  1. 構造の同期に移動します。
  2. [ブロック]タブに移動します。
  3. 輸出する。
  4. 構成とコンテンツは構成フォルダーにエクスポートされます。
  5. 設定を他のサイトに持ち込んでインポートします。
  6. 構造の同期に移動し、インポートをクリックします。
  7. 完了
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.