Presenta il problema del flusso di lavoro con l'eliminazione di un campo


14

Supponiamo che io sono un tipo di contenuto Personcon campi: Name, Age,Email

Questo tipo di contenuto è controllato da una caratteristica chiamata in testmodo che io possa controllarlo e inviarlo al sito live.

Il mio flusso di lavoro va così:

  • Aggiungo un nuovo campo su PersonchiamatoPhone
  • localmente faccio: drush fu test -y
  • Modifico il test.infoper aumentare il numero di versione
  • Apporto le modifiche al mio repository
  • Spingo la funzione sul sito live (copia i file della funzione)
  • sul sito live faccio: drush fr test -y
  • sul sito live faccio: drush cc all

Quindi il nuovo campo appare sul sito live Person.

Se al primo passaggio rimuovo un campo del Personcampo non verrà eliminato dal sito live. Come lo risolvo? Non voglio eliminarlo manualmente dall'interfaccia utente sul sito live.
Questo flusso di lavoro è corretto?


1
Usa drush fu test -y --version-incre per aumentare automaticamente il numero di versione
Mike

Risposte:


9

Questa è un'arma a doppio taglio, è così per prevenire la cancellazione dei dati che è sempre una buona cosa. Non c'è davvero nulla da risolvere, questo è un comportamento previsto.

È lo stesso flusso di lavoro che usiamo e facciamo da oltre un anno e funziona davvero bene. Direi che è corretto ma è una risposta molto soggettiva.


E se volessi davvero cancellare il campo? Devo esaminare gli hook di aggiornamento? (Sono un principiante D7).
Cherouvim,

3
Gli hook di aggiornamento sarebbero ideali o rimuoverli manualmente.
digitale

2
OK, potrei anche faredrush field-delete field
cherouvim

@cherouvim Quindi dovresti farlo ogni volta che ricrea una funzione?
AlxVallejo,

Un hook_update_N () nel file .install della funzione funzionerebbe.
Mike

10

Il modo corretto per rimuovere il contenuto creato dalle funzionalità è tramite hook_update_N (che dovrebbe essere implementato nel file your_module.install).


L'idea principale con Features è di gestire la configurazione con il codice. L'uso hook_update_Nè coerente con quello, poiché la cancellazione del campo è nel codice (che può essere gestito con il controllo versione) - mentre il comando equivalente drush field-delete fieldnon viene chiamato dal codice gestito; è un passaggio separato della riga di comando che devi eseguire (e ricordare di eseguire).


Perché? Non drush field-delete fieldfunzionerà bene?
Cherouvim,

5
Certo, funzionerebbe e potrebbe essere una soluzione più semplice. Ma l'idea principale di Features è gestire la configurazione con il codice. L'uso hook_update()è coerente con quello, poiché la cancellazione del campo è nel codice (che può essere gestito con il controllo della versione) - mentre il comando drush non viene chiamato dal codice gestito; è un passaggio separato della riga di comando che devi eseguire (e ricordare di eseguire).
smokris,

In quale file di una funzione userò hook_update ()? hook_update () accetta un oggetto nodo come parametro, quindi non è possibile fornirgli un oggetto nodo mentre si abilita la funzione.
subhojit777,

@ subhojit777: Oops, mi sono collegato alla pagina di documentazione hook errata. Ho appena corretto il collegamento; si prega di consultare i documenti per hook_update_N.
smokris,

@smokris :) Ho citato quell'amo nella mia risposta
subhojit777,

2

Crea un nuovo file chiamato "your_feature_name.install"

All'interno del file dichiarare hook_update_N , è possibile utilizzare field_delete_field () e specificare il nome del campo che si desidera eliminare come parametro.

Esegui update.php e i campi verranno eliminati.


0

Se lo stai utilizzando field_phonein altre aree, potresti semplicemente rimuoverlo dal tuo tipo di contenuto Persona, ma non eliminarlo del tutto dal tuo sito. Crea manualmente un YOUR_FEATURE_NAME.installfile nella cartella della tua funzione in questo modo:

/**
 * Implements hook_update_N().
 *
 * Removes field_phone from Person content type.
 */
function YOUR_FEATURE_NAME_update_7001() {
  if ($instance = field_info_instance('node', 'field_phone', 'person')) {
    field_delete_instance($instance);
  }
  field_purge_batch(500);
  features_revert_module('YOUR_FEATURE_NAME');
}

Se lo stavi eliminando da un Paragrafo persona anziché da un Tipo di contenuto persona, puoi modificare la prima istruzione condizionale in qualcosa del genere:

if ($instance = field_info_instance('paragraphs_item', 'field_phone', 'person')) {
  ...
}
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.