Problème de flux de travail avec la suppression d'un champ

14

Supposons que j'ai un type de contenu Personavec des champs: Name, Age,Email

Ce type de contenu est contrôlé par une fonctionnalité appelée testafin que je puisse le contrôler à la source et le pousser vers le site en direct.

Mon flux de travail se présente comme suit:

  • J'ajoute un nouveau champ sur PersonappeléPhone
  • localement je fais: drush fu test -y
  • J'édite le test.infopour augmenter le numéro de version
  • Je valide les modifications dans mon référentiel
  • Je pousse la fonctionnalité sur le site en direct (copie les fichiers de fonctionnalité)
  • sur le site en direct je fais: drush fr test -y
  • sur le site en direct je fais: drush cc all

Ensuite, le nouveau champ apparaît sur le site en direct Person.

Si lors de la première étape, je supprime un champ, Personle champ ne sera pas supprimé du site en direct. Comment résoudre ce problème? Je ne veux pas avoir à le supprimer manuellement de l'interface utilisateur sur le site en direct.
Ce flux de travail est-il correct?

cherouvim
la source
1
Utilisez drush fu test -y --version-increment pour incrémenter automatiquement le numéro de version
Mike

Réponses:

9

C'est une épée à double tranchant, c'est comme ça pour empêcher la suppression des données ce qui est toujours une bonne chose. Il n'y a vraiment rien à résoudre, c'est un comportement attendu.

C'est le même flux de travail que nous utilisons et faisons depuis plus d'un an et cela fonctionne très bien. Je dirais que c'est correct mais c'est une réponse très subjective.

numérique
la source
Et si je voulais vraiment supprimer le champ? Dois-je examiner les crochets de mise à jour? (Je suis un débutant D7).
cherouvim
3
La mise à jour des crochets serait idéale ou supprimez-la manuellement.
numérique
2
OK, je pourrais aussi fairedrush field-delete field
cherouvim
@cherouvim Vous devez donc le faire à chaque fois que vous recréez une fonctionnalité?
AlxVallejo
Un hook_update_N () dans le fichier .install de la fonctionnalité fonctionnerait.
Mike
10

La bonne façon de supprimer le contenu créé par les fonctionnalités est via hook_update_N (qui doit être implémenté dans le fichier your_module.install).


L'idée principale avec les fonctionnalités est de gérer la configuration avec du code. L'utilisation hook_update_Nest cohérente avec cela, car la suppression du champ est dans le code (qui peut être géré avec le contrôle de version) - tandis que la commande équivalente drush field-delete fieldn'est pas appelée à partir du code géré; il s'agit d'une étape de ligne de commande distincte que vous devez effectuer (et ne pas oublier d'effectuer).

smokris
la source
Pourquoi? Ne drush field-delete fieldfonctionnera pas bien?
cherouvim
5
Bien sûr, cela fonctionnerait et pourrait être une solution plus simple. Mais l'idée principale avec les fonctionnalités est de gérer la configuration avec du code. L'utilisation hook_update()est cohérente avec cela, car la suppression du champ est dans le code (qui peut être géré avec le contrôle de version) - alors que la commande drush n'est pas appelée à partir du code managé; il s'agit d'une étape de ligne de commande distincte que vous devez effectuer (et ne pas oublier d'effectuer).
smokris
Dans quel fichier d'une fonctionnalité vais-je utiliser hook_update ()? hook_update () prend un objet nœud comme paramètre, il n'est donc pas possible de lui fournir un objet nœud tout en activant la fonctionnalité.
subhojit777
@ subhojit777: Oups, j'ai lié à la mauvaise page de documentation du hook. Je viens de corriger le lien; veuillez consulter les documents pour hook_update_N.
smokris
@smokris :) J'ai mentionné ce crochet dans ma réponse
subhojit777
2

Créez un nouveau fichier appelé "your_feature_name.install"

Dans le fichier déclarez hook_update_N , vous pouvez utiliser field_delete_field () et spécifier le nom du champ que vous souhaitez supprimer comme paramètre.

Exécutez update.php et les champs seront supprimés.

subhojit777
la source
0

Si vous utilisez field_phonedans d'autres domaines, vous souhaiterez peut-être simplement le supprimer de votre type de contenu Personne, mais pas le supprimer entièrement de votre site. Créez manuellement un YOUR_FEATURE_NAME.installfichier dans le dossier de votre fonctionnalité comme suit:

/**
 * 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 vous supprimiez cela d'un paragraphe Personne au lieu d'un type de contenu Personne, vous pouvez remplacer la première instruction conditionnelle par quelque chose comme ceci:

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