web-dev-qa-db-ja.com

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

私は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にアクセスすると、価格が表示されますが、Disabled未満です。

enter image description here

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

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

7

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

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

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


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

それとは別に、開発中にかなり頻繁にこのモジュールをインストールおよびアンインストールする必要がある場合があります。 drushコマンドに慣れます。たとえば、ターミナル/コンソールでこれを行うには_drush dre module_name_です(_drush dre_を使用するには Devel モジュールをインストールする必要があります)。あなた自身のために、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();
_
7
leymannx

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

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

4
marcvangend

次の内容の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
2
user2594712

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

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

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

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

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

1
Alex Skrypnyk