Wie man Pseudo-Felder in Drupal mit 2 Hooks erstellt
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 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.