Feature-Inhaltstyp kann nach Deinstallation des Features nicht gelöscht werden

24

Problem

Wenn Sie ein Feature deinstallieren, das einen Inhaltstyp erstellt, wird der Link "Löschen" auf der Seite ausgeblendet admin/structure/types.

Ausgabe auf Drupal.org

Aram Boyajyan
quelle

Antworten:

15

Lösung

Verwenden Sie eine hook_uninstall()in FEATURE_NAME.install enthaltene Datei und ändern Sie den Status des Inhaltstyps, damit das System davon ausgeht, dass es sich um einen nicht gesperrten benutzerdefinierten Inhaltstyp handelt.

Ich habe das auch auf d.org gepostet .

<?php
/**
 * Implements hook_uninstall().
 */
function FEATURE_NAME_uninstall() {

  // List custom content types added by this feature
  $custom_ctypes = array(
    'blog',
  );

  // Go through each and unlock the content type
  foreach ($custom_ctypes as $ctype) {
    db_query("UPDATE {node_type} SET `custom` = 1, locked = 0 WHERE type = :ctype", array(':ctype' => $ctype));
  }

  // Clean Drupal cache; this is necessary for the "Delete" link to appear
  // next to the content type created by the feature.
  drupal_flush_all_caches();

}

Dadurch wird die Schaltfläche "Löschen" für diesen Inhaltstyp angezeigt, sodass Sie ihn aus dem Administrator löschen können.

Hoffe das hilft jemandem!

Aram Boyajyan
quelle
1
Zur Verdeutlichung wird der Inhaltstyp dadurch nicht gelöscht. Dadurch wird der Link "Löschen" auf der Seite mit der Auflistung der Inhaltstypen verfügbar. Vielen Dank @ Ivanhoe123!
doub1ejack
1
Ich war auch nicht in der Lage, dies zu tun, während mein Funktionsmodul aktiviert war, aber nach dem Deaktivieren und Deinstallieren (ich habe drush verwendet) funktionierte dies wunderbar. Verknüpfung: Verwenden Sie das Entwicklungsmodul, indem Sie den Inhalt dieser Funktion in / devel / php ablegen. Um den Inhaltstyp programmgesteuert zu löschen, fügen Sie ihn node_type_delete($ctype); nach der Abfrage in die for-Schleife ein.
doub1ejack
Danke für diesen Code. Nachdem ich diesen Code gesehen habe, habe ich meine Datenbank mit phpMyAdmin bearbeitet und die Tabelle "node_type" bearbeitet. Dann habe ich den zu löschenden Kontekttyp gefunden und den Wert "Custom" auf "1" gesetzt. Und schließlich habe ich es aus der Drupal Administration gelöscht.
ANDiTKO
2
mysql> UPDATE node_type SET custom = 1, locked = 0 WHERE type = '<content type machine name>';
Marco Lazzeri
@ MarcoLazzeris Lösung funktionierte perfekt für mich und war viel besser, als mein Funktionsmodul zu aktualisieren, nur um es zu deinstallieren.
Donut
11

Für mich bestand die Lösung darin, die Löschseite manuell zu laden, da auf der Seite mit den Inhaltstypen kein Link "Löschen" vorhanden ist. Dazu müssen Sie die URL nur selbst erstellen, indem Sie dieselbe URL-Struktur wie die Löschseite für andere Inhaltstypen verwenden:

admin / structure / types / manage / YOUR_CONTENT_TYPE_MACHINE_NAME / delete

Daraufhin wurde die Bestätigungsseite zum Löschen des Inhaltstyps aufgerufen, auf der ich den Inhaltstyp löschen konnte.

Informationen hierzu finden Sie in diesem Thread auf Drupal.org:

https://drupal.org/node/1055460#comment-7297680

Grüße,

@cmsdave

cmsdave
quelle
Ich habe gerade den Link für den Anzeigeinhaltstyp zum Löschen geändert und konnte den Inhaltstyp problemlos entfernen. Diese Lösung funktioniert!
Kateye
Hinweis : Bevor dies funktionieren würde, musste ich die Feature- .infoDatei bearbeiten und den Inhaltstyp entfernen, dann wurde sie tatsächlich gelöscht.
Duncanmoo
3

Die obige Methode löscht keine Taxonomien. Dies kann jedoch erreicht werden, indem nach dem Deaktivieren und Deinstallieren des Moduls Folgendes angehängt wird:

// Delete taxonomies.
$machine_names = array('taxonomy_a', 'taxonomy_b');
foreach ($machine_names as $machine_name) {
  $taxonomy = taxonomy_vocabulary_machine_name_load($machine_name);
  taxonomy_vocabulary_delete($taxonomy->vid);
}
Juampy NR
quelle
1

Eine weitere Lösung, die für mich direkt mit der Datenbank in meiner Entwicklungssite zusammenarbeitete. Denken Sie daran, Ihre Datenbank immer zu sichern.

Zum manuellen Löschen eines Inhaltstyps, der mit Feature 16 erstellt wurde, schlägt Nedjo Folgendes vor:

  • Deaktivieren Sie die Funktion. Ich habe manchmal Probleme damit - eine Funktion wird nicht deaktiviert. Entfernen Sie in diesem Fall den Funktionsmodulcode.
  • Ermitteln Sie den Computernamen des zu löschenden Inhaltstyps, z. B. "MeinTyp".
  • Setzen Sie in der Datenbank die Werte der Tabelle "node_type" auf die Standardwerte zurück, als ob der Inhaltstyp manuell über die Benutzeroberfläche erstellt worden wäre:

mysql> UPDATE node_type SET module = 'node', custom = 1, modified = 1, locked = 0 WHERE type = 'mytype';

  • Löschen Sie die Caches, um sicherzustellen, dass die Änderung des Inhaltstyps verfügbar ist.
  • Löschen Sie über die Benutzeroberfläche unter admin / structure / types den Inhaltstyp.
Cayerdis
quelle
0

Wenn Sie das Modul admin_menu verwenden , werden die Links zum Löschen weiterhin im Pulldown-Menü Struktur / Inhaltstypen / [Name des Inhaltstyps] / Löschen angezeigt, auch wenn sie nicht auf der Seite Inhaltstypen angezeigt werden.

Ich würde sagen, dass es ziemlich sicher ist, diesen Link zum Löschen zu verwenden, wenn Sie versichern, dass es keine weiteren Verweise auf diesen Inhaltstyp mehr gibt.

Mirsoft
quelle