How to create a pseudo-field(field extras) in Drupal

Last updated on 02/08/2018

An extra field allows you to create a managed field with custom content.

First of all we need to define our extra field.

/**
 * Implements hook_entity_extra_field_info().
 */
function hook_entity_extra_field_info() {
  $extra = [];
 
  $extra['node']['MY_NODE_TYPE']['display']['MY_CUSTOM_FIELD_KEY'] = [
    'label' => t('My pseudo field'),
    'description' => t('My pseudo field description.'),
    'weight' => 0,
    'visible' => TRUE,
  ];
 
  return $extra;
}

And then just populate some value on hook_node_view()

/**
 * Implements hook_ENTITY_TYPE_view().
 */
function hook_node_view(array &$build, \Drupal\Core\Entity\EntityInterface $entity, \Drupal\Core\Entity\Display\EntityViewDisplayInterface $display, $view_mode) {
  if ($display->getComponent('MY_CUSTOM_FIELD_KEY')) {
    $build['MY_CUSTOM_FIELD_KEY'] = [
      '#markup' => 'This is my custom content',
    ];
  }
}

Drupal 7 example

/**
 ** Implements hook_field_extra_fields().
 **/
function hook_field_extra_fields() {
  $extra['node']['MY_NODE_TYPE']['display']['MY_CUSTOM_FIELD_KEY'] = array(
    'label' => t('My pseudo field'),
    'description' => t('My pseudo field description.'),
    'weight' => 0,
  );
  return $extra;
}
 
/**
 ** Implements hook_node_view().
 **/
function hook_node_view($node, $view_mode, $langcode) {
  // Get all extra fields for current node.
  $extra_fields = field_info_extra_fields('node', $node->type, 'display');
  // Managed by display mode configuration.
  if (!empty($extra_fields['MY_CUSTOM_FIELD_KEY']['display'][$view_mode]['visible'])) {
    $node->content['MY_CUSTOM_FIELD_KEY'] = array(
      '#markup' => 'This is my custom content',
    );
  }
}