如何以编程方式删除内容类型?


12

我在模块安装过程中以编程方式创建了内容类型(使用字段存储配置)。

我要在卸载模块时删除该内容类型。

Drupal 8有什么办法做到这一点?

Answers:


15

只要确保节点类型取决于您的模块,Drupal就会自动为您删除它。

有关示例,请参见book模块中的node.type.book.yml,这是相关的部分:

dependencies:
  enforced:
    module:
      - book

请注意,用户必须先删除该类型的所有内容,然后才能卸载模块。


9

这似乎为我做。

$content_type = \Drupal::entityManager()->getStorage('node_type')->load('MACHINE_NAME_OF_TYPE');
$content_type->delete();

使用Drupal控制台并进行适当转义的CLI单一代码是:drupal snippet --code='$content_type = \Drupal::entityManager()->getStorage("node_type")->load("MACHINE_NAME_OF_TYPE"); $content_type->delete();'
komlenic

5

没有足够的信誉发表评论,我将其放在这里:

@Berdir,在我看来,在node.type.custom.yml文件中强制执行模块不足以在卸载时强制执行节点的删除

请注意,用户必须先删除该类型的所有内容,然后才能卸载模块,然后

就我而言,卸载模块时会删除内容类型。但是不强制删除自定义内容(节点)。为此,自定义模块应实现ModuleUninstallValidatorInterface

实施后,在删除自定义节点之前无法卸载自定义模块。选择框将被禁用。

我没有实现接口,而是通过删除以下节点来使它变脏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();
  }
}

3

要在卸载模块时触发某些操作,您必须hook_uninstall在模块*.install文件中实现。在删除内容类型之前,您可能需要确保删除该内容类型的所有节点。最后,在卸载模块并删除内容类型后,不要忘记导出更新的配置。

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

是否会像基于节点ID查询的答案那样删除的任何bundle内容?我的意思是,这似乎有点昂贵(如果有很多NID),并且我想在可能的情况下使用此解决方案。MACHINE_NAME_OF_TYPE
顶级

1
@ Top-Master –我更新了答案。首先需要删除所有节点,这需要额外的步骤。
leymannx
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.