web-dev-qa-db-fra.com

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

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 sur plusieurs serveurs lors de l'exécution de update.php. Cependant 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.

20
amateur barista

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.

18
googletorp

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

Notez que field_delete_instance() appelle automatiquement field_delete_field() s'il n'y a plus d'instances, donc field_delete_instance() est 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, dans x_update_7001(), vous modifiez la table {field_config} De manière incohérente et field_delete_instance() doit évidemment être modifié également.

Mais maintenant, l'appel de x_update_7000() à 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é).

9
Berdir