Jak usunąć typ zawartości programowo?

12

Programowo utworzyłem typ zawartości podczas instalacji modułu (przy użyciu konfiguracji pamięci masowej w terenie).

Chcę usunąć ten typ zawartości podczas odinstalowywania modułu.

Czy można to zrobić w Drupal 8?

Akash Jain
źródło

Odpowiedzi:

15

Upewnij się tylko, że typ węzła zależy od twojego modułu, a następnie Drupal usunie go automatycznie.

Zobacz na przykład node.type.book.yml w module książki, jest to odpowiednia część:

dependencies:
  enforced:
    module:
      - book

Pamiętaj, że użytkownicy będą musieli usunąć całą zawartość tego typu, zanim będą mogli odinstalować moduł.

Berdir
źródło
9

Wydaje się, że to dla mnie robi.

$content_type = \Drupal::entityManager()->getStorage('node_type')->load('MACHINE_NAME_OF_TYPE');
$content_type->delete();
el1
źródło
drupal snippet --code='$content_type = \Drupal::entityManager()->getStorage("node_type")->load("MACHINE_NAME_OF_TYPE"); $content_type->delete();'
Jednowierszowy
5

Nie mając wystarczających środków do skomentowania, umieszczę to tutaj:

@Berdir, wydaje mi się, że wymuszenie modułu w pliku node.type.custom.yml nie jest wystarczające, aby wymusić usunięcie węzłów podczas odinstalowywania

Pamiętaj, że użytkownicy będą musieli usunąć całą zawartość tego typu, zanim będą mogli odinstalować moduł

W moim przypadku typ zawartości jest usuwany podczas odinstalowywania modułu. Jednak usunięcie niestandardowej treści (węzłów) nie jest wymuszone. Aby to osiągnąć, moduł niestandardowy powinien wdrożyć ModuleUninstallValidatorInterface.

Po wdrożeniu niestandardowego modułu nie można odinstalować przed usunięciem niestandardowych węzłów. Pole wyboru zostanie dezaktywowane.

Zamiast implementować interfejs, robię go brudnym, usuwając węzły w hook_uninstall():

function MYMODULE_uninstall() {

  // Delete custom_type nodes when uninstalling.
  $query = \Drupal::entityQuery('node')
    ->condition('type', 'custom_type');
  $nids = $query->execute();
  // debug($nids);
  foreach ($nids as $nid) {
    \Drupal\node\Entity\Node::load($nid)->delete();
  }
}
Bundio
źródło
3

Aby uruchomić akcję po odinstalowaniu modułu, musisz zaimplementować go hook_uninstallw *.installpliku modułu . Przed usunięciem typu zawartości możesz upewnić się, że wszystkie węzły tego typu treści również zostały usunięte. Wreszcie po odinstalowaniu modułu i usunięciu typu zawartości nie zapomnij wyeksportować zaktualizowanej konfiguracji.

/**
 * Place a short description here. 
 */
function MYMODULE_uninstall() {

  // Delete all nodes of given content type.
  $storage_handler = \Drupal::entityTypeManager()
    ->getStorage('node');
  $nodes = $storage_handler->loadByProperties(['type' => 'MACHINE_NAME_OF_TYPE']);
  $storage_handler->delete($nodes);

  // Delete content type.
  $content_type = \Drupal::entityTypeManager()
    ->getStorage('node_type')
    ->load('MACHINE_NAME_OF_TYPE');
  $content_type->delete();
}
leymannx
źródło
Czy spowoduje to usunięcie jakiejkolwiek bundleodpowiedzi MACHINE_NAME_OF_TYPE, tak jak w przypadku odpowiedzi opartej na zapytaniu o identyfikator węzła , czy nie? Mam na myśli, że wydaje się to nieco kosztowne (jeśli jest wiele identyfikatorów NID) i chciałbym skorzystać z tego rozwiązania, jeśli to możliwe.
Top-Master
1
@ Top-Master - zaktualizowałem swoją odpowiedź. Potrzebuje dodatkowego kroku, aby najpierw usunąć wszystkie węzły.
leymannx