2012-11-28 4 views
6

Ich versuche zu lernen, wie ich einen benutzerdefinierten Inhaltstyp programmgesteuert aus meinem Modul erstellen kann.Wie entfernen Sie Spuren von Feldern, die zu einem Modulinhaltstyp gehörten?

Nach der Deinstallation und Neuinstallation meines Moduls wurde jedoch eine Fehlermeldung angezeigt, dass eines oder mehrere der Felder, die ich erstellen wollte, nicht erstellt werden konnten, da sie bereits vorhanden sind.

Also ging ich hacken durch meine Datenbank, entfernen Sie den Inhaltstyp und alle Tabellen, die dazu gehörten.

Gleiches Ergebnis - Feld existiert bereits.

Weiter ging ich in die Drupal API Website Suche nach Möglichkeiten, Felder und Feld Instanzen zu löschen, und kam über

field_delete_field() 

und

field_delete_instance() 

ich eine PHP-Seite gemacht, um zu versuchen die löschen Felder, die ich erstellt habe, nur um einen Fehler zu erhalten, der besagt, dass die Tabelle, die ich löschen wollte, nicht existiert.

So bin ich irgendwie fest - ich kann die Felder nicht erstellen, weil sie bereits existieren, und ich kann sie nicht löschen, weil sie nicht existieren!

BTW der Code ich modellierte mein Modul nach ist der Code in der "node_example" Abschnitt der Drupal examples module.

Antwort

4

Aua, manuell die Datenbanktabellen zu löschen ist nie eine gute Idee - Drupal ist nicht so nachsichtig :)

einfach den Code in Ihren installieren/aktivieren Haken zu adressieren, wickeln Sie die Felderstellung in:

if (!field_info_field('field_name')) { 
    field_create_field(... 
} 

Damit wird das Problem erneut auftreten. Oder wenn Sie das nicht möchten, vergewissern Sie sich, dass das Feld im Deinstallations-/Deaktivierungs-Hook gelöscht ist. Offensichtlich würde diese Methode möglicherweise zu Datenverlust führen.

das aktuelle Problem zu beheben, folgen Sie diesem Verfahren:

  • vollständig deinstallieren (nicht nur deaktivieren) Ihr benutzerdefiniertes Modul. Wenn es in einem inkonsistenten Zustand ist, löschen Sie einfach seine Zeile in der system Tabelle.
  • Löschen Sie alle Spuren des Feldes aus den Tabellen field_config und field_config_instance.
  • Kürzen Sie alle Cache-Tabellen manuell (jede Tabelle, die mit cache_ beginnt).
  • nicht unbedingt notwendig, aber klären alle verbliebenen Inhalt:

    $nids = db_query('SELECT nid FROM {node} WHERE type = :type', array(':type' => 'type'))->fetchCol(); 
    node_delete_multiple($nids); 
    

Das sollte es tun.

Jedes Mal, wenn Sie ein Feld über die Benutzeroberfläche oder programmatisch löschen, müssen Sie entweder cron ausführen oder field_purge_batch() aufrufen, um die Felder "hart" zu löschen, da sie nur zum Löschen in erster Instanz markiert sind.

+0

Vielen Dank! – Tyler