2012-11-28 9 views
6

Sto cercando di imparare come creare un tipo di contenuto personalizzato a livello di codice dal mio modulo.Come rimuovere le tracce di campi appartenenti a un tipo di contenuto del modulo?

Tuttavia, dopo aver disinstallato e reinstallato il mio modulo, ricevevo un errore che indicava che uno o più campi che stavo tentando di creare non potevano essere creati perché già esistono.

Così sono andato l'hacking attraverso il mio databse, rimuovendo il tipo di contenuto e tutti i tavoli che appartenevano ad esso.

Stesso risultato - campo esiste già.

dopo sono andato al sito API Drupal alla ricerca di modi per eliminare i campi e le istanze di campo, e mi sono imbattuto

field_delete_field() 

e

field_delete_instance() 

ho fatto una pagina php per cercare di eliminare il campi che avevo creato, solo per ottenere un errore affermando che la tabella che stavo cercando di eliminare non esiste.

Così mi sono un po 'bloccato - non riesco a creare i campi perché esistono già, e non posso eliminarli perché non esistono!

BTW il codice che stavo modellando il mio modulo dopo è il codice trovato nella sezione "node_example" di Drupal examples module.

risposta

4

Ahi, eliminando le tabelle del database manualmente non è mai una buona idea - Drupal non è così indulgente :)

Proprio per affrontare il codice nel tuo installare/attivare gancio, avvolgere la creazione campo:

if (!field_info_field('field_name')) { 
    field_create_field(... 
} 

Ciò consentirà di arrestare nuovamente il problema. O se non vuoi farlo, assicurati che il campo sia cancellato nel hook di disinstallazione/disabilitazione. Ovviamente questo metodo potrebbe potenzialmente causare una perdita di dati.

per affrontare il problema attuale, seguire questo processo:

  • disinstallare completamente (non solo disabilita) il modulo personalizzato. Se si trova in uno stato incoerente, è sufficiente eliminare la riga nella tabella system.
  • Eliminare tutte le tracce del campo dalle tabelle field_config e field_config_instance.
  • Tronca tutte le tabelle della cache manualmente (qualsiasi tabella che inizia con cache_).
  • non strettamente necessario, ma chiarire qualsiasi contenuto persistente:

    $nids = db_query('SELECT nid FROM {node} WHERE type = :type', array(':type' => 'type'))->fetchCol(); 
    node_delete_multiple($nids); 
    

Questo dovrebbe farlo.

Ogni volta che si elimina un campo, tramite l'interfaccia utente o programmaticamente, è necessario eseguire cron o chiamare field_purge_batch() in "difficile" eliminare i campi poiché sono solo contrassegnati per l'eliminazione nella prima istanza.

+0

Grazie mille! – Tyler

Problemi correlati