Wie kann ich vorgehen, um Folgendes in Drupal 7 zu implementieren?
Ich muss ein Modul erstellen, das eine neue feldfähige Entität namens "Firma" definiert. Ich habe eine Liste von beispielsweise 20 Feldern, die von jeder Unternehmensinstanz ausgefüllt werden müssen. Diese Fragen sind vordefiniert und einige können eine benutzerdefinierte Validierung enthalten.
Im Moment bin ich an dem Punkt, an dem ich der Firma neue Felder hinzufügen kann. Dies funktioniert im Moment gut. Mein Problem ist, dass ich alle diese Felder dort haben muss, sobald das Modul installiert ist, so dass das Hinzufügen über die Schnittstelle keine Option ist.
Ich habe mich gefragt, wie ich das angehen kann. Ich nehme an, es kommt darauf an, in der Lage zu sein, das zu tun, was mit der 'Felder verwalten'-Benutzeroberfläche programmgesteuert getan werden kann.
node_type_set_defaults()
undnode_type_save()
natürlich auch darum kümmernhook_install()
.Antworten:
Verwenden Sie field_create_field () , um das Feld selbst zu erstellen, und field_create_instance () , um eine Instanz für das angegebene Entitätspaket zu erhalten.
Wenn Sie Felder als Teil eines benutzerdefinierten Moduls erstellen, möchten Sie das Feld möglicherweise nicht löschen, wenn das Modul deinstalliert wird. Dazu können Sie field_delete_field () verwenden, wenn Sie das Feld und alle Feldinstanzen löschen möchten, oder wenn Sie bestimmte Instanzen löschen möchten, können Sie field_delete_instance () verwenden .
quelle
Beispiel für das programmgesteuerte Hinzufügen von Feldern zum Benutzerprofil und deren Verwendung im Benutzerregistrierungsformular.
quelle
Wenn Sie Felder aus einem vorhandenen Inhaltstyp oder einer vorhandenen Entität schnell erstellen / löschen müssen, ohne die Benutzeroberfläche oder die Programmierung zu verwenden, können Sie die folgenden, wenig bekannten Drush-Befehle verwenden:
Beispiel: Erstellen Sie zwei neue Felder für den Artikel:
Andere Befehle:
quelle
Wie bereits erwähnt, können Sie die Field-API-Funktionen aus der Implementierung von hook_install () Ihres Moduls verwenden, um Felder und deren Instanzen für Ihren Inhaltstyp zu erstellen. In node_example_install () finden Sie ein Beispiel für die Verwendung der Funktion.
Eine andere Lösung ist die Verwendung des Features- Moduls. Features können verschiedene Site-Komponenten exportieren, um sie in einem Modul zu codieren. Inhaltstypen und Felder können exportiert werden. Sie können entweder ein Featuremodul generieren und Ihren vorhandenen Code überschreiben. Features wird dann sein Bestes tun, um zu verhindern, dass Ihr Code beschädigt wird. Sie können auch ein Dummy-Modul generieren und den feldbezogenen Code in Ihr Modul kopieren. Dies setzt ein grundlegendes Verständnis der Funktionsweise von Features voraus.
quelle
In Ihrer Installationsdatei müssen Sie sowohl 'hook_install' als auch 'hook_uninstall' definieren. Beispiel enthalten, aber lesen Sie alles über die zusätzlichen Schlüssel in den API-Referenzen (Code ist ungetestet, könnte Tippfehler enthalten).
Im
hook_install
können Sie die Felder hinzufügen mit:field_create_field , Diese Funktion erstellt eine Vorlage für ein Feld.
field_create_instance Kann nach dem Erstellen des Felds zum Hinzufügen zu content_types (auch als Bundles bezeichnet) verwendet werden.
HINWEIS Die Namen der verschiedenen Feldtypen finden Sie in den Modulen, die sie generieren (dies ist der Schlüssel des Array-Elements in ihrer hook_field_info). Sie finden alle Kernmodule für die Feldimplementierung im Ordner modules / field / modules.
Einstellungen können auch aus den Feldmodulen abgeleitet werden. Die Einstellungen, die Sie in festlegen,
field_create_field
gelten für die gesamte Site. Die von Ihnen festgelegtenfield_instance_create
Werte sind knotentypspezifischIn dem
hook_uninstall
field_delete_instance und field_delete_field können verwendet werden, um sie wieder zu entfernen
field_delete_field
. Wird automatisch aufgerufen, wenn Sie die letzte Instanz löschen (normalerweise).quelle
Ich hatte kürzlich ein ähnliches Bedürfnis nach einem Projekt. Ich bin so vorgegangen und hoffe, es hilft jemandem.
Grundsätzlich erstellen Sie die benötigten Felder über die Benutzeroberfläche der Felder, exportieren sie in Code und fügen sie dann in Ihr benutzerdefiniertes Modul ein. Sie müssen das Entwicklungsmodul aktiviert haben.
Mit diesen Informationen habe ich auch ein Gist erstellt .
Auf geht's....
Setzen Sie die ersten 3 Variablen und klicken Sie dann auf Ausführen
Sie erhalten 2 Arrays, in etwa so, hoffentlich mit allen Eigenschaften ausgefüllt.
Fügen Sie Ihrer .install-Datei nun den folgenden Code hinzu. Ersetzen Sie alle Instanzen von mymodule durch den tatsächlichen Modulnamen. Fügen Sie den Code aus der Entwicklungsausgabe in die _mymodule_field_data und _mymodule_instance_data ein, wie in den entsprechenden Funktionen unten angegeben. Sie können dies für so viele Felder tun, wie Sie möchten. Fügen Sie einfach alle $ fields-Arrays in die Funktion _mymodule_field_data und alle $ instance in die Funktion _mymodule_instance_data ein.
quelle
Sie können auch das Modul Features verwenden, um die Felder bei der Installation zu erstellen.
Da Features Code für Felder generiert, können Sie den Code mit dem Feature-Modul in ein Dummy-Modul generieren und dann in die .install-Datei Ihres Moduls kopieren und einfügen.
Der Vorteil ist, dass das Modul nicht vom Funktionsmodul in Ihrer Zielumgebung abhängt.
quelle
Sie können den unten angegebenen benutzerdefinierten Firmenmodul-Code verwenden, um programmgesteuert einen Inhaltstyp mit seinen verschiedenen Feldern zu erstellen.
Sie können diesen Code in eine .install-Datei Ihres benutzerdefinierten Moduls einfügen. Es wird programmgesteuert einen Inhaltstyp namens "Firma" und seine verschiedenen Feldtypen (Text, Numerisch, Datum (Hinweis: Sie müssen das Datumsmodul installieren, da das Datumsfeld nicht standardmäßig bereitgestellt wird), Bild und Liste hinzufügen.
Ich habe auch den Deinstallationscode hinzugefügt, der den Inhaltstyp "Firma" zusammen mit all seinen Feldern und Daten entfernt, wenn Sie Ihr Modul "customcompanymodule" deinstallieren.
Sie können diese Felder gemäß Ihren Anforderungen ändern / entfernen:
quelle