9.11. Drupal Entity API. Erstellen eines benutzerdefinierten Entity-Typs. Generieren eines Entity-Typs mit Drupal Console.
Wir haben bereits die Formular-API und die Felder-API verstanden und wissen, wie die Daten in Drupal in die Datenbank gelangen. Jetzt schauen wir uns das Fundament aller Drupal-Seiten an, nämlich die Entity-API.
Wahrscheinlich ist Ihnen schon aufgefallen, dass Felder nicht für sich alleine existieren, sondern an Entitäten „angehängt“ sind: Knoten, Blöcke, Taxonomie-Begriffe, Views usw. Man kann Bundle-Entitäten erstellen, z. B. Inhaltstypen, Blocktypen, Taxonomiewörterbücher. Aber was ist, wenn Sie eine neue Entität mit eigenen Bundles erstellen müssen? In diesem Fall benötigen Sie die Entity-API, um eine neue Entität zu erstellen.
Ich habe den gesamten Code im GitHub-Repository zum Modul drupalbook_product
hochgeladen, Sie können das Modul herunterladen und auf Ihrer Website hinzufügen:
https://github.com/levmyshkin/drupalbook8
Am einfachsten ist es, neue Entity-Typen über Drupal Console zu erstellen, da nur ein einziger Befehl erforderlich ist.
Man muss nicht oft neue Entity-Typen erstellen. Die meisten kleinen und mittleren Projekte nutzen dafür contrib-Module, zum Beispiel Commerce für Online-Shops:
https://www.drupal.org/project/commerce
Wenn Sie jedoch ein eigenes Plug-in-Modul entwickeln wollen, brauchen Sie eventuell einen eigenen Entity-Typ. Alternativ finden Sie unter den Drupal-Modulen vielleicht schon ein geeignetes Modul, das mit der notwendigen Funktionalität erweitert werden kann.
In diesem Artikel analysieren wir die Entity-API und erstellen unseren eigenen Produkttyp als Entity, der als Basis für einen kleinen individuellen Katalog oder Shop dienen kann. Falls Sie einen kompletten Shop erstellen möchten, empfehle ich dringend Commerce zu verwenden, da es Ihnen und Ihren Kunden viel Zeit spart.
Wenn Sie einen neuen Entity-Typ erstellen möchten, fragt man sich, warum man nicht einfach einen neuen Inhaltstyp Produkt erstellen und für einen Katalog verwenden kann. Für kleine Produktkataloge mit Ausgabe via Views und einfachen Filtern nach Preis und Bestand ist das möglich. Aber wenn Tausende Produkte vorliegen, wird die Verwaltung für den Administrator auf der Inhaltsseite unübersichtlich. Er möchte Filter für Artikelnummer, Kategorie, Farbe, Namen und weitere Eigenschaften direkt auf der Seite haben:
/admin/content
Das wird redundant und stört bei der Arbeit mit anderen Inhaltstypen wie News, Artikel, Veranstaltungen und Seiten. Daher erstellt man in solchen Fällen einen separaten Entity-Typ Produkt mit eigenem Admin-Panel und Einstellungen.
Fangen wir an, einen eigenen Produkttyp als Entity zu erstellen. Vor Ausführung des Befehls zur Entity-Erstellung empfehle ich dringend, ein Backup der Website zu machen, zumindest der Datenbank. Denn die Erstellung erzeugt Konfigurationen, die in der Datenbank gespeichert werden, und falls etwas schiefgeht und Dateien fehlen, kann die Seite beschädigt werden. Backup zuerst anlegen!
Jetzt erstellen wir ein neues Modul, was auch mit Drupal Console geht:
drupal generate:module
https://hechoendrupal.gitbooks.io/drupal-console/en/commands/generate-module.html
$ vendor/bin/drupal generate:module
// Willkommen beim Drupal Modul-Generator
Enter the new module name:
> Drupalbook Product
Enter the module machine name [drupalbook_product]:
>
Enter the module Path [modules/custom]:
>
Enter module description [My Awesome Module]:
> Products catalog
!>
Enter package name [Custom]:
>
Enter Drupal Core version [8.x]:
>
Do you want to generate a .module file? (yes/no) [yes]:
> no
Define module as feature (yes/no) [no]:
> no
Do you want to add a composer.json file to your module? (yes/no) [yes]:
> no
Would you like to add module dependencies? (yes/no) [no]:
> no
Do you want to generate a unit test class? (yes/no) [yes]:
> no
Do you want to generate a themeable template? (yes/no) [yes]:
> no
Do you want proceed with the operation? (yes/no) [yes]:
> yes
Generated or updated files
Generation path: /home/laptop/projects/drupalbook
1 - /modules/custom/drupalbook_product/drupalbook_product.info.yml
Generated lines: "5"
Oder Sie erstellen einfach die Datei drupalbook_product.info.yml
mit folgendem Inhalt:
name: 'drupalbook_product'
type: module
description: 'Products catalog'
core: 8.x
package: 'Drupalbook'
Jetzt können wir den Produkttyp als Entity generieren.
https://hechoendrupal.gitbooks.io/drupal-console/en/commands/generate-entity-content.html
$ drupal generate:entity:content
$ vendor/bin/drupal generate:entity:content
// Willkommen beim Drupal Content Entity Generator
Enter the module name [admin_toolbar]:
> drupalbook_product
Enter the class of your new content entity [DefaultEntity]:
> DrupalbookProductEntity
Enter the machine name of your new content entity [drupalbook_product_entity]:
>
Enter the label of your new content entity [Drupalbook product entity]:
> Product
Enter the base-path for the content entity routes [/admin/structure]:
>
Do you want this (content) entity to have bundles? (yes/no) [no]:
> yes
Is your entity translatable? (yes/no) [yes]:
> yes
Is your entity revisionable? (yes/no) [yes]:
> no
// generate:entity:config
Enter the base-path for the config entity routes [/admin/structure]:
>
Generated or updated files
Generation path: /home/laptop/projects/drupalbook
1 - modules/custom/drupalbook_product/drupalbook_product.permissions.yml
2 - modules/custom/drupalbook_product/drupalbook_product.links.menu.yml
3 - modules/custom/drupalbook_product/drupalbook_product.links.task.yml
4 - modules/custom/drupalbook_product/drupalbook_product.links.action.yml
5 - modules/custom/drupalbook_product/src/DrupalbookProductEntityAccessControlHandler.php
6 - modules/custom/drupalbook_product/src/DrupalbookProductEntityTranslationHandler.php
7 - modules/custom/drupalbook_product/src/Entity/DrupalbookProductEntityInterface.php
8 - modules/custom/drupalbook_product/src/Entity/DrupalbookProductEntity.php
9 - modules/custom/drupalbook_product/src/DrupalbookProductEntityHtmlRouteProvider.php
10 - modules/custom/drupalbook_product/src/Entity/DrupalbookProductEntityViewsData.php
11 - modules/custom/drupalbook_product/src/DrupalbookProductEntityListBuilder.php
12 - modules/custom/drupalbook_product/src/Form/DrupalbookProductEntitySettingsForm.php
13 - modules/custom/drupalbook_product/src/Form/DrupalbookProductEntityForm.php
14 - modules/custom/drupalbook_product/src/Form/DrupalbookProductEntityDeleteForm.php
15 - modules/custom/drupalbook_product/drupalbook_product_entity.page.inc
16 - modules/custom/drupalbook_product/templates/drupalbook_product_entity.html.twig
17 - modules/custom/drupalbook_product/templates//drupalbook-product-entity-content-add-list.html.twig
18 - modules/custom/drupalbook_product/drupalbook_product.module
19 - modules/custom/drupalbook_product/drupalbook_product.module
20 - modules/custom/drupalbook_product/drupalbook_product.module
21 - modules/custom/drupalbook_product/config/schema/drupalbook_product_entity_type.schema.yml
22 - modules/custom/drupalbook_product/drupalbook_product.links.menu.yml
23 - modules/custom/drupalbook_product/drupalbook_product.links.action.yml
24 - modules/custom/drupalbook_product/src/Entity/DrupalbookProductEntityTypeInterface.php
25 - modules/custom/drupalbook_product/src/Entity/DrupalbookProductEntityType.php
26 - modules/custom/drupalbook_product/src/DrupalbookProductEntityTypeHtmlRouteProvider.php
27 - modules/custom/drupalbook_product/src/Form/DrupalbookProductEntityTypeForm.php
28 - modules/custom/drupalbook_product/src/Form/DrupalbookProductEntityTypeDeleteForm.php
29 - modules/custom/drupalbook_product/src/DrupalbookProductEntityTypeListBuilder.php
Generated lines: "1060"
Nachdem das Modul generiert wurde, können Sie es aktivieren, damit der neue Entity-Typ auf der Website erscheint:
Beim Erzeugen einer Entität fragt Drupal Console nach dem Entity-Typ:
Enter the class of your new content entity [DefaultEntity]:
Der Name der PHP-Klasse für Ihre Entity, idealerweise mit „Entity“ am Ende.
Enter the machine name of your new content entity [drupalbook_product_entity]:
Der Maschinenname der Klasse wird vorgeschlagen, wenn Sie Enter drücken, wird der Vorschlag übernommen.
Enter the base-path for the content entity routes [/admin/structure]:
Ihr Entity-Typ erhält eine eigene Seite für CRUD-Operationen:
Die Anzeige der Produktseite ist recht einfach, kann aber später verbessert oder mit Views gestaltet werden:
Zum Erstellen einer neuen Entität müssen Sie zuerst ein Bundle des Produkttyps anlegen. Wir haben eine bundelbare Entity gewählt:
Do you want this (content) entity to have bundles? (yes/no):
So können wir einen neuen Produkttyp erstellen. Das wird benötigt, um unterschiedliche Felder wie Gewicht, Größe, Farbe und andere Merkmale hinzuzufügen. Zum Beispiel haben Monitore eine Bildschirmdiagonale, Schuhe eine Schuhgröße.
Legen wir einen neuen Produkttyp „Kleidung“ an:
Jetzt können Sie für unseren neuen Produkttyp Felder anpassen:
Wir brauchen definitiv mindestens ein Preisfeld.
Erstellen wir ein paar Produkte und schauen uns die Datenbank an. Dort gibt es die Tabelle drupalbook_product_entity
, in der die UUIDs unserer Produkte gespeichert sind:
Es gibt auch die Tabelle drupalbook_product_entity_field_data
, in der die Eigenschaften gespeichert sind. Das sind spezielle Felder der Entität, die direkt in der Tabelle gespeichert werden, da sie sich nicht mit Revisionen ändern (z.B. Name als Entity-Label, ähnlich wie der Titel eines Knotens).
Wenn Sie Felder hinzufügen, werden für jedes Feld zwei Tabellen erstellt, da wir Revisionen aktiviert haben:
Is your entity revisionable? (yes/no) [yes]
Ich denke, Sie verstehen jetzt, wie man neue Entity-Typen erstellt. In den nächsten Artikeln erweitern wir die Möglichkeiten unseres eigenen Katalogs / Shops.
Den gesamten Code habe ich auf GitHub im Modul drupalbook_product
bereitgestellt. Sie können das Modul herunterladen und auf Ihrer Website installieren: