カスタムモジュールのインストールを介して、組み込みのコンテンツタイプにカスタムフィールドと表示設定を追加するにはどうすればよいですか?


7

私はDrupalにかなり慣れていません。Wordpress開発から来ており、プラグインの一部をDrupal 8のモジュールに「変換」しようとしています。

新しいフィールドを追加しようとしているドキュメントに従っています。ノードに「price」と言います。私が見つけたすべてのドキュメントは、カスタムノードへのフィールドの追加に関連していますが、私の場合、それらのフィールドを通常の事前定義ノードに追加したいと思います。

頭に浮かぶ最初の質問は、YML構成ファイルまたはコードを使用してカスタムフィールドを作成できることです。

私はYMLでフィールドを作成し、それはdrupalによって認識されました。問題は、それらがノードに表示されないことです(手動でアクティブにする必要があります)。

私のモジュール/ config / install /に作成しました:

  • core.entity_form_display.node.article.default
  • core.entity_view_display.node.article.default

私は自分のフィールドを追加しますが、もちろん、モジュールをアクティブ化しようとすると、Drupalによってすでに定義されているため、モジュールは好きではありません。

これらのコアファイルを「拡張」する方法はありますか?YMLまたはコードでそれは可能ですか?

私はhttps://www.drupal.org/docs/8/api/entity-api/programming-custom-fields-into-your-content-typeをフォローしました。/ config / installにYMLファイルを作成しましたが、実際にフィールドが作成されました。問題は、カスタムノードタイプに関連していないため、ビューエンティティを「拡張」して表示エンティティを形成する方法がわからないことです。これらのファイル(core.entity_form_display.node.article.default core.entity_view_display.node.article.default)はすでにコアに存在しているため、事前に作成されたノードタイプにリンクされ、再定義できません。

このコメントに続いて、次のファイルを作成しました。

/config/install/field.field.node.article.field_price.yml

langcode: en
status: true
dependencies:
  config:
    - field.storage.node.field_price
    - node.type.article
id: node.article.field_price
field_name: field_price
entity_type: node
bundle: article
label: Price
description: 'Premium Price'
required: false
translatable: false
default_value: {  }
default_value_callback: ''
settings:
  min: 1
  max: 9999
  prefix: ''
  suffix: ''
field_type: integer

/config/install/field.storage.node.field_price.yml

langcode: en
status: true
dependencies:
  module:
    - node
id: node.field_price
field_name: field_price
entity_type: node
type: integer
settings:
  unsigned: false
  size: normal
module: core
locked: false
cardinality: 1
translatable: true
indexes: {  }
persist_with_no_fields: false
custom_storage: false

また、FieldFormatterとFieldWidgetを作成しました。(適切かどうかはわかりません。)

私が見つけたのは、モジュールがフィールド価格を作成していることです。/ admin / structure / types / manage / article / displayにアクセスすると、価格が表示されますが、[ 無効]の下にあります

ここに画像の説明を入力してください

私はとても近くにいるように感じますが、同時にとても迷っています。

そのフィールドをアクティブにするには何が欠けていますか?


hook_entity_type_alterはあなたが必要とすることをしますか?その名前が示すように、このフックを使用すると、既存のエンティティタイプの定義を変更できます。
Kevin Nowaczyk 2016

1
解答を自分で見つけた場合は、解答に追加して、承認済みとしてマークしてください。これは、他の人が解決策を見つけ、この質問が十分に解決されたことを確認するのに役立ちます。質問に答えを組み込まないでください。
leymannx 2016

次の内容のcore.entity_form_display.node。<modulename> .default.ymlファイルを使用して機能させました:
user2594712

回答:


7

初心者には、バックエンドでDrupalの便利なユーザーインターフェイスを使用することをお勧めします。管理ユーザーを作成し、ログインし、フィールドの追加を開始し、表示を変更し、並べ替えます。これらはすべて、インターフェースをクリックして実行します。

たとえば、https://example.com/admin/structure/types/manage/article/fieldsで既存の記事コンテンツタイプにカスタムフィールドを追加できます。ボタンがありますAdd fieldsそれをクリックして探索してください。組み込みコンテンツタイプにフィールドを追加しても違いはありません。

他の人が以前に言ったように、YMLはサイトをデプロイするときの構成のエクスポートとインポート用です。上級開発者の場合と同じように、コンピューターにローカルでそのページを作成し、バックエンドをクリックしていくつかのフィールドを追加し、それらの構成をエクスポートして、Gitリポジトリにプッシュし、ライブページでプルします。リポジトリから、設定ファイルをインポートし、同じフィールドを取得します。もう一度何もクリックする必要はありません。


カスタムモジュールからフィールドを追加するには、モジュール/config/installフォルダに特定のYMLを提供します。また、組み込みコンテンツタイプとカスタムコンテンツタイプの間に違いはありません。これは、DOのhttps://www.drupal.org/docs/8/api/entity-api/programming-custom-fields-into-your-content-typeでかなり説明されています。ただし、名前を変更する必要があり、特にbundle: car_brandフィールドを追加する(コンテンツタイプ)の値を変更する必要があります。

それとは別に、開発中にこのモジュールをかなり頻繁にインストールおよびアンインストールする必要がある場合があります。drushコマンドに慣れます。たとえばdrush dre module_name、ターミナル/コンソールでそれを行います(を使用するには、Develモジュールをインストールする必要がありますdrush dre)。あなた自身のために、UNIXベースのOS(LinuxまたはOSX)をすでに使用していることを願っています。おそらく、drush sql-cli < database.sql開発中に最初からやり直したいときに再インポートできる、常に新しいデータベースのバックアップを利用できます。


参考までに、削除された回答コードをここに貼り付けます。OPはもともと彼の質問に入れていました。最後に、コンテンツタイプOPでフィールドを使用できるようにするために、これが思い付きました。私は彼がこれをモジュールの*.installファイル呼び出しhook_install()またはに入れていたと思いますhook_update_N()。おそらく非推奨の関数ですが、そのアイデアは理解できると思います。

$entity_type         = 'node';
$bundle              = 'article';
$field['field_name'] = 'field_price'; // your field id

entity_get_form_display($entity_type, $bundle, 'default')
  ->setComponent($field['field_name'], array())
  ->save();

entity_get_display($entity_type, $bundle, 'default')
  ->setComponent($field['field_name'], array())
  ->save();

1
leymannxに感謝しますが、私が探しているのは、対話なしでそれを実行することです。私のモジュールをインストールするだけなので、実際に、プログラムで私のモジュールでそれを行う方法を探しています。方法はありますか?
Manuel Rodriguez

@ManuelRodriguezもちろんあります!私の答えを拡張します。
leymannx 2016

@leymannxに感謝します。これは私がフォローしていたドキュメントです。/ config / installにYMLファイルを作成しましたが、実際にフィールドが作成されています。問題は、ビューノードを「拡張」して表示エンティティを形成する方法がわからないことです。それら)それ以外の場合は、事前に作成されたノードタイプにリンクする必要があります。これらのファイル(core.entity_form_display.node.article.default core.entity_view_display.node.article.default)はコアに既に存在するため、再定義できません。ところで、ドラッシュチップをありがとう:)
マヌエルロドリゲス

@ManuelRodriguezコメントありがとうございます。これにより、質問がより明確になります。多分あなたはあなたの質問にその最後のコメントを含めることができます。
leymannx 2016

2
drush dreを使用するには、Develモジュールdrupal.org/project/devel
Adrian Cid Almaguer

4

Drupalの構成YMLファイルは、同じサイトのインスタンス間で構成を移植可能にし、バージョン管理を可能にするために、主にインポート/エクスポートを目的としています。これらは実際には開発ツールとして意図されたものではないため、経験豊富なDrupal開発者であっても、手動で作成することはお勧めしません。

ノードタイプがどのように定義されたかに関係なく、管理UIを通じてフィールドをフィールドに追加できるはずです。そのようにして、必要なすべてのデータを含む構成YMLを生成するために、構成エクスポートシステム(管理UIまたはコマンドラインでDrushを使用)を使用することをお勧めします。


1
回答ありがとうございます。この場合、インストール時にモジュールを使用してノードにフィールドを作成できるようにしたいのですが、ユーザーがフィールドを作成したり、フィールドを自分で管理したりしたくありません。それは可能ですか?
Manuel Rodriguez

ああ、分かった。その場合、ノードタイプが存在することを確認するためのロジックが必要であり、フィールドには存在しないため、YMLでは不十分だと思います。おそらく、モジュールにhook_installを実装し、プログラムでフィールドをノードに追加する必要があります。これはその方法を説明する投稿ですが、実際に機能するかどうかはテストしなかったため、回答には追加しません。
marcvangend 2016

3
エクスポートされた構成にフィールドがあることは問題ありませんが、そのIMHOに問題はありません。それらには明示的な依存関係があり、そのノードタイプが存在しない場合はインストールできません。ただし、フォーム/ビューの表示情報も必要です。これらはノードタイプとビュー/フォームモードごとに保存されるため、configとして提供するだけでなく、hook_install()を使用してコードとして追加する必要があります。たとえば、drupal.stackexchange.com / questions / 222260 /…を参照してください。
Berdir

2

core.entity_form_display.node.<modulename>.default.yml次の内容のファイルを使用して動作しました:

langcode: en
status: true
dependencies:
config:
  - field.field.node.modulename.body
  - node.type.modulename
module:
  - link
id: node.modulename.default
targetEntityType: node
bundle: modulename
mode: default
content:
  body:
    label: hidden
    type: string_textarea
    weight: 4
    settings:
      rows: 5
      placeholder: ''
    third_party_settings: {  }
    region: content
hidden:
  created: true
  path: true
  promote: true
  sticky: true
  uid: true
  body: true

1

@leymannxの答えが欠けているのは、カスタムモジュールに同梱できるものと、同梱できないものの説明です。

フィールドストレージはモジュールと一緒に出荷できます。

フィールドインスタンスはモジュールとともに出荷されますがoptional、コンテンツタイプを提供する他のモジュールに依存するため、としてのみ提供されます(モジュールがコンテンツタイプとフィールドの両方を提供する場合を除き、その場合はでのみ提供できますconfig/install)。ところで、これらのファイルはこのモジュールまたは他のモジュールのいずれかに保存できます。有効にすると、Drupalはconfig/optionalすべてのモジュールのすべてのディレクトリをスキャンして、関連する構成を取得します。https://www.drupal.org/node/2453919

エンティティフォームディスプレイはモジュールと一緒に出荷できません。さらに、モジュールがフィールドのみを提供する場合、エンティティ全体のエンティティフォームの表示を出荷すると、既存の構成が上書きされます。代わりに、モジュールには、hook_install()サポートされているすべてのコンテンツタイプのフォーム表示用にフィールドが変更される場所の実装を含める必要があります。

エンティティビューの表示は、エンティティフォームの表示と同じように扱う必要があります。

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