Meilleure façon de supprimer un champ d'un type de contenu

21

Quelle est la meilleure façon de supprimer un champ Drupal 7 d'un type de contenu défini via l'interface graphique? Je souhaite utiliser hook_update_N afin que les modifications puissent être propagées à plusieurs serveurs lors de l'exécution de update.php. Mais je n'arrive pas à trouver de solution. db_drop_table () aurait du sens pour moi pour les schémas personnalisés, mais pas pour un type / champ de contenu défini via l'interface graphique.

barista amateur
la source
vous avez créé un module personnalisé pour définir un type de contenu?
iStryker
iStryker: créé le type de contenu via l'interface d'administration, ajouté quelques champs, puis exporté via Feature. Mais maintenant, je veux supprimer l'un de ces champs par programme.
barista amateur
A noté que D5 fournit une fonction content_field_instance_delete () , documentée ici et ici , mais cette fonction n'est pas disponible pour D7. Il est également curieux de savoir ce que field.install dans le noyau D7 utilise pour supprimer un champ: _update_7000_field_delete_instance () - une fonction "interne" personnalisée qui n'est pas disponible pour les autres. Pour quelque chose d'aussi important que les champs, il me semble qu'il devrait y avoir une fonction "publique" disponible quelque part, et c'est ce que je recherche.
barista amateur
Actuellement, ma fonction publique "candidate" est field_delete_instance ().
barista amateur

Réponses:

18

Il existe deux fonctions API pour supprimer des champs:

  • field_delete_field Pour supprimer le champ entier (toutes les instances du champ)
  • field_delete_instance Pour supprimer uniquement une instance d'un champ - c'est ainsi qu'il est attaché à une entité.

Si vous ne souhaitez pas réutiliser le champ, il peut être un peu plus propre de supprimer l'intégralité du champ au lieu d'en supprimer uniquement l'instance sur le type de contenu en question. Vous seul pouvez en être le juge.

googletorp
la source
2
A fonctionné comme un charme. La fonction ne renvoie aucun argument, donc lors de l'utilisation en combinaison avec un hook_update_N (), je recommanderais de faire un watchdog () pour enregistrer vos modifications de mise à jour.
barista amateur
9

Oui, field_delete_instance () est la fonction pour supprimer les instances de champ.

Notez qu'il field_delete_instance()appelle automatiquement field_delete_field()s'il n'y a pas d'instances restantes, c'est donc field_delete_instance()probablement tout ce dont vous aurez besoin.

_update_7000_field_delete_instance()est conçu pour les fonctions de mise à jour principales. Exemple: dans la fonction de mise à jour x_update_7000(), vous utilisez field_delete_instance(). Ensuite x_update_7001(), vous modifiez la {field_config}table de manière incohérente et field_delete_instance()vous devez évidemment la modifier également.

Mais x_update_7000()l'appel de now field_delete_instance()entraînerait une erreur car la table est toujours dans l'ancienne structure. Cependant, la situation des modules contribués est différente, car ils doivent toujours être exécutés après toutes les mises à jour de base et doivent donc fonctionner avec la version de base la plus récente.

Mais, c'est un modèle que vous voudrez peut-être utiliser pour vos propres fonctions API que vous utilisez dans les fonctions de mise à jour.

En outre, ces fonctions _update n'exécutent pas de hooks car le résultat n'est pas prévisible (par exemple, car le module pour lequel la mise à jour est exécutée peut être désactivé).

Berdir
la source