0

myModuleのカスタムコードからいくつかのノード参照フィールドを更新する必要があります。これは、特定のタイプの新しいノードが挿入されるときに実行する必要があるため、次のようにhook_node_insertを実装しました。

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);
}

ただし、新しいノードを作成しようとするたびに、次のエラーが発生します。

PDOException:SQLSTATE [23000]:整合性制約違反:1062キー'PRIMARY'の重複エントリ'436':INSERT INTO {node}(nid、vid、type、language、title、uid、status、created、changed、comment、promote 、sticky、tnid、translate)VALUES...。

node_save関数が原因であることがわかりましたが、それがないと変更はコミットされません。

完全な配列は次のとおりです。

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

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

                [2] => Array
                    (
                        [nid] => 263
                    )
            )
    )
4

1 に答える 1

2

次のグーグル検索に投稿した直後に、私の質問に対する答えが見つかりました。私自身も含めて、他の人にも役立つと思います。

次のコードはトリックを行います:

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);
}

node_saveの代わりに、フィールド自体を更新する必要があります。この男は、それをシンプルに保ちながら、説明するのにより良い仕事をします。

于 2012-12-17T17:34:24.877 に答える