←Terug naar het blog

Hoe pseudo-velden te maken in Drupal met 2 hooks

2023-03-04‱3 min leestijd

Wat zijn pseudo-velden?

In Drupal zijn pseudo-velden velden die geen gegevens in de database opslaan, maar dynamisch inhoud genereren. Pseudo-velden stellen sitebouwers en ontwikkelaars in staat om aangepaste inhoud toe te voegen aan entiteiten (zoals nodes, gebruikers en taxonomie-termen) zonder dat er een apart veld voor hoeft te worden aangemaakt.

Pseudo-velden gedragen zich in veel opzichten als reguliere velden. In plaats van gegevens in de database op te slaan, gebruiken ze echter een callback-functie om hun inhoud te genereren wanneer de entiteit wordt bekeken.

Hoe pseudo-velden te maken?

Op Drupal 8, 9, 10

Door hook_ENTITY_TYPE_view() te gebruiken in combinatie met hook_entity_extra_field_info(), kunt u aangepaste pseudo-velden definiëren en precies specificeren hoe deze moeten worden weergegeven wanneer de entiteit wordt getoond.

In het volgende voorbeeld voegen we een pseudo-veld toe aan een paragraaf-entiteitstype dat een Google Classroom deelknop zal weergeven waar de paragraaf ook wordt gebruikt. Het veld verschijnt in 'Manage display' als de velden die in de entiteit zijn aangemaakt.

Het Drupal pseudo-veld verschijnt in de lijst met velden op het tabblad 'Manage display'.

Het recept

Zorg ervoor dat u de volgende twee regels bovenaan het bestand toevoegt.

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

Definieer in het my_module.module-bestand van uw aangepaste module het pseudo-veld met de functie hook_entity_extra_field_info():

/**
 * Implements hook_entity_extra_field_info().
 */
function MY_MODULE_entity_extra_field_info() {
  $display_fields = [];

  $display_fields['paragraph']['google_classroom_button']['display']['google_classroom_button'] = [
    'label' => t('Google Classroom knop'),
    'description' => t('Toont de Google Classroom knop'),
    'weight' => 100,
    'visible' => TRUE,
  ];

  return $display_fields;
}

In dit voorbeeld definiëren we een pseudo-veld genaamd google_classroom_button voor het paragraph-entiteitstype en de bundel google_classroom_button.

Als u het veld wilt toevoegen aan een contenttype, moet u het woord paragraph vervangen door node en google_classroom_button door de naam van uw contenttype in de bovenstaande code.


/**
 * Implements hook_ENTITY_TYPE_view().
 */
function MY_MODULE_paragraph_view(array &$build, EntityInterface $entity, EntityViewDisplayInterface $display) {


  if ($display->getComponent('google_classroom_button')) {
    $currentUrl = Url::fromRoute('<current>',[] , ['absolute' => 'true'])->toString();
    $output = '<script src="https://apis.google.com/js/platform.js" async defer></script>';
    $output .= '<div class="g-sharetoclassroom" data-size="64" data-url="' . $currentUrl . '" ></div>';
    $build['google_classroom_button'] = [
      '#type' => 'markup',
      '#markup' => $output,
      '#allowed_tags' => ['script', 'div'],
    ];
  }
}

De bovenstaande code controleert of de component "google_classroom_button" is toegevoegd aan de weergaveconfiguratie van de paragraaf-entiteit. Zo ja, dan genereert het een aangepaste uitvoer voor het "google_classroom_button" pseudo-veld.

Gebruiksscenario's van pseudo-velden

  • Weergeven van berekende waarden of aggregaten (zoals het aantal reacties op een node)
  • Insluiten van inhoud uit andere bronnen (zoals YouTube-video's of social media feeds)
  • Weergeven van aangepaste markup of HTML (zoals een lijst met gerelateerde inhoud)

Laatste gedachten

  • Dit is een snelle manier om extra informatie in een entiteit te krijgen zonder twig-templates te hoeven gebruiken.
  • Het pseudo-veld zal niet beschikbaar zijn bij het maken van een view voor de entiteit.

Categorieën: