¿Cómo eliminar un tipo de contenido mediante programación?


12

Creé programáticamente un tipo de contenido durante la instalación de un módulo (usando la configuración de almacenamiento de campo).

Quiero eliminar ese tipo de contenido mientras desinstalo el módulo.

¿Hay alguna manera de hacer esto con Drupal 8?

Respuestas:


14

Solo asegúrese de que el tipo de nodo depende de su módulo, luego Drupal lo eliminará automáticamente.

Vea node.type.book.yml en el módulo de libro para ver un ejemplo, esta es la parte relevante:

dependencies:
  enforced:
    module:
      - book

Tenga en cuenta que los usuarios tendrán que eliminar todo el contenido de ese tipo antes de poder desinstalar el módulo.


9

Esto parece hacerlo por mí.

$content_type = \Drupal::entityManager()->getStorage('node_type')->load('MACHINE_NAME_OF_TYPE');
$content_type->delete();

Un CLI de una línea de esto que usa la consola Drupal con un escape adecuado es:drupal snippet --code='$content_type = \Drupal::entityManager()->getStorage("node_type")->load("MACHINE_NAME_OF_TYPE"); $content_type->delete();'
komlenic

5

Al no tener suficiente crédito para comentar, lo pondré aquí:

@ Berdir, me parece que imponer el módulo en el archivo node.type.custom.yml no es suficiente para imponer la eliminación de los nodos al desinstalar

Tenga en cuenta que los usuarios deberán eliminar todo el contenido de ese tipo antes de poder desinstalar el módulo.

En mi caso, el tipo de contenido se elimina al desinstalar el módulo. Pero la eliminación del contenido personalizado (nodos) no se aplica. Para lograr esto, el módulo personalizado debe implementar el ModuleUninstallValidatorInterface.

Cuando se implementa, el módulo personalizado no se puede desinstalar antes de que se eliminen los nodos personalizados. El cuadro de selección se desactivará.

En lugar de implementar la interfaz, lo estoy haciendo sucio eliminando los nodos en 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

Para activar alguna acción tras la desinstalación de un módulo, debe implementarlo hook_uninstallen el *.installarchivo de su módulo . Antes de eliminar el tipo de contenido, es posible que desee asegurarse de que también se eliminen todos los nodos de ese tipo de contenido. Finalmente, después de desinstalar el módulo y eliminar el tipo de contenido, no olvide exportar la configuración actualizada.

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

¿Esto eliminará algo bundlede MACHINE_NAME_OF_TYPE, como lo hace la respuesta basada en consultas de id de nodo , o no? Quiero decir, eso parece ser algo costoso (si hay muchos NID) y me gustaría usar esta solución cuando sea posible.
Top-Master

1
@ Top-Master: actualicé mi respuesta. Necesita un paso adicional para eliminar todos los nodos primero.
leymannx
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.