In the previous article we explained the syntax used to write Drupal migrations. As part of the field mapping explanation, we talked about how to set subfields. This is a topic we have covered early in the 31 days of Drupal migrations series. On both occasions, we mentioned that finding out which subfields are available for a field type might require some Drupal development knowledge. To make the process easier, in today’s article we are presenting a reference of subfields provided by core and contributed modules.
For each field type we will present: the module that provides it, its plugin ID and category, the class that defines it, the subfields available, and the default subfield if any. If a field has only one subfield, that will be its default. In some cases, there will be references to articles that cover migrating into those field types specifically.
As a refresher, if you want to find available subfields by yourself, you need to locate the class that provides the FieldType
plugin and inspect its schema
method. The latter defines the database columns used by the field to store its data. Because of object oriented practices, sometimes you need to look at the parent class to find all the subfields that are available. When migrating into subfields, you are actually migrating into those particular database columns. Any restriction set by the database schema needs to be respected.
Address field
Module: Address. Plugin ID: address
. Category: Address.
Class: DrupaladdressPluginFieldFieldTypeAddressItem
Related article: Migrating addresses into Drupal
Note: This field type does not have a default subfield.
List of subfields:
langcode
: The language code.country_code
: The two-letter country code as defined by the ISO 3166 standard.administrative_area
: The top-level administrative subdivision of the country (e.g., state or province).locality
: The locality (i.e. city).dependent_locality
: The dependent locality (i.e. neighbourhood).postal_code
: The postal or ZIP code. It will be validated againstadministrative_area
if validation patterns are available for that state or province.sorting_code
: The sorting code.address_line1
: The first line of the address block.address_line2
: The second line of the address block.organization
: The organization or company.given_name
: The first name.additional_name
: The middle name.family_name
: The last name.
Country field
Module: Address. Plugin ID: address_country
. Category: Address.
Class: DrupaladdressPluginFieldFieldTypeCountryItem
Related article: Migrating addresses into Drupal
Subfield: value
for the two-letter country code as defined by the ISO 3166 standard.
Zone field
Module: Address. Plugin ID: address_zone
. Category: Address.
Class: DrupaladdressPluginFieldFieldTypeZoneItem
Related article: Migrating addresses into Drupal
Subfield: value
for serialized version of a Zone object.
Boolean field
Module: Core library. Plugin ID: boolean
. Category: General.
Class: DrupalCoreFieldPluginFieldFieldTypeBooleanItem
Subfield: value
stores an integer number: 0 for FALSE and 1 for TRUE.
Number integer field
Module: Core library. Plugin ID: integer
. Category: Number.
Class: DrupalCoreFieldPluginFieldFieldTypeIntegerItem
Subfield: value
for the integer number.
Number float field
Module: Core library. Plugin ID: float
. Category: Number.
Class: DrupalCoreFieldPluginFieldFieldTypeFloatItem
Subfield: value
for the float number.
Number decimal field
Module: Core library. Plugin ID: decimal
. Category: Number.
Class: DrupalCoreFieldPluginFieldFieldTypeDecimalItem
Subfield: value
for the decimal number.
List integer field
Module: Options (Drupal core). Plugin ID: list_integer
. Category: Number.
Class: DrupaloptionsPluginFieldFieldTypeListIntegerItem
Subfield: value
for the integer number. It is one of the keys in the “Allowed values list” of the field’s setting.
List float field
Module: Options (Drupal core). Plugin ID: list_float
. Category: Number.
Class: DrupaloptionsPluginFieldFieldTypeListFloatItem
Subfield: value
for the float number. It is one of the keys in the “Allowed values list” of the field’s setting.
Text plain field
Module: Core library. Plugin ID: string
. Category: Text.
Class: DrupalCoreFieldPluginFieldFieldTypeStringItem
Subfield: value
for a short plain text. The maximum length is 255 characters unless a lower number is set in the field’s storage settings.
Text plain, long field
Module: Core library. Plugin ID: string_long
. Category: Text.
Class: DrupalCoreFieldPluginFieldFieldTypeStringLongItem
Subfield: value
for a long plain text.
List text field
Module: Options (Drupal core). Plugin ID: list_string
. Category: Text.
Class: DrupaloptionsPluginFieldFieldTypeListStringItem
Subfield: value
for the text. It is one of the keys in the “Allowed values list” of the field’s setting. The maximum length for a key is 255 characters.
Text formatted field
Module: Text (Drupal core). Plugin ID: text
. Category: Text.
Class: DrupaltextPluginFieldFieldTypeTextItem
Default subfield: value
List of subfields:
value
: A short text. It can include markup. The maximum length is 255 characters unless a lower number is set in the field’s storage settings.format
: A string containing the machine name of the text format to use. For example:plain_text
,full_html
,restricted_html
, andbasic_html
.
Text formatted, long field
Module: Text (Drupal core). Plugin ID: text_long
. Category: Text.
Class: DrupaltextPluginFieldFieldTypeTextLongItem
Default subfield: value
List of subfields:
value
: The text. It can include markup.format
: A string containing the machine name of the text format to use. For example:plain_text
,full_html
,restricted_html
, andbasic_html
.
Text formatted, long with summary field
Module: Text (Drupal core). Plugin ID: text_with_summary
. Category: Text.
Class: DrupaltextPluginFieldFieldTypeTextWithSummaryItem
Related article: Migrating formatted text
Default subfield: value
List of subfields:
value
: The full text. It can include markup.summary
: The summary text. It can include markup.format
: A string containing the machine name of the text format to use. For example:plain_text
,full_html
,restricted_html
, andbasic_html
.
Comments field
Module: Comment (Drupal core). Plugin ID: comment
. Category: General.
Class: DrupalcommentPluginFieldFieldTypeCommentItem
Subfield: status
stores an integer number that indicates whether comments are allowed on the entity: 0 = no, 1 = closed (read only), 2 = open (read/write).
Datetime field
Module: Datetime (Drupal core). Plugin ID: datetime
. Category: General.
Class: DrupaldatetimePluginFieldFieldTypeDateTimeItem
Related article: Migrating dates into Drupal
Subfield: value
for the datetime value. It is a string similar to 2020-01-15T07:03:21
.
If you decide to only store the date, the string will be similar to 2020-01-15
.
Datetime range field
Module: Datetime Range (Drupal core). Plugin ID: daterange
. Category: General.
Class: Drupaldatetime_rangePluginFieldFieldTypeDateRangeItem
Related article: Migrating dates into Drupal
Default subfield: value
List of subfields:
value
The start datetime value. It is a string similar to2020-01-15T07:03:21
.end
: The end datetime value. It is a string similar to2020-01-15T07:03:21
.
If you decide to only store the date, the string for both subfields will be similar to 2020-01-15
. If you decide to store all day, the value
string will be similar to 2020-01-15T05:00:00
and the end
string to 2020-01-17T04:59:59
.
Email field
Module: Core library. Plugin ID: email
. Category: General.
Class: DrupalCoreFieldPluginFieldFieldTypeEmailItem
Subfield: value
for the email address.
Link field
Module: Link (Drupal core). Plugin ID: link
. Category: General.
Class: DrupallinkPluginFieldFieldTypeLinkItem
Related article: Understanding the syntax of Drupal migrations
Default subfield: uri
List of subfields:
uri
: A string for the link’s URI.title
: A string for the link’s title.options
: A serialized array of options for the link.
Telephone number field
Module: Telephone (Drupal core). Plugin ID: telephone
. Category: Number.
Class: DrupaltelephonePluginFieldFieldTypeTelephoneItem
Subfield: value
for the telephone number. It is a string of 256 characters maximum. For example: +1 (508) 283-3557
or 1800-DRUPAL
.
Timestamp field
Module: Core library. Plugin ID: timestamp
. Category: General.
Class: DrupalCoreFieldPluginFieldFieldTypeTimestampItem
Subfield: value
for a UNIX timestamp value. It stores an integer in the range [-2147483648, 2147483648]. For example: 280299600. Note that the value can be negative.
Entity reference field including nodes, users, taxonomy terms, and media entities
Module: Core library. Plugin ID: entity_reference
. Category: Reference.
Class: DrupalCoreFieldPluginFieldFieldTypeEntityReferenceItem
Subfield: target_id
stores an integer representing the ID of the target entity: nid
, uid
, tid
, mid
, etc.
Entity reference file field
Module: File (Drupal core). Plugin ID: file
. Category: Reference.
Class: DrupalfilePluginFieldFieldTypeFileItem
Related article: Migrating files and images into Drupal
Default subfield: target_id
List of subfields:
target_id
: An integer representing the ID of the target entity.display
: An flag to control whether this file should be displayed when viewing content. Possible values are 0 and 1.description
: A description of the file.
Entity reference image field
Module: Image (Drupal core). Plugin ID: image
. Category: Reference.
Class: DrupalimagePluginFieldFieldTypeImageItem
Related articles: Migrating files and images into Drupal, Migrating images using the image_import plugin, and Migrating images using the image_import plugin
Default subfield: target_id
List of subfields:
target_id
: An integer representing the ID of the target entity.alt
: Alternative image text, for the image’s ‘alt’ attribute.title
: Image title text, for the image’s ‘title’ attribute.width
: The width of the image in pixels.height
: The height of the image in pixels.
Entity reference revisions field including paragraphs
Module: Core library. Plugin ID: entity_reference_revisions
. Category: Reference revisions.
Class: DrupalCoreFieldPluginFieldFieldTypeEntityReferenceItem
Related article: Introduction to paragraphs migrations in Drupal
Default subfield: target_id
List of subfields:
target_id
: An integer representing the ID of the target entity:nid
,uid
,tid
,fid
, etc.target_revision_id
: An integer representing the revision ID of the target entity.
Fields hidden from the user interface
Drupal core includes more field types that are hidden from the user interface. That is, it is not possible to add them from a content type’s “Manage fields” tab. For brevity, their subfields will not be listed. Instead, each will have a link to its definition class. There you can inspect the schema
method to obtain the list of subfields. As of this writing, the hidden fields are:
changed
provided by DrupalCoreFieldPluginFieldFieldTypeChangedItemcreated
provided by DrupalCoreFieldPluginFieldFieldTypeCreatedItemfile_uri
provided by DrupalfilePluginFieldFieldTypeFileUriItemlanguage
provided by DrupalCoreFieldPluginFieldFieldTypeLanguageItemmap
provided by DrupalCoreFieldPluginFieldFieldTypeMapItempassword
provided by DrupalCoreFieldPluginFieldFieldTypePasswordItempath
provided by DrupalpathPluginFieldFieldTypePathItemuri
provided by DrupalCoreFieldPluginFieldFieldTypeUriItemuuid
provided by DrupalCoreFieldPluginFieldFieldTypeUuidItem
Subfields for other contributed modules
There are hundreds of modules that provide new field types. It would be impractical to list all of them here. As mentioned before, you need to find a field type’s definition class to know which subfields are available. Contributed modules would have these classes in their /src/Plugin/Field/FieldType/
directory. The class itself will have the @FieldType
annotation. For reference, below is a list of some contributed field types:
- Color Field module provides ColorFieldType.
- Geofield module provides GeofieldItem.
- Google Map Field module provides GoogleMapFieldType.
- Name Field module provides NameItem.
- Office Hours module provides OfficeHoursItem.
- Physical Fields module provides DimensionsItem and MeasurementItem.
- Viewfield module provides ViewfieldItem.
What did you learn in today’s article? Did you know that there were so many field types in Drupal core? Were you aware that some core field types are hidden from the user interface? Did you know how to find subfields for field types from contributed modules? Please share your answers in the comments. Also, we would be grateful if you shared this article with your friends and colleagues.