🎃

Drupal: カスタムモジュールを用いて、コンテンツタイプとフィールドを追加する

2023/04/21に公開

概要

Drupalのカスタムモジュールを用いて、コンテンツタイプとフィールドを追加する方法の備忘録です。

以下の2つの記事が参考になりました。

https://www.drupal.org/docs/drupal-apis/entity-api/creating-a-custom-content-type-in-drupal-8

https://www.digitalnadeem.com/drupal/how-to-create-content-type-fields-and-view-while-installing-custom-module-in-drupal-9-using-configuration-manager/

Car Brandの例

先に紹介した一つ目の記事の通り進めると、コンテンツタイプ「Car Brand」、フィールド「body」を追加することができました。

なお、上記の記事ではカスタムモジュールの作成の部分がスキップされています。まずはじめに以下のようなフォルダ、およびファイルを作成します。

/home/bitnami/stack/drupal/modules/custom/foobar/foobar.info.yml
name: foobar
description: サンプルモジュール
package: Custom
type: module
version: 1.0
core_version_requirement: ^8 || ^9

独自のフィールドの追加

上記を参考に、コンテンツタイプを追加することができましたが、独自のフィールドを追加するには、Fieldに加えて、Field storageというものも追加する必要がありました。

このField storageのymlの記述方法がわからなかった際に、冒頭で紹介した2つ目のリンクである、以下の記事が参考になりました。

https://www.digitalnadeem.com/drupal/how-to-create-content-type-fields-and-view-while-installing-custom-module-in-drupal-9-using-configuration-manager/

モジュール「Configuration Manager」を使うことで、すでに登録済みのFieldやField storageの定義内容を確認することができました。

上記を踏まえて、IIIF Mediaというコンテンツタイプを作成して、iiif_image_urlという文字列を格納するフィールドと、iiif_image_widthとiiif_image_heightという数値を格納するフィールドを作成してみます。以下のようなファイルが必要です。

コンテンツタイプ

modules/custom/foobar/config/install/node.type.iiif_media.yml

/home/bitnami/stack/drupal/modules/custom/foobar/config/install/node.type.iiif_media.yml
# node.type.iiif_media.yml
langcode: en
status: true
dependencies:
  enforced:
    module:
      - foobar # This is the name of the module we're using for this example
name: 'IIIF Media'
type: iiif_media
description: 'Content type for IIIF Media'
help: ''
new_revision: false
preview_mode: 1
display_submitted: true

フィールド:iiif_image_url(string)

Field storage

modules/custom/foobar/config/install/field.storage.node.field_iiif_image_url.yml

/home/bitnami/stack/drupal/modules/custom/foobar/config/install/field.storage.node.field_iiif_image_url.yml
langcode: en
status: true
dependencies:
  enforced:
    module:
      - foobar
id: node.field_iiif_image_url
field_name: field_iiif_image_url
entity_type: node
type: string
settings:
  max_length: 255
  case_sensitive: false
  is_ascii: false
module: core
locked: false
cardinality: 1
translatable: true
indexes: {  }
persist_with_no_fields: false
custom_storage: false

なお、注意点として、dependencies > enforced > module > {モジュール名} を設定することで、アンイストール時に、当該storageも削除してくれるようです。これがないと、storageの情報だけ残ってしまいました。

以下の記事を参考にしました。

https://www.drupal.org/project/drupal/issues/3231028

Field

modules/custom/foobar/config/install/field.field.node.iiif_media.field_iiif_image_url.yml

/home/bitnami/stack/drupal/modules/custom/foobar/config/install/field.field.node.iiif_media.field_iiif_image_url.yml
# field.field.node.iiif_media.field_iiif_image_url.yml
langcode: en
status: true
dependencies:
    config:
        - field.storage.node.field_iiif_image_url
        - node.type.iiif_media
id: node.iiif_media.field_iiif_image_url
field_name: field_iiif_image_url
entity_type: node
bundle: iiif_media
label: IIIF Image URL
description: ''
required: false
translatable: false
default_value: {  }
default_value_callback: ''
settings: {  }
field_type: string

フィールド:iiif_image_width(integer)

Field storage

modules/custom/foobar/config/install/field.storage.node.field_iiif_image_width.yml

/home/bitnami/stack/drupal/modules/custom/foobar/config/install/field.storage.node.field_iiif_image_width.yml
langcode: en
status: true
dependencies:
  enforced:
    module:
      - foobar
id: node.field_iiif_image_width
field_name: field_iiif_image_width
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

Field

modules/custom/foobar/config/install/field.field.node.iiif_media.field_iiif_image_width.yml

/home/bitnami/stack/drupal/modules/custom/foobar/config/install/field.field.node.iiif_media.field_iiif_image_width.yml
# field.field.node.iiif_media.field_iiif_image_width.yml
langcode: en
status: true
dependencies:
    config:
        - field.storage.node.field_iiif_image_width
        - node.type.iiif_media
id: node.iiif_media.field_iiif_image_width
field_name: field_iiif_image_width
entity_type: node
bundle: iiif_media
label: IIIF Image Width
description: ''
required: false
translatable: false
default_value: {  }
default_value_callback: ''
settings:
  min: null
  max: null
  prefix: ''
  suffix: ''
field_type: integer

まとめ

結果、カスタムモジュール「foobar」をインストールすることにより、以下のように、IIIF Mediaというコンテンツタイプを作成し、Field typeが文字列と数字のフィールドを追加することができました。

カスタムモジュールを用いたコンテンツタイプとフィールドの追加に関して、参考になりましたら幸いです。

Discussion