Como excluir um tipo de conteúdo programaticamente?

12

Criei programaticamente um tipo de conteúdo durante a instalação do módulo (usando a configuração de armazenamento em campo).

Quero excluir esse tipo de conteúdo enquanto desinstala o módulo.

Existe alguma maneira de fazer isso com o Drupal 8?

Akash Jain
fonte

Respostas:

14

Apenas certifique-se de que o tipo de nó dependa do seu módulo e o Drupal o excluirá automaticamente para você.

Consulte node.type.book.yml no módulo book para obter um exemplo, esta é a parte relevante:

dependencies:
  enforced:
    module:
      - book

Observe que os usuários terão que excluir todo o conteúdo desse tipo antes de poderem desinstalar o módulo.

Berdir
fonte
9

Isso parece fazer isso por mim.

$content_type = \Drupal::entityManager()->getStorage('node_type')->load('MACHINE_NAME_OF_TYPE');
$content_type->delete();
el1
fonte
Uma linha de drupal snippet --code='$content_type = \Drupal::entityManager()->getStorage("node_type")->load("MACHINE_NAME_OF_TYPE"); $content_type->delete();'
comando
5

Não tendo crédito suficiente para comentar, vou colocá-lo aqui:

@Berdir, parece-me que a imposição do módulo no arquivo node.type.custom.yml não é suficiente para impor a exclusão dos nós ao desinstalar

Observe que os usuários terão que excluir todo o conteúdo desse tipo antes de poderem desinstalar o módulo.

No meu caso, o tipo de conteúdo é excluído ao desinstalar o módulo. Mas a exclusão do conteúdo personalizado (nós) não é imposta. Para conseguir isso, o módulo personalizado deve implementar o ModuleUninstallValidatorInterface.

Quando implementado, o módulo personalizado não pode ser desinstalado antes que os nós personalizados sejam excluídos. A caixa de seleção será desativada.

Em vez de implementar a Interface, estou fazendo isso sujo, excluindo os nós em 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
fonte
3

Para desencadear alguma ação na desinstalação de um módulo, você deve implementar hook_uninstallno *.installarquivo do seu módulo . Antes de excluir o tipo de conteúdo, convém garantir que todos os nós desse tipo também sejam excluídos. Finalmente, após desinstalar o módulo e excluir o tipo de conteúdo, não se esqueça de exportar a configuração atualizada.

/**
 * 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
fonte
Será que isto vai excluir qualquer bundlede MACHINE_NAME_OF_TYPE, como a consulta nó-id resposta baseada faz, ou não? Quero dizer, isso parece ser um pouco caro (se houver muitos NIDs) e eu gostaria de usar essa solução sempre que possível.
Principal mestre
1
@ Top-Master - atualizei minha resposta. Ele precisa de uma etapa extra para excluir todos os nós primeiro.
Leymannx