Beste Möglichkeit, ein Feld aus einem Inhaltstyp zu löschen

21

Wie kann ein Drupal 7-Feld am besten aus einem über die GUI definierten Inhaltstyp entfernt werden? Ich möchte hook_update_N verwenden, damit die Änderungen beim Ausführen von update.php auf mehrere Server übertragen werden können. Ich kann jedoch keine Lösung finden. db_drop_table () ist für benutzerdefinierte Schemas sinnvoll, jedoch nicht für einen über die GUI definierten Inhaltstyp / ein Inhaltsfeld.

Amateur Barista
quelle
Sie haben ein benutzerdefiniertes Modul erstellt, um einen Inhaltstyp zu definieren.
iStryker
iStryker: Erstellt den Inhaltstyp über die Administrationsoberfläche, fügt einige Felder hinzu und exportiert ihn über Feature. Aber jetzt möchte ich eines dieser Felder programmgesteuert entfernen.
Amateur Barista
Es wird darauf hingewiesen, dass D5 eine content_field_instance_delete () -Funktion bietet, die hier und hier dokumentiert ist , aber diese Funktion ist für D7 nicht verfügbar. Es ist auch merkwürdig, mit welcher Funktion field.install in D7 core Felder gelöscht werden: _update_7000_field_delete_instance () - eine benutzerdefinierte "interne" Funktion, die anderen Benutzern nicht zur Verfügung steht. Für etwas so Wichtiges wie Felder scheint es mir, dass irgendwo eine "öffentliche" Funktion verfügbar sein sollte, und das ist es, wonach ich suche.
Amateur Barista
Derzeit ist meine öffentliche Funktion "Kandidat" field_delete_instance ().
Amateur Barista

Antworten:

18

Es gibt zwei API-Funktionen zum Löschen von Feldern:

Wenn Sie das Feld nicht wiederverwenden möchten, ist es möglicherweise etwas sauberer, das gesamte Feld zu löschen, anstatt nur die Instanz des betreffenden Inhaltstyps zu löschen. Nur Sie können das beurteilen.

googletorp
quelle
2
Lief wie am Schnürchen. Die Funktion gibt keine Argumente zurück. Daher würde ich bei Verwendung in Kombination mit hook_update_N () empfehlen, einen Watchdog () durchzuführen, um Ihre Aktualisierungsänderungen zu protokollieren.
Amateur Barista
9

Ja, field_delete_instance () ist die Funktion zum Löschen von Feldinstanzen.

Beachten Sie, dass field_delete_instance()Anrufe automatisch ausgeführt werden, field_delete_field()wenn keine Instanzen mehr vorhanden sind. Dies field_delete_instance()ist höchstwahrscheinlich alles, was Sie jemals benötigen werden.

_update_7000_field_delete_instance()ist für Kernaktualisierungsfunktionen ausgelegt. Beispiel: In der Update-Funktion verwenden x_update_7000()Sie field_delete_instance(). Dann x_update_7001()ändern Sie die {field_config}Tabelle auf inkonsistente Weise und müssen field_delete_instance()natürlich auch geändert werden.

Aber jetzt x_update_7000()ist Anruf field_delete_instance()würde zu einem Fehler führen , da die Tabelle immer noch in der alten Struktur ist. Die Situation für hinzugefügte Module ist jedoch anders, da sie nach allen Kernaktualisierungen immer ausgeführt werden sollten und daher mit der neuesten Kernversion arbeiten müssen.

Dies ist jedoch ein Muster, das Sie möglicherweise für Ihre eigenen API-Funktionen verwenden möchten, die Sie in Aktualisierungsfunktionen verwenden.

Darüber hinaus führen diese _update-Funktionen keine Hooks aus, da das Ergebnis nicht vorhersehbar ist (z. B. weil das Modul, für das das Update ausgeführt wird, möglicherweise deaktiviert ist).

Berdir
quelle