Direkt zum Inhalt
Bild
osl-banner%20%285%29_1.jpg

So erstellen Sie eine benutzerdefinierte Entität in Drupal 8

AI-Translated
article publisher

Raman

Drupal

Entitäten in Drupal bieten eine strukturierte Möglichkeit zur Speicherung und Verwaltung von Daten. Mit der Einführung der Entity API in Drupal 8 wird die Verwaltung bestehender und die Erstellung neuer Entitäten noch einfacher. Ähnliche Entitäten werden zu Entitätstypen zusammengefasst, die wiederum Untertypen, sogenannte Bundles, besitzen, an die Felder angehängt werden können.

Zum Beispiel hat der Entitätstyp „Node“ zwei Bundles – „Artikel“ und „Einfache Seite“. Die Bundles teilen einige gemeinsame Eigenschaften und verfügen auch über Felder, die für sie einzigartig sind.

Der Drupal-Core bietet viele integrierte Entitätstypen und ermöglicht es uns auch, benutzerdefinierte Entitätstypen und Bundles zu definieren. Es gibt zwei Arten von Entitätstypen – Inhaltsentitäten (Content Entities) und Konfigurationsentitäten (Configuration Entities).

Konfigurationsentitäten Inhaltsentitäten

Sie speichern Daten über Ihre Drupal-Website (Metadaten)

Sie speichern Daten auf Ihrer Drupal-Website

Nicht-feldbar

Feldbar

Nicht-revisionierbar

Revisionierbar

Der Drupal-Core umfasst action, block, block_comment_type, comment_type, contact_type, contact_form, configurable_language, editor, field_storage_config, field_config, filter_format, image_style, menu, language_content_settings, migration, node_type, rdf_mapping, search_page, response_image_style, taxonomy_vocabulary, shortcut_set, tour, user_role und view

Der Drupal-Core umfasst aggregator_feed, aggregator_item, block_content, comment, contact_message, file, node, menu_link_content, shortcut, taxonomy_term und user

Wann sollten benutzerdefinierte Entitäten verwendet werden?

Bevor wir benutzerdefinierte Entitätstypen definieren, sollten wir die Situationen verstehen, in denen sie eingesetzt werden sollten:

  1. Leistungssteigerung

    In den meisten Fällen können Nodes verwendet werden, um jede Art von Inhalt zu speichern. Nodes implementieren jedoch eine Vielzahl von Hooks und fügen Funktionalitäten hinzu, die möglicherweise nicht benötigt werden. Darüber hinaus werden alle Inhaltsdaten in einer einzigen Datenbanktabelle gespeichert. Dies kann zu Leistungsproblemen führen, wenn die Anzahl der Inhaltselemente zunimmt. Hier können benutzerdefinierte Entitäten verwendet werden, um die Leistung zu steigern
     
  2. Eine bessere Admin-UX aufbauen

    Manchmal ist es notwendig, sowohl für Website-Ersteller als auch für Inhaltsredakteure bessere Administrationsformulare und -menüs bereitzustellen. Die Menüs, Pfade und Formularanzeigen können nach Bedarf konfiguriert werden.
     
  3. Benutzerdefinierte Funktionalitäten definieren

    Wir können benutzerdefinierte Methoden für unsere Entitätstypen implementieren, benutzerdefinierte Menüpunkte und Pfade hinzufügen. Wir können auch benutzerdefinierte Datenspeicher und Workflows nach Bedarf definieren.

Benutzerdefinierte Entitätstypen ermöglichen es uns, benutzerdefinierte Funktionalitäten zu definieren, die Leistung zu steigern und die volle Kontrolle über die Datenstruktur, Admin-Menüs, Pfade und das Speicher-Schema zu haben.

Eine benutzerdefinierte Entität mit Drupal Console erstellen

Um benutzerdefinierte Entitäten zu definieren, müssen wir ein Modul erstellen und dann eine benutzerdefinierte Entität hinzufügen. Drupal Console kann verwendet werden, um den Großteil des Boilerplate-Codes zu generieren; jedoch sind Kenntnisse in objektorientierter Programmierung, PHP und YML erforderlich, um unserer Entität benutzerdefinierte Funktionalitäten hinzuzufügen.

Betrachten wir ein Beispiel für eine Buch-Entität mit den folgenden Eigenschaften – Titel, ISBN, Autor(en) und Preis, mit zwei Bundles oder Untertypen – E-Book (Dateigröße, Download-URL) und Papierbuch (Gewicht, Auf Lager).

  1. Navigieren Sie zum Stammverzeichnis Ihrer Drupal-Website.
    ​​​​​​​$ cd /var/www/html/drupal8
  2. Generieren Sie Modul-Boilerplate mit Drupal Console.

    $ drupal generate:module
  3. Beantworten Sie eine Reihe von Fragen, die vom Modul-Generator gestellt werden.

    // Willkommen beim Drupal-Modul-Generator
    ​
    Geben Sie den Namen des neuen Moduls ein: > Books
    ​
    Geben Sie den Maschinennamen des Moduls ein [books]: >
    ​
    Geben Sie den Modulpfad ein [modules/custom]: >
    ​
    Geben Sie die Modulbeschreibung ein [Mein großartiges Modul]: > Stellt eine benutzerdefinierte Entität zur Speicherung von Buchinformationen bereit
    ​
    Geben Sie den Paketnamen ein [Custom]: >
    ​
    Geben Sie die Drupal Core-Version ein [8.x]: >
    ​
    Möchten Sie eine .module-Datei generieren? (ja/nein) [ja]: >
    ​
    Modul als Feature definieren (ja/nein) [nein]: >
    ​
    Möchten Sie eine composer.json-Datei zu Ihrem Modul hinzufügen? (ja/nein) [ja]: >
    ​
    Möchten Sie Modulabhängigkeiten hinzufügen? (ja/nein) [nein]: >
    ​
    Möchten Sie eine Unit-Test-Klasse generieren? (ja/nein) [ja]: > nein
    ​
    Möchten Sie ein themeable Template generieren? (ja/nein) [ja]: > nein
    ​
    Möchten Sie mit dem Vorgang fortfahren? (ja/nein) [ja]: >
    ​
    Generierte oder aktualisierte Dateien
    Generierungspfad: /var/www/html/drupal8
    1 - /var/www/html/drupal8/modules/custom/books/books.info.yml
    2 - /var/www/html/drupal8/modules/custom/books/books.module
    3 - /var/www/html/drupal8/modules/custom/books/composer.json
    ​
    Generierte Zeilen: "43"
  4. Generieren Sie eine benutzerdefinierte Entität mit Drupal Console. Für dieses Beispiel erstellen wir einen Inhaltsentitätstyp. Ein Konfigurationsentitätstyp kann mit drupal generate:entity:config erstellt werden. 

    $ drupal generate:entity:content
  5. Beantworten Sie eine Reihe von Fragen, die vom Entitäts-Generator gestellt werden.

    // Willkommen beim Drupal Content Entity Generator
    Geben Sie den Modulnamen ein [addtoany]: > books
    ​
    Geben Sie die Klasse Ihrer neuen Inhaltsentität ein [DefaultEntity]: > BookEntity
    ​
    Geben Sie den Maschinennamen Ihrer neuen Inhaltsentität ein [book_entity]: >
    ​
    Geben Sie das Label Ihrer neuen Inhaltsentität ein [Book entity]: >
    ​
    Geben Sie den Basispfad für die Routen der Inhaltsentität ein [/admin/structure]: >
    ​
    Soll diese (Inhalts-)Entität Bundles haben? (ja/nein) [nein]: > ja
    ​
    Ist Ihre Entität übersetzbar? (ja/nein) [ja]: >
    ​
    Ist Ihre Entität revisionierbar? (ja/nein) [ja]: >
    ​
    // generate:entity:config
    ​
    Geben Sie den Basispfad für die Routen der Konfigurationsentität ein [/admin/structure]:>
    ​
    Generierte oder aktualisierte DateienGenerierungspfad: /var/www/html/drupal8
    1 - modules/custom/books/books.permissions.yml
    2 - modules/custom/books/books.links.menu.yml
    3 - modules/custom/books/books.links.task.yml
    4 - modules/custom/books/books.links.action.yml
    5 - modules/custom/books/src/BookEntityAccessControlHandler.php
    6 - modules/custom/books/src/BookEntityTranslationHandler.php
    7 - modules/custom/books/src/Entity/BookEntityInterface.php
    8 - modules/custom/books/src/Entity/BookEntity.php
    9 - modules/custom/books/src/BookEntityHtmlRouteProvider.php
    10 - modules/custom/books/src/Entity/BookEntityViewsData.php
    11 - modules/custom/books/src/BookEntityListBuilder.php
    12 - modules/custom/books/src/Form/BookEntitySettingsForm.php
    13 - modules/custom/books/src/Form/BookEntityForm.php
    14 - modules/custom/books/src/Form/BookEntityDeleteForm.php
    15 - modules/custom/books/book_entity.page.inc
    16 - modules/custom/books/templates/book_entity.html.twig
    17 - modules/custom/books/src/Form/BookEntityRevisionDeleteForm.php
    18 - modules/custom/books/src/Form/BookEntityRevisionRevertTranslationForm.php
    19 - modules/custom/books/src/Form/BookEntityRevisionRevertForm.php
    20 - modules/custom/books/src/BookEntityStorage.php
    21 - modules/custom/books/src/BookEntityStorageInterface.php
    22 - modules/custom/books/src/Controller/BookEntityController.php
    23 - modules/custom/books/templates//book-entity-content-add-list.html.twig
    24 - modules/custom/books/books.module
    25 - modules/custom/books/books.module
    26 - modules/custom/books/config/schema/book_entity_type.schema.yml
    27 - modules/custom/books/books.links.menu.yml
    28 - modules/custom/books/books.links.action.yml
    29 - modules/custom/books/src/Entity/BookEntityTypeInterface.php
    30 - modules/custom/books/src/Entity/BookEntityType.php
    31 - modules/custom/books/src/BookEntityTypeHtmlRouteProvider.php
    32 - modules/custom/books/src/Form/BookEntityTypeForm.php
    33 - modules/custom/books/src/Form/BookEntityTypeDeleteForm.php
    34 - modules/custom/books/src/BookEntityTypeListBuilder.php
    
    Generierte Zeilen: "1978"
    Verzeichnisstruktur des generierten Moduls
    Verzeichnisstruktur des generierten Moduls
  6. Drupal Console hat das Modul unter modules/custom/books generiert. Um nun benutzerdefinierte Eigenschaften zum Entitätstyp „Book“ hinzuzufügen, öffnen Sie die Datei modules/custom/books/src/Entity/BookEntity.php in einer beliebigen IDE oder einem Texteditor und fügen Sie die folgenden Codezeilen unter der Methode baseFieldDefinitions der Klasse BookEntity hinzu. 

     $fields['isbn'] = BaseFieldDefinition::create('integer')
         ->setLabel(t('ISBN'))
         ->setDescription(t('ISBN des Buches'))
         ->setRevisionable(TRUE)
         ->setTranslatable(TRUE)
         ->setDisplayOptions('form', array(
           'type' => 'string_textfield',
           'settings' => array(
             'display_label' => TRUE,
           ),
         ))
        ->setDisplayOptions('view', array(
           'label' => 'hidden',
           'type' => 'string',
         ))
         ->setDisplayConfigurable('form', TRUE)
         ->setRequired(TRUE);    
        
       $fields['author'] = BaseFieldDefinition::create('string')
         ->setLabel(t('Autor'))
         ->setDescription(t('Autor(en) des Buches'))
         ->setRevisionable(TRUE)
         ->setTranslatable(TRUE)
         ->setDisplayOptions('form', array(
           'type' => 'string_textfield',
           'settings' => array(
             'display_label' => TRUE,
           ),
         ))
        ->setDisplayOptions('view', array(
           'label' => 'hidden',
           'type' => 'string',
         ))
         ->setDisplayConfigurable('form', TRUE)
         ->setRequired(TRUE);
    
    
       $fields['price'] = BaseFieldDefinition::create('float')
         ->setLabel(t('Preis'))
         ->setDescription(t('Preis des Buches'))
         ->setRevisionable(TRUE)
         ->setTranslatable(TRUE)
         ->setDisplayOptions('form', array(
           'type' => 'string_textfield',
           'settings' => array(
             'display_label' => TRUE,
           ),
         ))
        ->setDisplayOptions('view', array(
           'label' => 'hidden',
           'type' => 'string',
         ))
         ->setDisplayConfigurable('form', TRUE)
         ->setRequired(TRUE);
  7. Verschiedene andere Aspekte der Entität können angepasst werden, wie z.B. Admin-Menüs, Pfade und Formulare; Einschränkungen und Eigenschaften können auf die Felder angewendet werden. Eine vollständige Referenz finden Sie in der Dokumentation. Installieren wir nun das neu erstellte Modul.

$ drush en books -y

oder

$ drupal module:install books

Falls Sie nach der Installation des Moduls Änderungen an der Entität vornehmen, stellen Sie sicher, dass Sie drupal update:entities ausführen, um die Aktualisierungen anzuwenden.

Bundles erstellen und Felder hinzufügen

Bundles können über die Benutzeroberfläche erstellt und Felder daran angehängt werden.

  1. Navigieren Sie zu Verwalten → Struktur und klicken Sie auf „Buch-Entitätstyp hinzufügen“
     
  2. Fügen Sie ein passendes Label hinzu und klicken Sie auf „Speichern“
     
  3. Klicken Sie im Dropdown-Menü auf „Felder verwalten“ und fügen Sie dem Bundle nach Bedarf Felder hinzu.
    ​​​​​​​
  4. Wiederholen Sie diesen Vorgang für alle Bundles

Sie können nun Entitäten Ihrer benutzerdefinierten Entitätstypen erstellen. Standardmäßig befindet sich das Menü zum Erstellen einer neuen Entität unter admin/structure/{Ihre-benutzerdefinierte-Entität}. Dies kann durch Ändern des übergeordneten Schlüssels unter entity.book_entity.collection in der Datei modules/custom/books/books.links.menu.yml geändert werden.

Formularanzeigen von Papierbuch- und E-Book-Bundles
Formularanzeigen der Papierbuch- und E-Book-Bundles

Fazit

Entitäten sind Bausteine und integraler Bestandteil einer Drupal-Website. Benutzerdefinierte Entitätstypen ermöglichen es uns, benutzerdefinierte Funktionalitäten zu definieren, die Leistung zu steigern und die volle Kontrolle über die Datenstruktur, Admin-Menüs, Pfade und das Speicherschema zu haben. Sie können mit wenig oder gar keinem Aufwand mithilfe der Drupal Console erstellt werden.

Teilen Sie uns in den Kommentaren unten mit, wie Ihre benutzerdefinierte Entität Ihnen geholfen hat. Oder kontaktieren Sie uns unter [email protected] für weitere solcher Tutorials. 

Abonnieren

Ready to start your digital transformation journey with us?

Verwandte Blogs

Zurück von der DrupalCon Atlanta 2025: Ein Meilenstein für OpenSense Labs

Zurück von der DrupalCon Atlanta 2025: Ein Meilenstein für OpenSense Labs

„Fit. Schnell. Für die Ewigkeit gebaut.“ Das war nicht nur ein Slogan, sondern die Denkweise, mit der wir zur DrupalCon…

Erklärbare KI-Tools: SHAPs Stärke in der KI

Explainable AI tools Explainable AI And SHAP OpenSense Labs

Wissen Sie, was erklärbare KI-Tools sind? Erklärbare KI-Tools sind Programme, die zeigen, wie eine KI ihre Entscheidungen…

KI-Chatbots: Präzision und Persönlichkeit in Perfektion

Creating AI Chatbot OpenSense Labs

In der Welt der künstlichen Intelligenz ist die Entwicklung eines KI-Chatbots, der nicht nur akkurate Informationen liefert…