D7 : Cloner les données d'un field = un autre.

Lors d'une réalisation, les utilisateurs avaient un champ de type "référence à un terme de taxonomie". J'ai du mettre en place le module profile2 sur ce site, et déplacer ce champs vers le profile2 de l'utilisateur et non plus directement à l'entité utilisateur.

Pour faire ceci, j'ai donc crée un profil profile2. J'y'ai ajouté un field de type "référence à un terme de taxonomie" relié au même vocabulaire que celui de l'entité utilisateur.

Rester ensuite à copier les données de l'ancien field vers le nouveau pour préserver les données rentrées par l'utilisateur.

Pour cela, j'ai éxécuté le code php suivant :


$query = 'SELECT DISTINCT(ur.uid) 
  FROM {users_roles} AS ur
  WHERE ur.rid IN (:rids)';
$result = db_query($query, array(':rids' => array(8,9,6,10)));

$uids = $result->fetchCol();

dpm($uids);

foreach($uids as $value){
$user=user_load($value);
$profile = profile2_create(array('type' => 'editeur', 'uid' => $user->uid));
$profile->field_genres['und'] = $user->field_taxo_genre_test_user['und'];
profile2_save($profile); 

}

Je charge avec la fonction db_query, un tableau de tous les uids correspondant aux roles sur lesquels je souhaite effectuer des modifications.

Puis pour chaque élément :

  • Je crée avec la fonction profile2_create une entité profile2 relié à cet utilisateur, en précisant qu'on l'affecte à  l utilisateur en cours, et que le profile2 est de type lecteur.
  • J'ai précédemment chargé l'entité user concerné avec la fonction user_load().
  • J'affecte ensuite au field field_genres de mon nouveau profile2 créé, la valeur du champs field_taxo_genre_test_user de l'entité user
  • Enfin je la sauve avec profile2_save();

Une autre option envisageable aurait été de faire appel au moduule view_bulk_operation, et de lui faire éxécuter un snippet php sur chaque utilisateur concerné qui serait listé grace à une vue et d'y mettre un code similaire.