Il modo migliore per eliminare un campo da un tipo di contenuto


21

Qual è il modo migliore per rimuovere un campo Drupal 7 da un tipo di contenuto definito tramite la GUI? Voglio usare hook_update_N in modo che le modifiche possano essere propagate a più server durante l'esecuzione di update.php. Tuttavia, non riesco a trovare una soluzione. db_drop_table () avrebbe senso per me per schemi definiti personalizzati, ma non per un tipo / campo di contenuto definito attraverso la GUI.


hai creato un modulo personalizzato per definire un tipo di contenuto?
iStryker,

iStryker: creato il tipo di contenuto tramite l'interfaccia di amministrazione, aggiunto alcuni campi, quindi esportato tramite Funzione. Ma ora voglio rimuovere uno di quei campi a livello di codice.
barista dilettante

Notato che D5 fornisce una funzione content_field_instance_delete () , documentata qui e qui , ma quella funzione non è disponibile per D7. Inoltre è curioso di sapere quale field.install nel core D7 utilizza per eliminare un campo: _update_7000_field_delete_instance () - una funzione "interna" personalizzata che non è disponibile per altri. Per qualcosa di così importante come i campi, mi sembra che ci dovrebbe essere una funzione "pubblica" disponibile da qualche parte, ed è quello che sto cercando.
barista dilettante

Attualmente la mia funzione pubblica "candidata" è field_delete_instance ().
barista dilettante

Risposte:


18

Esistono due funzioni API per eliminare i campi:

Se non si desidera riutilizzare il campo, potrebbe essere un po 'più pulito eliminare l'intero campo invece di eliminare solo l'istanza di esso sul tipo di contenuto in questione. Solo tu puoi essere il giudice di quello.


2
Ha funzionato come un fascino. La funzione non restituisce alcun argomento, quindi quando si utilizza in combinazione con un hook_update_N (), consiglierei di fare un watchdog () per registrare le modifiche di aggiornamento.
barista dilettante

9

Sì, field_delete_instance () è la funzione per eliminare le istanze del campo.

Nota che field_delete_instance()chiama automaticamente field_delete_field()se non ci sono istanze rimanenti, quindi field_delete_instance()è molto probabilmente tutto ciò di cui avrai bisogno.

_update_7000_field_delete_instance()è progettato per le funzioni di aggiornamento principali. Esempio: nella funzione di aggiornamento x_update_7000(), si sta utilizzando field_delete_instance(). Quindi x_update_7001(), si modifica la {field_config}tabella in modo incoerente e field_delete_instance()ovviamente è necessario modificare anche.

Ma ora x_update_7000()la chiamata a field_delete_instance()comporterebbe un errore perché la tabella è ancora nella vecchia struttura. Tuttavia, la situazione per i moduli contribuiti è diversa, poiché dovrebbero sempre essere eseguiti dopo tutti gli aggiornamenti di base e quindi devono funzionare con la versione di base più recente.

Ma questo è uno schema che potresti voler usare per le tue funzioni API che stai usando nelle funzioni di aggiornamento.

Inoltre, queste funzioni _update non eseguono hook perché il risultato non è prevedibile (ad esempio perché il modulo per il quale viene eseguito l'aggiornamento potrebbe essere disabilitato).

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.