Як видалити тип вмісту програмно?


12

Я програмно створив тип вмісту під час встановлення модуля (використовуючи конфігурацію поля).

Я хочу видалити цей тип вмісту під час видалення модуля.

Чи можливо це зробити з Drupal 8?

Відповіді:


15

Просто переконайтеся, що тип вузла залежить від вашого модуля, тоді Drupal автоматично видалить його.

Для прикладу див. 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 snippet --code='$content_type = \Drupal::entityManager()->getStorage("node_type")->load("MACHINE_NAME_OF_TYPE"); $content_type->delete();'
Єдиним

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

Чи видалить це будь-який bundleіз них MACHINE_NAME_OF_TYPE, як відповідь на основі запиту на ідентифікатор вузла чи ні? Я маю на увазі, що це здається дещо дорогим (якщо є багато NID), і я хотів би використовувати це рішення, коли це можливо.
Топ-майстер

1
@ Top-Master - я оновив свою відповідь. Для попереднього видалення всіх вузлів потрібен додатковий крок.
leymannx
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.