卸载功能后无法删除功能内容类型


Answers:


15

使用hook_uninstall()FEATURE_NAME.install文件中的文件并更改内容类型的状态,因此系统认为它是未锁定的自定义内容类型。

我也在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();

}

这将使该内容类型出现“删除”按钮,因此您可以从管理员中删除它。

希望这对某人有帮助!


1
需要说明的是,这不会删除内容类型。它使“删除”链接在内容类型列表页面中可用。谢谢@ Ivanhoe123!
doub1ejack

1
另外,在启用功能模块时,我无法执行此操作,但是在禁用和卸载(我使用drush)后,此功能运行良好。快捷方式:通过将此功能的内容拖放到/ devel / php中来使用devel模块。要以编程方式删除内容类型node_type_delete($ctype); ,请在for循环中的查询后添加。
doub1ejack

感谢您的代码。看到此代码后,我使用phpMyAdmin编辑了数据库并编辑了“ node_type”表。然后我发现想要删除的接触类型并将“自定义”值设置为“ 1”。最后我从Drupal Administration删除了它。
ANDiTKO 2013年

2
mysql> UPDATE node_type SET custom = 1, locked = 0 WHERE type = '<content type machine name>';
Marco Lazzeri 2014年

@MarcoLazzeri的解决方案对我来说非常有效,并且比仅卸载我的功能模块要好得多。
甜甜圈2014年

11

对我而言,解决方案是手动加载删除页面,因为内容类型页面上没有“删除”链接。为此,您只需要自己构建URL,就其他内容类型而言,遵循与删除页面相同的URL结构即可:

管理员/结构/类型/管理/ YOUR_CONTENT_TYPE_MACHINE_NAME /删除

这显示了内容类型删除确认页面,然后允许我删除内容类型。

作为参考,请参阅Drupal.org上的该线程:

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

问候,

@cmsdave


我只是将显示内容类型链接更改为末尾以删除,并且可以毫无问题地删除内容类型。此解决方案有效!
cateye

注意:在此之前,我必须编辑功能的.info文件并删除内容类型,然后才将其删除。
Duncanmoo 2014年

3

上面的方法不会删除分类法,但是可以通过在禁用和卸载模块后附加以下内容来实现:

// 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);
}

1

另一种对我直接起作用的解决方案是开发站点中的数据库。切记始终备份数据库。

要手动删除功能 16 创建的内容类型,Nedjo建议以下内容:

  • 禁用该功能。有时我会遇到一些问题-功能不会禁用。在这种情况下,请删除功能模块代码。
  • 确定要删除的内容类型的机器名称,例如“ mytype”。
  • 在数据库中,将node_type表的值还原为默认值,就好像通过UI手动创建内容类型一样:

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

  • 清除缓存以确保内容类型更改可用。
  • 通过位于admin / structure / types的UI,删除内容类型。

0

如果使用admin_menu模块,即使它们未显示在内容类型页面上,您仍将在下拉菜单“结构/内容类型/ [内容类型名称] /删除”中看到删除链接。

我要说的是,如果您确保不再有对此内容类型的其他引用,那么使用此删除链接是非常安全的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.