Как удалить тип контента программно?


12

Я программно создал тип контента во время установки модуля (используя настройку хранилища на месте).

Я хочу удалить этот тип контента при удалении модуля.

Есть ли способ сделать это с Drupal 8?

Ответы:


14

Просто убедитесь, что тип узла зависит от вашего модуля, тогда 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();

CLI один вкладыш из этого , который использует Drupal консоль с правильными вырваться из тисков является:drupal snippet --code='$content_type = \Drupal::entityManager()->getStorage("node_type")->load("MACHINE_NAME_OF_TYPE"); $content_type->delete();'
komlenic

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), и я хотел бы использовать это решение, когда это возможно.
Top-Master

1
@ Top-Master - я обновил свой ответ. Требуется дополнительный шаг, чтобы сначала удалить все узлы.
Leymannx
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.