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?
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?
Respostas:
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.
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();
}
}
Para desencadear alguma ação na desinstalação de um módulo, você deve implementar hook_uninstall
no *.install
arquivo 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();
}
bundle
de 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.
drupal snippet --code='$content_type = \Drupal::entityManager()->getStorage("node_type")->load("MACHINE_NAME_OF_TYPE"); $content_type->delete();'