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: Drupal\address\Plugin\Field\FieldType\AddressItem
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 against `administrative_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: Drupal\address\Plugin\Field\FieldType\CountryItem
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: Drupal\address\Plugin\Field\FieldType\ZoneItem
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: Drupal\Core\Field\Plugin\Field\FieldType\BooleanItem
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: Drupal\Core\Field\Plugin\Field\FieldType\IntegerItem
Subfield: `value` for the integer number.
Number float field
Module: Core library. Plugin ID: `float`. Category: Number.
Class: Drupal\Core\Field\Plugin\Field\FieldType\FloatItem
Subfield: `value` for the float number.
Number decimal field
Module: Core library. Plugin ID: `decimal`. Category: Number.
Class: Drupal\Core\Field\Plugin\Field\FieldType\DecimalItem
Subfield: `value` for the decimal number.
List integer field
Module: Options (Drupal core). Plugin ID: `list_integer`. Category: Number.
Class: Drupal\options\Plugin\Field\FieldType\ListIntegerItem
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: Drupal\options\Plugin\Field\FieldType\ListFloatItem
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: Drupal\Core\Field\Plugin\Field\FieldType\StringItem
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: Drupal\Core\Field\Plugin\Field\FieldType\StringLongItem
Subfield: `value` for a long plain text.
List text field
Module: Options (Drupal core). Plugin ID: `list_string`. Category: Text.
Class: Drupal\options\Plugin\Field\FieldType\ListStringItem
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: Drupal\text\Plugin\Field\FieldType\TextItem
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`, and `basic_html`.
Text formatted, long field
Module: Text (Drupal core). Plugin ID: `text_long`. Category: Text.
Class: Drupal\text\Plugin\Field\FieldType\TextLongItem
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`, and `basic_html`.
Text formatted, long with summary field
Module: Text (Drupal core). Plugin ID: `text_with_summary`. Category: Text.
Class: Drupal\text\Plugin\Field\FieldType\TextWithSummaryItem
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`, and `basic_html`.
Module: Comment (Drupal core). Plugin ID: `comment`. Category: General.
Class: Drupal\comment\Plugin\Field\FieldType\CommentItem
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: Drupal\datetime\Plugin\Field\FieldType\DateTimeItem
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: Drupal\datetime_range\Plugin\Field\FieldType\DateRangeItem
Related article: Migrating dates into Drupal
Default subfield: `value`
List of subfields:
- `value` The start datetime value. It is a string similar to `2020-01-15T07:03:21`.
- `end`: The end datetime value. It is a string similar to `2020-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: Drupal\Core\Field\Plugin\Field\FieldType\EmailItem
Subfield: `value` for the email address.
Link field
Module: Link (Drupal core). Plugin ID: `link`. Category: General.
Class: Drupal\link\Plugin\Field\FieldType\LinkItem
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: Drupal\telephone\Plugin\Field\FieldType\TelephoneItem
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: Drupal\Core\Field\Plugin\Field\FieldType\TimestampItem
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: Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem
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: Drupal\file\Plugin\Field\FieldType\FileItem
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: Drupal\image\Plugin\Field\FieldType\ImageItem
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: Entity Reference Revisions. Plugin ID: `entity_reference_revisions`. Category: Reference revisions.
Class: Drupal\entity_reference_revisions\Plugin\Field\FieldType\EntityReferenceRevisionsItem
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 Drupal\Core\Field\Plugin\Field\FieldType\ChangedItem
- `created` provided by Drupal\Core\Field\Plugin\Field\FieldType\CreatedItem
- `file_uri` provided by Drupal\file\Plugin\Field\FieldType\FileUriItem
- `language` provided by Drupal\Core\Field\Plugin\Field\FieldType\LanguageItem
- `map` provided by Drupal\Core\Field\Plugin\Field\FieldType\MapItem
- `password` provided by Drupal\Core\Field\Plugin\Field\FieldType\PasswordItem
- `path` provided by Drupal\path\Plugin\Field\FieldType\PathItem
- `uri` provided by Drupal\Core\Field\Plugin\Field\FieldType\UriItem
- `uuid` provided by Drupal\Core\Field\Plugin\Field\FieldType\UuidItem
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.