0

I have to update some nodereference fields from custom code in myModule. This has to be done when a new node of a particular type is being inserted so I implemented hook_node_insert as follows:

function myModule_node_insert($node){
    $settings = _settings_forms_nodereference_fields($node->type);
    $field = $settings['field'];
    $language = field_language('node', $node, 'body');
    $node->{$field}[$language][0]['nid'] = 408;
    $node->{$field}[$language][1]['nid'] = 408;
    $node->{$field}[$language][2]['nid'] = 408;
    node_save($node);
}

However, each time I try to create a new node, I get the following error;

PDOException: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '436' for key 'PRIMARY': INSERT INTO {node} (nid, vid, type, language, title, uid, status, created, changed, comment, promote, sticky, tnid, translate) VALUES ....

I have discovered it is because of the node_save function but without it my changes are not committed.

The full array is as follows:

[field_event_form_s_] => Array
    (
        [und] => Array
            (
                [0] => Array
                    (
                        [nid] => 261
                    )

                [1] => Array
                    (
                        [nid] => 262
                    )

                [2] => Array
                    (
                        [nid] => 263
                    )
            )
    )
halfer
  • 19,824
  • 17
  • 99
  • 186
sisko
  • 9,604
  • 20
  • 67
  • 139

1 Answers1

2

I found the answer to my question immediately after posting at my next google search. I think it can be useful for other people, myself included in the future.

The following code does the trick:

function myModule_node_insert($node){
    $settings = _settings_forms_nodereference_fields($node->type);
    $field = $settings['field'];
    $language = field_language('node', $node, 'body');
    $node->{$field}[$language][0]['nid'] = 408;
    $node->{$field}[$language][1]['nid'] = 408;
    $node->{$field}[$language][2]['nid'] = 408;
    field_attach_update('node', $node);
}

Instead of node_save, the field itself needs to be updated. This guy does a better job of explaining whilst keeping it simple.

sisko
  • 9,604
  • 20
  • 67
  • 139