我在模块安装过程中以编程方式创建了内容类型(使用字段存储配置)。
我要在卸载模块时删除该内容类型。
Drupal 8有什么办法做到这一点?
我在模块安装过程中以编程方式创建了内容类型(使用字段存储配置)。
我要在卸载模块时删除该内容类型。
Drupal 8有什么办法做到这一点?
Answers:
没有足够的信誉发表评论,我将其放在这里:
@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();
}
}
要在卸载模块时触发某些操作,您必须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();
}
drupal snippet --code='$content_type = \Drupal::entityManager()->getStorage("node_type")->load("MACHINE_NAME_OF_TYPE"); $content_type->delete();'