node_save d’un stdClass incomplet, jusqu’ici tout allait bien !

Après un changement d’hébergeur, me revoilà de retour !

Il m’est arrivé ces derniers jours bien des problèmes suite à la mise à jour du module « field_collection ». Ce module est certes génial, et presque indispensable selon les types de contenus à mettre en place, mais alors … que de soucis … je dirais qu’en 2 ans, sur les gros soucis que j’ai pu rencontrer quant aux données pures, field_collection était souvent en cause.

Il faut dire que le module réalise quelque-chose de techniquement pas téléphoné…

Venons-en au sujet !

Les contributeurs de mon site ont soudainement retrouvé tous les « field_collection » de leurs contenus vides …

c’est plutôt gênant, heureusement que j’avais des dumps quotidiens !!

 

Pourquoi ?

j’ai un batch nocture qui synchronise des données d’un logiciel tiers vers Drupal.

Pour ne pas faire un node_load coûteux avant le node_save, je me contentais de créer un objet stdClass, et de n’y mettre QUE les champs à mettre à jour.

Ca fonctionnait très bien jusqu’alors, mais le module field_collection s’est mis à gérer les révisions et dans un hook_field_update, à virer les collections qui n’existent plus dans le noeud.

Pour se faire, il compare le $node->original->mon_champ_fieldcollection au $node->mon_champ_fieldcollection

Autrement dit, il faut désormais faire obligatoirement un node_load avant le node_save, sinon le noeud n’est pas complet et field_collection croit à tord que le champ à été vidé !!

 

Exemple

Avant

$node->log = 'mise à jour nocture du (...)';
$node->nid = 2209;
$node->uid = 1;$node->title='titre';
$node->field_un_champ_a_mettre_a_jour[LANGUAGE_NONE]['value'] = 'test';

node_save($node);

Après

$node = node_load(2209);
$node->log = 'mise à jour nocture du (...)';
$node->uid = 1;$node->title='titre';
$node->field_un_champ_a_mettre_a_jour[LANGUAGE_NONE]['value'] = 'test';

node_save($node);