Drupal: カスタムモジュールを用いて、コンテンツタイプとフィールドを追加する
概要
Drupalのカスタムモジュールを用いて、コンテンツタイプとフィールドを追加する方法の備忘録です。
以下の2つの記事が参考になりました。
Car Brandの例
先に紹介した一つ目の記事の通り進めると、コンテンツタイプ「Car Brand」、フィールド「body」を追加することができました。
なお、上記の記事ではカスタムモジュールの作成の部分がスキップされています。まずはじめに以下のようなフォルダ、およびファイルを作成します。
name: foobar
description: サンプルモジュール
package: Custom
type: module
version: 1.0
core_version_requirement: ^8 || ^9
独自のフィールドの追加
上記を参考に、コンテンツタイプを追加することができましたが、独自のフィールドを追加するには、Fieldに加えて、Field storageというものも追加する必要がありました。
このField storageのymlの記述方法がわからなかった際に、冒頭で紹介した2つ目のリンクである、以下の記事が参考になりました。
モジュール「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
# 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
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の情報だけ残ってしまいました。
以下の記事を参考にしました。
Field
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
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
# 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