Zurück zum Blog

Wie man Pseudo-Felder in Drupal mit 2 Hooks erstellt

2023-03-043 Min Lesezeit

Was sind Pseudo-Felder?

In Drupal sind Pseudo-Felder Felder, die keine Daten in der Datenbank speichern, sondern Inhalte dynamisch im laufenden Betrieb generieren. Pseudo-Felder ermöglichen es Website-Erstellern und Entwicklern, benutzerdefinierte Inhalte zu Entitäten (wie Nodes, Benutzern und Taxonomie-Begriffen) hinzuzufügen, ohne dafür ein separates Feld erstellen zu müssen.

Pseudo-Felder verhalten sich in vielerlei Hinsicht wie normale Felder. Anstatt Daten in der Datenbank zu speichern, verwenden sie jedoch eine Callback-Funktion, um ihren Inhalt zu generieren, wenn die Entität angezeigt wird.

Wie erstellt man Pseudo-Felder?

Auf Drupal 8, 9, 10

Durch die Kombination von hook_ENTITY_TYPE_view() mit hook_entity_extra_field_info() können Sie benutzerdefinierte Pseudo-Felder definieren und genau festlegen, wie sie bei der Anzeige der Entität gerendert werden sollen.

Im folgenden Beispiel fügen wir der Entitätstyp-Paragraph ein Pseudo-Feld hinzu, das einen Google Classroom Share-Button rendert, wo immer der Paragraph verwendet wird. Das Feld wird in der Anzeigeverwaltung so angezeigt, wie die in der Entität erstellten Felder.

Das Drupal Pseudo-Feld wird in der Liste der Felder im Tab "Anzeige verwalten" angezeigt.

Das Rezept

Stellen Sie sicher, dass Sie die folgenden beiden Zeilen am Anfang der Datei hinzufügen.

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

Definieren Sie in der Datei my_module.module Ihres benutzerdefinierten Moduls das Pseudo-Feld mit der Funktion 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 Button'),
    'description' => t('Zeigt den Google Classroom Button an'),
    'weight' => 100,
    'visible' => TRUE,
  ];

  return $display_fields;
}

In diesem Beispiel definieren wir ein Pseudo-Feld namens google_classroom_button für den Entitätstyp paragraph und das Bundle google_classroom_button.

Wenn Sie das Feld zu einem Inhaltstyp hinzufügen möchten, sollten Sie das Wort paragraph durch node und google_classroom_button durch den Namen Ihres Inhaltstyps im obigen Code ersetzen.


/**
 * 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'],
    ];
  }
}

Der obige Code prüft, ob die Komponente "google_classroom_button" zur Anzeige-Konfiguration der Paragraph-Entität hinzugefügt wurde. Wenn ja, generiert er eine benutzerdefinierte Ausgabe für das Pseudo-Feld "google_classroom_button".

Anwendungsfälle von Pseudo-Feldern

  • Anzeige berechneter Werte oder Aggregate (wie die Anzahl der Kommentare zu einem Node)
  • Einbetten von Inhalten aus anderen Quellen (wie YouTube-Videos oder Social-Media-Feeds)
  • Anzeige benutzerdefinierter Markup oder HTML (wie eine Liste verwandter Inhalte)

Abschließende Gedanken

  • Dies ist eine schnelle Möglichkeit, zusätzliche Informationen in eine Entität zu erhalten, ohne sich mit Twig-Vorlagen befassen zu müssen.
  • Das Pseudo-Feld ist beim Erstellen einer Ansicht für die Entität nicht verfügbar.

Kategorien: