Enthält Workflow-Probleme beim Löschen eines Felds

14

Angenommen , ich habe einen Inhaltstyp Personmit Feldern: Name, Age,Email

Dieser Inhaltstyp wird von einem Feature gesteuert, das aufgerufen wird, testdamit ich ihn als Quellcodeverwaltung verwenden und auf die Live-Site übertragen kann.

Mein Workflow sieht folgendermaßen aus:

  • Ich füge ein neues Feld auf PersongenanntPhone
  • lokal mache ich: drush fu test -y
  • Ich bearbeite die test.info, um die Versionsnummer zu erhöhen
  • Ich übernehme die Änderungen in mein Repository
  • Ich schiebe das Feature auf die Live-Site (kopiere die Feature-Dateien)
  • auf der live seite mache ich: drush fr test -y
  • auf der live seite mache ich: drush cc all

Dann erscheint das neue Feld auf der Live-Site Person.

Wenn ich im ersten Schritt ein Feld entferne, wird Persondas Feld nicht von der Live-Site gelöscht. Wie löse ich das? Ich möchte es nicht manuell von der Benutzeroberfläche auf der Live-Site löschen müssen.
Ist dieser Workflow korrekt?

Cherouvim
quelle
1
Verwenden Sie drush fu test -y --version-increment, um die Versionsnummer automatisch zu erhöhen
Mike

Antworten:

9

Dies ist ein zweischneidiges Schwert, um das Löschen von Daten zu verhindern, was immer gut ist. Es gibt nichts wirklich zu lösen, das ist erwartetes Verhalten.

Es ist derselbe Workflow, den wir seit über einem Jahr verwenden und der wirklich gut funktioniert. Ich würde sagen, es ist richtig, aber das ist eine sehr subjektive Antwort.

Digital
quelle
Und wenn ich das Feld wirklich löschen wollte? Sollte ich nach Update-Hooks suchen? (Ich bin ein D7-Neuling).
Cherouvim
3
Update-Hooks wären ideal, oder entfernen Sie sie manuell.
Digital
2
OK, ich könnte es auch tundrush field-delete field
Cherouvim
@cherouvim Müssten Sie das also jedes Mal tun, wenn Sie ein Feature neu erstellen?
AlxVallejo
Ein hook_update_N () in der .install-Datei des Features würde funktionieren.
Mike
10

Die korrekte Entfernung von durch Features erstellten Inhalten erfolgt über hook_update_N (was in der Datei implementiert werden sollte your_module.install).


Die Hauptidee bei Features besteht darin, die Konfiguration mit Code zu verwalten. Die Verwendung hook_update_Nist damit konsistent, da die Feldlöschung im Code erfolgt (der mit der Versionskontrolle verwaltet werden kann), während der entsprechende Befehl drush field-delete fieldnicht aus verwaltetem Code aufgerufen wird. Dies ist ein separater Befehlszeilenschritt, den Sie ausführen müssen (und an den Sie sich erinnern müssen).

Smokris
quelle
Warum? Wird nicht drush field-delete fieldgut funktionieren?
Cherouvim
5
Klar, das würde funktionieren und könnte eine einfachere Lösung sein. Die Hauptidee bei Features ist jedoch, die Konfiguration mit Code zu verwalten. Die Verwendung hook_update()ist damit konsistent, da die Feldlöschung im Code erfolgt (der mit der Versionskontrolle verwaltet werden kann), während der Befehl drush nicht aus verwaltetem Code aufgerufen wird. Dies ist ein separater Befehlszeilenschritt, den Sie ausführen müssen (und an den Sie sich erinnern müssen).
Smokris
In welcher Datei eines Features verwende ich hook_update ()? hook_update () verwendet ein Knotenobjekt als Parameter, sodass es nicht möglich ist, ihm ein Knotenobjekt zuzuweisen, während das Feature aktiviert ist.
subhojit777
@ subhojit777: Hoppla, ich habe auf die falsche Hook-Dokumentationsseite verlinkt. Ich habe gerade den Link repariert. Bitte lesen Sie die Dokumentation für hook_update_N.
Smokris
@smokris :) Ich erwähnte diesen Haken in meiner Antwort
subhojit777
2

Erstellen Sie eine neue Datei mit dem Namen "your_feature_name.install".

In der Datei declare hook_update_N können Sie field_delete_field () verwenden und den Namen des Feldes angeben, das Sie als Parameter löschen möchten.

Führen Sie update.php aus und die Felder werden gelöscht.

subhojit777
quelle
0

Wenn Sie es field_phonein anderen Bereichen verwenden, möchten Sie es möglicherweise nur aus dem Inhaltstyp "Person" entfernen, aber nicht vollständig von Ihrer Website löschen. Erstellen Sie manuell eine YOUR_FEATURE_NAME.installDatei im Ordner Ihres Features wie folgt:

/**
 * Implements hook_update_N().
 *
 * Removes field_phone from Person content type.
 */
function YOUR_FEATURE_NAME_update_7001() {
  if ($instance = field_info_instance('node', 'field_phone', 'person')) {
    field_delete_instance($instance);
  }
  field_purge_batch(500);
  features_revert_module('YOUR_FEATURE_NAME');
}

Wenn Sie dies aus einem Personenabsatz anstelle eines Personeninhaltstyps löschen, können Sie die erste bedingte Anweisung folgendermaßen ändern:

if ($instance = field_info_instance('paragraphs_item', 'field_phone', 'person')) {
  ...
}
Jimafisk
quelle