Я программно создал тип контента во время установки модуля (используя настройку хранилища на месте).
Я хочу удалить этот тип контента при удалении модуля.
Есть ли способ сделать это с Drupal 8?
Я программно создал тип контента во время установки модуля (используя настройку хранилища на месте).
Я хочу удалить этот тип контента при удалении модуля.
Есть ли способ сделать это с Drupal 8?
Ответы:
Просто убедитесь, что тип узла зависит от вашего модуля, тогда Drupal автоматически удалит его для вас.
См. Node.type.book.yml в модуле книги для примера, это соответствующая часть:
dependencies:
enforced:
module:
- book
Обратите внимание, что пользователям придется удалить все содержимое этого типа, прежде чем они смогут удалить модуль.
Не имея достаточного количества комментариев, я выложу это здесь:
@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();
}
bundle
из MACHINE_NAME_OF_TYPE
, как запрос узла-ид на основе ответ делает, или нет? Я имею в виду, что это кажется довольно дорогим (если есть много NID), и я хотел бы использовать это решение, когда это возможно.
drupal snippet --code='$content_type = \Drupal::entityManager()->getStorage("node_type")->load("MACHINE_NAME_OF_TYPE"); $content_type->delete();'