Я програмно створив тип вмісту під час встановлення модуля (використовуючи конфігурацію поля).
Я хочу видалити цей тип вмісту під час видалення модуля.
Чи можливо це зробити з 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();'