So erstellen Sie eine benutzerdefinierte Entität in Drupal 8 [geschlossen]

10

Ich habe ein großes persönliches Projekt, das auf Drupal 7 basiert und viele benutzerdefinierte Entitäten enthält. Ich möchte mit dem Upgrade des Projekts auf Drupal 8 beginnen, aber der vollständig neu geschriebene Drupal 8-Kern ist zu groß, als dass ich mich ohne Dokumentation zurechtfinden könnte (+ Symfony ist mir völlig unbekannt, ich bin nur ein einfacher Drupal-Typ). .

Ich habe versucht, eine benutzerdefinierte Entität zu erstellen, indem ich nur einen Teil des Kernmodulcodes betrachtet habe, aber ohne Erfolg.

Können Sie mich auf einige Artikel zu benutzerdefinierten Entitäten in Drupal 8 verweisen (ich konnte keine einzige finden) oder mir eine grundlegende Schritt-für-Schritt-Anleitung geben?

Vielen Dank.


quelle
1
Könnten Sie die Frage bearbeiten, um ein wenig darüber hinzuzufügen, wie weit Sie sind und wo genau Sie kämpfen? Es wäre ideal, den spezifischen Code zu sehen, mit dem Sie Probleme haben. Das Erstellen einer benutzerdefinierten Entität ist keine kleine Aufgabe - es ist wahrscheinlich eine zu weit gefasste Frage, sowohl für das Site-Format als auch für Ihre Chancen, eine gute Antwort zu erhalten. Bitte beachten Sie, dass Anfragen nach Links / Tutorials aus genau diesem Grund hier nicht zum Thema gehören. Zerlegen Sie es besser Stück für Stück und stellen Sie Fragen zu diesen kleinen Stücken. Danke
Clive
Abgesehen davon, wenn Sie kein Symfony kennen, wird es Ihnen wahrscheinlich schwer fallen, Ihr D7-Wissen auf D8 anzuwenden. Die Dinge haben sich erheblich geändert (wie Sie sicher bereits wissen). Ich würde dringend empfehlen, so viel wie möglich vom Symfony-Buch zu lesen, bevor Sie sich auf die Reise machen. Wenn Sie eine solche Erdung haben, wird der Übergang viel reibungsloser, vertrauen Sie mir. Abgesehen davon fand ich die Entitäten "Kategorie" und "Nachricht" im Kernmodul "Kontakt" als sehr gute Ausgangspunkte für das Lernen
Clive
@Clive Abgesehen von der Validierungs-API hat die Entity-API in Drupal 8 fast nichts mit Symfony zu tun, daher denke ich nicht, dass sie so relevant ist. Ansonsten stimme ich zu, dass die Frage zu weit gefasst ist, aber ich habe versucht, einen Überblick zu geben. Spezifischere Fragen können dann detaillierter beantwortet werden. Und es hilft, einen Ausgangspunkt zu haben, da dies nicht allzu offensichtlich ist, wenn Sie D8 nicht kennen.
Berdir
@Berdir Ich meinte D7 -> D8 im Allgemeinen, nicht für Entitäten speziell. Das Wissen über Symfony-Routing und -Dienste erleichtert beispielsweise das Verständnis des Kerncodes im Allgemeinen erheblich. Übrigens eine großartige Zusammenfassung, kein Grund, darüber nachzudenken, diese Frage jetzt zu schließen, IMO, es ist eine wertvolle Ressource (auch wenn es ein bisschen zu breit ist)
Clive

Antworten:

13

Ich arbeite hier an der Entity API-Dokumentation: https://drupal.org/developing/api/entity .

Die Frage ist zu groß, um sie im Detail zu beantworten, und hängt davon ab, ob Sie Inhalte oder Konfigurationsentitäten benötigen. Angenommen, Sie möchten Inhaltsentitäten (in der Datenbank gespeichert, können vor Ort / überarbeitbar / ... sein, Details im obigen Link), müssen Sie so etwas tun. Die oben verlinkte Dokumentation wird schließlich jeden Schritt, einschließlich Tutorials, jetzt abdecken Es werden nur die ersten Schritte behandelt.

  1. Stellen Sie eine Entitätsklasse bereit und fügen Sie die erforderlichen Anmerkungen hinzu, um sie als Entität verfügbar zu machen.
  2. Wenn Sie die erforderlichen Tabellen bereitstellen, müssen Sie nicht viel ändern, wenn Sie bereits über Ihr 7.x-Schema verfügen. Sie möchten jedoch eine UUID- und möglicherweise eine Langcode-Spalte hinzufügen, wenn Ihre Entität eine Sprache haben kann / übersetzbar sein kann. Sehen Sie sich das in Schritt verknüpfte Knotenbeispiel an, wenn Sie einige Basisfelder (Eigenschaften) übersetzbar oder überarbeitbar machen möchten. Derzeit müssen Sie die erforderlichen Tabellen selbst bereitstellen.
  3. Geben Sie die Basisfelddefinitionen in Ihrer baseFieldDefinitions () -Methode an. . Beachten Sie, dass sich die Funktionsweise in https://drupal.org/node/2047229 ändert (von Arrays zu Klassen) .
  4. Implementieren Sie die erforderlichen Methoden vor / nach dem Speichern / Laden / Löschen, wenn Sie über eine benutzerdefinierte Logik verfügen, die z. B. vor dem Speichern einer Entität ausgeführt werden muss (z. B. Aktualisieren des geänderten Zeitstempels).
  5. Implementieren Sie einen Zugriffscontroller, wenn Sie über eine nicht triviale Zugriffslogik verfügen und die Methoden checkAccess () und checkCreateAccess () überschreiben, oder geben Sie die admin_permission in Ihrer Anmerkung an, wenn Sie nur eine einzige Berechtigung haben, die den vollständigen Zugriff ermöglicht.
  6. Es wird empfohlen, obwohl technisch nicht erforderlich, eine Schnittstelle für Ihre Entitätsklasse (z. B. NodeInterface for Node) bereitzustellen, die nützliche Methoden (normalerweise get / set / isSomething ()) für Ihre Basisfelder enthält, damit Sie einen Hinweis auf die Schnittstelle und eingeben können Holen Sie sich die automatische Vervollständigung für diese Methoden.

Je nachdem, was Sie benötigen, gibt es auch weitere Schritte, z. B. das Definieren der erforderlichen Formulare, möglicherweise eines Render-Controllers usw. Diese sollten jedoch wahrscheinlich separate Fragen sein, wenn Sie weitere Informationen benötigen.

Anmerkungen:

  • Konfigurationsentitäten sind grundsätzlich ähnlich, außer dass Sie den Konfigurationsspeichercontroller ( https://drupal.org/node/2119905) verwenden müssen erleichtert dies). Sie müssen keine Tabellenschemata definieren (offensichtlich), aber Sie müssen bereitstellen Eine Konfigurationsschemadatei, siehe z. B. Taxonomie-Vokabulare oder Knotentypen.
  • Bei Inhaltsentitäten sind die Basisfelder nicht als öffentliche oder geschützte Eigenschaften definiert, sondern sie werden automatisch in den Eigenschaften für Werte und Felder verwaltet. Greifen Sie entweder über get () / set () oder die entsprechenden magischen Methoden darauf zu. ($ node-> title ist gleich $ node-> get ('title')).
  • Hilfe bei der Dokumentation wäre dort sehr willkommen. Ich habe eine grundlegende Gliederung für den Inhalt / die Struktur erstellt, die ich haben möchte. Erstellen Sie also einfach eine neue Seite und legen Sie los, z. B. bin ich auch an vereinfachten Tutorials interessiert. Für Konfigurationsentitäten gibt es hier bereits eine Wenn Sie fertig sind, wechseln Sie zur Entitätsdokumentation: https://drupal.org/node/1809494
  • Core verfügt über eine große Anzahl von Implementierungen von Inhaltsentitäten. Wenn Sie Arbeitsbeispiele anzeigen möchten: Knoten, Benutzer, Begriff, Kommentar, CustomBlock, ... Wie in Artikel 1 erläutert, finden Sie immer die Entitätstypen von ein Modul im Entity-Namensraum.
  • @fago hat an diesem Wochenende im DrupalCamp Wien eine Präsentation über Entity API gehalten, die viel von dem, was ich hier geschrieben habe, und mehr behandelt.
Berdir
quelle
1
Der Drupal-Code-Generator ist sehr nützlich - >> github.com/Chi-teck/drupal-code-generator
rémy
1
drupalconsole.com - auch ein guter Helfer (Ein Tool, um Boilerplate-Code zu generieren, mit Drupal zu interagieren und zu debuggen.)
melkovsky