Come eliminare un tipo di contenuto, a livello di codice?


12

Ho creato a livello di codice un tipo di contenuto durante l'installazione di un modulo (usando la configurazione della memoria di campo).

Voglio eliminare quel tipo di contenuto durante la disinstallazione del modulo.

C'è un modo per farlo con Drupal 8?

Risposte:


14

Assicurati solo che il tipo di nodo dipenda dal tuo modulo, quindi Drupal lo cancellerà automaticamente per te.

Vedi node.type.book.yml nel modulo libro per un esempio, questa è la parte rilevante:

dependencies:
  enforced:
    module:
      - book

Si noti che gli utenti dovranno eliminare tutto il contenuto di quel tipo prima di poter disinstallare il modulo.


9

Questo sembra farlo per me.

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

Un esempio CLI di questo che utilizza Drupal Console con una corretta escape è:drupal snippet --code='$content_type = \Drupal::entityManager()->getStorage("node_type")->load("MACHINE_NAME_OF_TYPE"); $content_type->delete();'
komlenic

5

Non avendo abbastanza credito per commentare, lo metterò qui:

@Berdir, mi sembra che l'applicazione del modulo nel file node.type.custom.yml non sia sufficiente per imporre la cancellazione dei nodi durante la disinstallazione

Si noti che gli utenti dovranno eliminare tutto il contenuto di quel tipo prima di poter disinstallare il modulo

Nel mio caso il tipo di contenuto viene eliminato durante la disinstallazione del modulo. Ma la cancellazione del contenuto personalizzato (nodi) non viene applicata. Per raggiungere questo obiettivo il modulo personalizzato dovrebbe implementare il ModuleUninstallValidatorInterface.

Se implementato, il modulo personalizzato non può essere disinstallato prima dell'eliminazione dei nodi personalizzati. La casella di selezione verrà disattivata.

Invece di implementare l'interfaccia, lo sto facendo sporco eliminando i nodi in 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

Per attivare alcune azioni al momento della disinstallazione di un modulo, è necessario implementarlo hook_uninstallnel *.installfile del modulo . Prima di eliminare il tipo di contenuto, è possibile assicurarsi che vengano eliminati anche tutti i nodi di quel tipo di contenuto. Infine, dopo aver disinstallato il modulo e aver eliminato il tipo di contenuto, non dimenticare di esportare la configurazione aggiornata.

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

Sarà questo eliminare qualsiasi bundledi MACHINE_NAME_OF_TYPE, come l' interrogazione del nodo-id risposta basata fa, o no? Voglio dire, sembra essere un po 'costoso (se ci sono molti NID) e vorrei usare questa soluzione quando possibile.
Top-Master il

1
@ Top-Master: ho aggiornato la mia risposta. È necessario un ulteriore passaggio per eliminare prima tutti i nodi.
leymannx,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.