Custom Field

A flexible multi-value field type that stores multiple sub-fields in a single database table, providing a high-performance alternative to Paragraphs and entity references.

custom_field
1,648 sites
115
drupal.org

Install

Drupal 11, 10 v4.0.3
composer require 'drupal/custom_field:^4.0'

Overview

Custom Field is a Drupal module that allows you to create dynamic, multi-value fields with extensive widget and formatter plugin support. Unlike traditional approaches that require entity references or Paragraphs, Custom Field stores all data in a single database table, resulting in significant performance improvements by eliminating unnecessary joins and reducing configuration complexity.

The module provides a comprehensive plugin system for field types, widgets, and formatters, enabling developers to extend functionality easily. Each custom field can contain multiple columns (sub-fields) of different types, all stored efficiently in one table. This approach is ideal for use cases where you need structured, multi-value data without the overhead of separate entities.

Custom Field integrates with many popular Drupal modules including Feeds, Search API, GraphQL Compose, JSON:API, Linkit, Media Library, Entity Browser, and the AI module, making it a versatile choice for complex content architectures.

Features

  • Multiple-value fields stored in a single database table without entity references for optimal performance
  • 26 built-in sub-field types including string, text, integer, float, decimal, boolean, email, telephone, URI, link, datetime, daterange, time, time range, duration, file, image, color, map (key-value), entity reference, UUID, and viewfield
  • 39 widget plugins for sub-fields including text, textarea, select, radios, checkboxes, autocomplete, date pickers, color boxes, file uploads, and media library integration
  • 6 main field formatters: Default (custom theme hook), Inline, HTML List, Table, Flipped Table, and Custom Template with token support
  • CSS flexbox-based layout system for inline widget arrangement with responsive breakpoints
  • Clone field settings from any existing custom field on any entity type
  • Add or remove columns to fields with existing data through Drush commands or programmatically
  • Sub-field level translation support with content translation integration
  • Complete Views integration with custom filters, sorts, and argument handlers
  • Token support for all sub-fields with basic and advanced token replacement options
  • Feeds integration for importing data into custom fields
  • Comprehensive validation constraints for links, time values, and other field types

Use Cases

Product Specifications

Create a custom field with sub-fields for weight, dimensions, material, color, and price. Display as a table formatter for product specification sheets. Eliminates the need for separate fields or Paragraphs for each specification.

Event Information

Use daterange sub-field with timezone support, combined with location (string), ticket URL (link), and price (decimal) sub-fields. The flexbox widget arranges these inline, while the table formatter creates a clean event listing.

Contact Information Cards

Combine name (string), email (email), phone (telephone), website (link), and photo (image) sub-fields. Use the inline formatter for compact display or the default formatter with custom theming for styled contact cards.

Address Components

Store street, city, state, postal code, and country as separate sub-fields with appropriate validation. Clone settings across content types for consistency. More efficient than Address module for simple use cases.

Media Gallery Metadata

Attach metadata to media items using image sub-field with caption (string_long), photographer (entity_reference to users), date taken (datetime), and location (map for coordinates).

Replacing Paragraphs for Simple Structures

For repeated structured data like team member profiles, FAQ items, or feature lists, custom fields provide better performance than Paragraphs by eliminating entity overhead and simplifying queries.

API Data Storage

Store structured API response data using map sub-fields, combined with timestamp, status, and reference fields. The JSON:API submodule ensures proper serialization for headless implementations.

Tips

  • Use the 'Clone settings from' feature when creating new custom fields to copy configuration from existing fields, saving significant setup time.
  • For best performance with large datasets, prefer custom fields over Paragraphs when you don't need the full entity features like revisions or moderation.
  • The Custom Template formatter with token support provides Views-like rewrite functionality without the overhead of a View.
  • Use the Drush commands (cf-add-column, cf-remove-column) to safely modify field structure on fields with existing data - the commands preserve data automatically.
  • Enable 'Check empty' on sub-fields that should trigger row removal when empty, preventing partially filled multi-value items.
  • The flexbox widget with column settings allows creating form layouts similar to inline entity form without additional modules.
  • For entity references to media, enable the custom_field_media submodule to get full Media Library integration.
  • Use the hierarchical select widget and formatter for taxonomy terms to display and select terms with their full hierarchy path.

Technical Details

Hooks 2
hook_custom_field_link_attributes_alter

Allows modules to alter available link attributes

hook_custom_field_tags_alter

Allows modules to alter available HTML wrapper tags

Drush Commands 2
drush custom_field:add-column

Interactively add a new column (sub-field) to an existing custom field with data preservation

drush custom_field:remove-column

Interactively remove a column (sub-field) from an existing custom field