Pseudo velden in Drupal 8 / 9

Wat zijn pseudo velden?

Pseudo velden zijn display-velden die je kunt gebruiken in de display instellingen van een entity type. Deze velden worden via een module aangemaakt en de inhoud wordt daar ook bepaald.

Waar kun je ze voor gebruiken?

Pseudo velden zijn ideaal wanneer je bepaalde inhoud of data wilt tonen bij een specifieke entity. Je kunt dit oplossen met vieze hacky code in een template of theme preprocess functie, maar met een pseudo veld heb je er meer controle over in de UI. Dit betekent dat je gebruik kunt blijven maken van de drag-and-drop functionaliteit om die zichtbaarheid en positie te bepalen ten opzichte van de andere entity velden.

Hoe werkt het?

Er zijn 2 hooks die gebruikt worden om een pseudo veldt te definiëren en te tonen. Allereerst moet hook_entity_extra_field_info() worden geïmplementeerd.

use Drupal\node\Entity\NodeType;

/**
* Implements hook_entity_extra_field_info().
*/
function my_module_entity_extra_field_info() {
  $extra = array();

  // All node types.
  foreach (NodeType::loadMultiple() as $bundle) {
    $extra['node'][$bundle->Id()]['display']['pseudo_veld'] = array(
      'label' => t('Pseudo field'),
      'description' => t('This is my own awesome pseudo-field'),
      'weight' => 100,
      'visible' => TRUE,
    );
  }

  return $extra;
}

Bovenstaand voorbeeld geldt voor alle node-typen, maar je kunt hier ook één node-bundle definiëren natuurlijk.

Met deze hook maken we een pseudo veld "Pseudo field" aan wat, na het legen van de cache, getoond wordt op de Weergave instellingen pagina van alle node-typen.

De tweede stap is er voor zorgen dat het veld ook daadwerkelijk iets toont. Hiervoor gebruik je hook_entity_view().

use \Drupal\Core\Entity\EntityInterface;
use \Drupal\Core\Entity\Display\EntityViewDisplayInterface;

/**
 * Implements hook_ENTITY_TYPE_view().
 */
function my_module_node_view(array &$build, EntityInterface $entity, EntityViewDisplayInterface $display, $view_mode) {
  if ($display->getComponent('pseudo_field')) {
      $build['pseudo_field'] = [
        '#type' => 'markup',
        '#markup' => 'This is my custom content',
    ];
  }
}

Hierbij gebruiken we de hook_ENTITY_TYPE_view() variant die toegepast wordt voor nodes. Binnen de functie kijken we via het EntityViewDisplayInterface display object of ons eerder gedefinieerde component bestaat binnen de weergave. Als dat zo is kunnen we de build array verrijken met onze eigen data.

back_blog