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