La mejor manera de eliminar un campo de un tipo de contenido

21

¿Cuál es la mejor manera de eliminar un campo Drupal 7 de un tipo de contenido definido a través de la GUI? Quiero usar hook_update_N para que los cambios se puedan propagar a varios servidores al ejecutar update.php. Sin embargo, parece que no puedo encontrar una solución. db_drop_table () tendría sentido para mí para esquemas definidos personalizados, pero no para un tipo / campo de contenido definido a través de la GUI.

barista aficionado
fuente
creaste un módulo personalizado para definir un tipo de contenido?
iStryker
iStryker: creó el tipo de contenido a través de la interfaz de administración, agregó algunos campos y luego lo exportó a través de Feature. Pero ahora quiero eliminar uno de esos campos mediante programación.
barista aficionado
Notó que D5 proporciona una función content_field_instance_delete () , documentada aquí y aquí , pero esa función no está disponible para D7. También es curioso qué field.install en D7 core utiliza para eliminar campos: _update_7000_field_delete_instance () - una función "interna" personalizada que no está disponible para que otros la usen. Para algo tan importante como los campos, me parece que debería haber una función "pública" disponible en algún lugar, y eso es lo que estoy buscando.
barista aficionado
Actualmente mi función pública "candidata" es field_delete_instance ().
barista aficionado

Respuestas:

18

Hay dos funciones de API para eliminar campos:

Si no desea reutilizar el campo, puede ser un poco más limpio eliminar todo el campo en lugar de eliminar solo la instancia del tipo de contenido en cuestión. Solo tú puedes ser el juez de eso.

googletorp
fuente
2
Trabajado como un encanto. La función no devuelve ningún argumento, por lo que cuando se usa en combinación con un hook_update_N () recomendaría hacer un watchdog () para registrar sus cambios de actualización.
barista aficionado
9

Sí, field_delete_instance () es la función para eliminar instancias de campo.

Tenga en cuenta que field_delete_instance()llama automáticamente field_delete_field()si no quedan instancias restantes, por field_delete_instance()lo que probablemente sea todo lo que necesitará.

_update_7000_field_delete_instance()está diseñado para funciones de actualización principales. Ejemplo: en la función de actualización x_update_7000(), está utilizando field_delete_instance(). Luego x_update_7001(), en , cambia la {field_config}tabla de una manera inconsistente y field_delete_instance()obviamente también debe cambiarse.

Pero ahora x_update_7000()la llamada a field_delete_instance()resultaría en un error porque la tabla todavía está en la estructura anterior. Sin embargo, la situación para los módulos contribuidos es diferente, ya que siempre deben ejecutarse después de todas las actualizaciones principales y, por lo tanto, deben funcionar con la versión principal más reciente.

Pero, este es un patrón que es posible que desee utilizar para sus propias funciones API que está utilizando en las funciones de actualización.

Además, estas funciones _update no ejecutan enlaces porque el resultado no es predecible (por ejemplo, porque el módulo para el que se ejecuta la actualización podría estar deshabilitado).

Berdir
fuente