Presenta un problema de flujo de trabajo al eliminar un campo

14

Supongamos que tengo un tipo de contenido Personcon los campos: Name, Age,Email

Este tipo de contenido está controlado por una característica llamada, testpor lo que puedo controlarlo desde la fuente y llevarlo al sitio en vivo.

Mi flujo de trabajo es así:

  • Agrego un nuevo campo en PersonllamadoPhone
  • localmente hago: drush fu test -y
  • Edito el test.infopara aumentar el número de versión
  • Confirmo los cambios en mi repositorio
  • Empujo la función al sitio en vivo (copie los archivos de funciones)
  • en el sitio en vivo que hago: drush fr test -y
  • en el sitio en vivo que hago: drush cc all

Luego, el nuevo campo aparece en el sitio en vivo Person.

Si en el primer paso elimino un campo del Personcampo no se eliminará del sitio en vivo. ¿Cómo puedo solucionar esto? No quiero tener que eliminarlo manualmente de la interfaz de usuario en el sitio en vivo.
¿Es correcto este flujo de trabajo?

cherouvim
fuente
1
Use drush fu test -y --version-increment para incrementar automáticamente el número de versión
Mike

Respuestas:

9

Esta es una espada de doble filo, es así para evitar la eliminación de datos, que siempre es algo bueno. Realmente no hay nada que resolver, este es el comportamiento esperado.

Es el mismo flujo de trabajo que utilizamos y lo hemos estado haciendo durante más de un año y funciona muy bien. Yo diría que es correcto, pero esa es una respuesta muy subjetiva.

digital
fuente
¿Y si realmente quisiera eliminar el campo? ¿Debería buscar en los ganchos de actualización? (Soy un novato D7).
cherouvim
3
Actualizar ganchos sería ideal, o eliminarlo manualmente.
digital
2
OK, también podría hacerlodrush field-delete field
cherouvim
@cherouvim ¿Tendría que hacer eso cada vez que recrea una característica?
AlxVallejo
Un hook_update_N () en el archivo .install de la característica funcionaría.
Mike
10

La forma correcta de eliminar el contenido creado por las características es a través de hook_update_N (que debe implementarse en el archivo your_module.install).


La idea principal con Características es administrar la configuración con código. El uso hook_update_Nes coherente con eso, ya que la eliminación del campo está en el código (que se puede administrar con control de versiones), mientras que el comando equivalente drush field-delete fieldno se llama desde el código administrado; es un paso separado de la línea de comandos que debe realizar (y recordar realizar).

smokris
fuente
¿Por qué? ¿No drush field-delete fieldfuncionará bien?
cherouvim
55
Claro, eso funcionaría, y puede ser una solución más simple. Pero la idea principal con Características es administrar la configuración con código. El uso hook_update()es coherente con eso, ya que la eliminación del campo está en el código (que se puede administrar con control de versiones), mientras que el comando drush no se llama desde el código administrado; es un paso separado de la línea de comandos que debe realizar (y recordar realizar).
smokris
¿En qué archivo de una característica usaré hook_update ()? hook_update () toma un objeto nodo como parámetro, por lo que no es posible proporcionarle un objeto nodo mientras se habilita la función.
subhojit777
@ subhojit777: Vaya, he vinculado a la página de documentación del gancho equivocado. Acabo de arreglar el enlace; por favor vea los documentos para hook_update_N.
smokris
@smokris :) Mencioné ese gancho en mi respuesta
subhojit777
2

Cree un nuevo archivo llamado "your_feature_name.install"

Dentro del archivo declare hook_update_N , allí puede usar field_delete_field () y especificar el nombre del campo que desea eliminar como parámetro.

Ejecute update.php y los campos serán eliminados.

subhojit777
fuente
0

Si está utilizando field_phoneotras áreas, es posible que solo desee eliminarlo del tipo de contenido Persona, pero no eliminarlo por completo de su sitio. Cree manualmente un YOUR_FEATURE_NAME.installarchivo en la carpeta de su función de la siguiente manera:

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

Si estaba borrando esto de un párrafo de persona en lugar de un tipo de contenido de persona, podría cambiar la primera declaración condicional a algo como esto:

if ($instance = field_info_instance('paragraphs_item', 'field_phone', 'person')) {
  ...
}
jimafisk
fuente