Quelle est la bonne façon de supprimer par programme une entrée de champ spécifique pour un champ à entrées multiples d'une entité spécifique? (ce sont des champs et des entités spécifiques, pas des types de champs ou des instances et des types d'entités)
Voici quelques possibilités que j'ai examinées et qui ne fonctionnent pas:
- Chargement de l'entité avec
entity_load()
, définition de l'entrée de champ sur = null ou = array (), puis enregistrement avecfield_attach_update()
. C'est le plus proche que j'ai trouvé, mais il laisse une entrée de champ nul zombie dans la base de données qui apparaît comme une ligne vide sur les formulaires jusqu'à ce que le formulaire soit enregistré ethook_field_is_empty()
puisse démarrer (hook_field_is_empty()
est configuré de telle sorte que = null ou = array () marquera comme vide). - Chargement de l'entité avec
entity_load()
, suppression de l'entrée de champ par clé, puis enregistrement avecfield_attach_update()
. Cela semble ne rien faire - il semble que Drupal interprète l'entrée comme n'étant pas là comme un signe pour ne pas la modifier. (étrangement, j'obtiens également parfois des délais d'expiration de temps de requête maximum en essayant cette approche) field_attach_delete()
- c'est beaucoup trop brutal: il tue tous les champs de l'entitéfield_purge_data()
- mieux, mais toujours trop brutal: il tue toutes les entrées du champ, pas les entrées spécifiques
Donc, pour clarifier, j'ai un code qui trouve (et charge) une entité qui a un champ qui a plusieurs entrées et trouve une entrée spécifique sur ce champ qui doit être supprimée. Je souhaite supprimer complètement cette entrée, sans toucher aucune autre entrée ni aucun autre champ de l'entité.
J'avais besoin de le faire dans le cadre d'un nettoyage de migration Drupal8.
Après quelques expérimentations, j'ai trouvé que l'itération puis l'utilisation de unset () sur le delta pouvaient le tuer. Mon exemple consistait à supprimer une balise (par conséquent, je recherche «target_id», pas «value» comme vous le feriez souvent pour d'autres champs.
Et après, en cas de succès, alors
$object->save();
la source
Pour Drupal 8, pour supprimer un champ d'une entité:
Cela appellera la méthode magique __unset () de ContentEntityBase:
N'oubliez pas que, pour conserver vos changements, vous devez appeler
Après avoir effectué toutes vos modifications.
la source
C'est la meilleure façon:
la source
la méthode préférée actuelle emploierait l'entité_metadata_wrapper
c'est le meilleur tutoriel sur l'EMW que j'ai vu http://deeson-online.co.uk/labs/programately-access-field-data-using-entitymetadatawrapper-drupal
la source