Adding a custom extra field to entity / node display

20 May · by Tim Kamanin · 2 min read

I had a case recently, where I needed to add custom data to the node display and wanted this data to behave like a field, however the data itself didn't belong to a field. By "behaving like a field" I mean you can that field at node display settings and able to control it's visibility, label and weight by dragging and dropping that field. So, as you may have undestood, hook_preprocess_node / node_view_alter approach alone wasn 't enough. But we do Drupal right? Then there should be a clever way to do what we want and it is here: hook_field_extra_fields() comes for help! hook_field_extra_fields() (docs: https://api.drupal.org/api/drupal/modules!field!field.api.php/function/hook_field_extra_fields/7) exposes "pseudo-field" components on fieldable entities. Neat! Here's how it works, let's say we want to expose a welcoming text message as a field for a node, here's how we do that:

/**
 * Implements MODULE_NAME_field_extra_fields().
 */
function hook_field_extra_fields() {
  $extra['node']['article']['display']['welcome_message'] = array(
'label' => t('Welcome message'),
'description' => t('A welcome message'),
'weight' => 0,
  );
  return $extra;
}

As you see in example above, we used hook_field_extra_fields() to define an extra field for an enity type of 'node' and 'article' bundle (content type). You can actually choose any other type of entity that's available on your system (think user, taxonomy_term, profile2, etc). Now if you'll clear your cache and go to display settings for Node -> Article you should see 'A welcome message' field available. Ok the last bit is to actually force our "extra" field to output some data, we do this in hook_node_view :

/**
 * Implements hook_node_view().
 */
function MODULE_NAME_node_view($node, $view_mode, $langcode) {
  // Only show the field for node of article type
  if ($node->type == 'article') {
$node->content['welcome_message'] = array(
  '#markup' => 'Hello and welcome to our Drupal site!',
);
  }
}

That should be all. Now you should see a welcome message on your node oage. Please note, if you're adding an extra field to another entity type (like, taxonomy_term for example), you should do the last bit in this entity's _view() hook.

UPDATE: I put code snippets for this tutorial at dropbucket.org here: http://dropbucket.org/node/1398

Comments

Required for comment verification



Moshe Weitzman

The markup module appears to solve this need - https://www.drupal.org/project/markup

Reply · 1 year, 3 months ago
Ted Bowman

Nice tutorial! Another thing to note is that if you want the settings the user has set on Manage Display to work you should use field_extra_fields_get_display https://api.drupal.org/api/drupal/modules!field!field.module/function/field_extra_fields_get_display/7 to check if the user has set the field to be visible.

You can see an example of calling this function in core by looking at taxonomy_term_build_content https://api.drupal.org/api/drupal/modules!taxonomy!taxonomy.module/function/taxonomy_term_build_content/7 If you don't want the user to have control on Manage Display then you should just implement hook_node_view and NOT hook_field_extra_fields.

Reply · 2 years, 9 months ago
Vensires

I would also recommend reading the article found in http://www.vdmi.nl/blog/attach-extra-or-pseudo-fields-any-entity-drupal where the poster uses the configuration set from the UI in order to display or hide each field accordingly as a more general solution.

Reply · 2 years, 9 months ago
lmeurs

Thanks for the code examples, but they seem to not work since hook_field_extra_fields() needs to define the extra fields for form or display. The code:

  $extra['node']['article']['welcome_message'] = array(

should become something like:

  $extra['node']['article']['display']['welcome_message'] = array(

See https://api.drupal.org/api/drupal/modules!field!field.api.php/function/hook_field_extra_fields/7

Reply · 3 years, 7 months ago
Pari

Nice tutorial, as alternative you can use Display Suite and custom field.

Reply · 3 years, 7 months ago