Não foi possível excluir o tipo de conteúdo do recurso depois de desinstalá-lo

24

Questão

A desinstalação de um recurso que cria um tipo de conteúdo oculta o link "Excluir" no admin/structure/types.

Edição no Drupal.org

Aram Boyajyan
fonte

Respostas:

15

Solução

Usando um hook_uninstall()arquivo FEATURE_NAME.install e alterando o status do tipo de conteúdo, para que o sistema pense que é um tipo de conteúdo personalizado e desbloqueado.

Eu postei isso também no d.org .

<?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();

}

Isso fará com que o botão "Excluir" apareça para esse tipo de conteúdo, para que você possa excluí-lo do administrador.

Espero que isso ajude alguém!

Aram Boyajyan
fonte
11
Para esclarecer, isso não exclui o tipo de conteúdo; torna disponível o link "excluir" na página de listagem de tipos de conteúdo. Obrigado @ Ivanhoe123!
doub1ejack
11
Além disso, não consegui fazer isso enquanto meu módulo de recursos estava ativado, mas depois de desativar e desinstalar (usei o drush) isso funcionou perfeitamente. Atalho: use o módulo devel soltando o conteúdo desta função em / devel / php. Para excluir programaticamente o tipo de conteúdo, adicione node_type_delete($ctype); após a consulta no loop for.
Duvida #
Obrigado por esse código. Depois de ver esse código, editei meu banco de dados usando o phpMyAdmin e editei a tabela "node_type". Então eu encontrei o tipo de contect que eu queria excluir e defina o valor "Custom" para "1". E finalmente eu apaguei da Administração Drupal.
ANDiTKO
2
mysql> UPDATE node_type SET custom = 1, locked = 0 WHERE type = '<content type machine name>';
Marco Lazzeri
A solução do @ MarcoLazzeri funcionou perfeitamente para mim e foi muito melhor do que ter que atualizar meu módulo de recursos apenas para desinstalá-lo.
rosquinha
11

Para mim, a solução foi carregar a página de exclusão manualmente, pois não há um link "excluir" na página de tipos de conteúdo. Para fazer isso, você só precisa criar o URL seguindo a mesma estrutura de URL que a página de exclusão para outros tipos de conteúdo:

admin / estrutura / tipos / gerenciar / YOUR_CONTENT_TYPE_MACHINE_NAME / delete

Isso exibiu a página de confirmação de exclusão do tipo de conteúdo, que me permitiu excluir o tipo de conteúdo.

Para referência, consulte este tópico no Drupal.org:

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

Saudações,

@cmsdave

cmsdave
fonte
Acabei de alterar o link do tipo de conteúdo de exibição no final para excluir e poderia remover o tipo de conteúdo sem problemas. Esta solução funciona!
Cateye 22/03
Nota : Antes que isso funcionasse, eu tive que editar o .infoarquivo do recurso e remover o tipo de conteúdo, e ele realmente foi excluído.
Duncanmoo
3

O método acima não exclui taxonomias, mas isso pode ser alcançado anexando o seguinte após desativar e desinstalar o módulo:

// 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
fonte
1

Outra solução que funcionou para mim diretamente no banco de dados no meu site de desenvolvimento. Lembre-se de sempre fazer backup do seu banco de dados.

Para excluir manualmente um tipo de conteúdo criado por um recurso # 16, o que o Nedjo sugere é o seguinte:

  • Desative o recurso. Às vezes, tenho problemas com isso - um recurso não desativa. Nesse caso, remova o código do módulo de recurso.
  • Determine o nome da máquina do tipo de conteúdo a ser excluído, por exemplo, 'mytype'.
  • No banco de dados, reverta os valores da tabela node_type para os padrões como se o tipo de conteúdo fosse criado manualmente por meio da interface do usuário:

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

  • Limpe os caches para garantir que a alteração do tipo de conteúdo esteja disponível.
  • Por meio da interface do usuário em admin / structure / types, exclua o tipo de conteúdo.
cayerdis
fonte
0

Se você usar o módulo admin_menu , ainda verá os links para exclusão no menu suspenso Estrutura / Tipos de conteúdo / [nome do tipo de conteúdo] / Excluir, mesmo que eles não sejam exibidos na página de tipos de conteúdo.

Eu diria que é bastante seguro usar esse link de exclusão se você garantir que não há mais outras referências a esse tipo de conteúdo.

Mirsoft
fonte