0
votes

I'm using drupal_execute to save a node programmatically, and for the most part, it works fine, except when it comes to a multi-value field.

What gets posted is this (I'm just including the portion that isn't working):

[alt] => Array
        (
            [0] => Array
                (
                    [name] => Sam I. Am
                    [phone] => (650) 5553131
                )

            [1] => Array
                (
                    [name] => The Lorax
                    [phone] => 6505553344
                )

            [2] => Array
                (
                    [name] => 
                    [phone] => 
                )

        )

When I'm setting the $form_state['values'], I'm using:

for($a = 0; $a < count($_REQUEST['alt']); $a++) {
        $form_state['values']['field_alternativename'][$a]['value'] = check_plain($_REQUEST['alt'][$a]['name']);
        $form_state['values']['field_alternativephone'][$a]['value'] = format_phone($_REQUEST['alt'][$a]['phone']);
    }

And to save the node:

drupal_execute('info_node_form', $form_state, $node);

As a test, to make sure that I'm referencing the appropriate fields, I edited an existing node using node/X/edit and printed out the $form_state['values'] upon submission. This is what it printed out:

//output of print '<pre>'; print_r($form_state['values']); print '</pre>';
    [field_alternativename] => Array
        (
            [0] => Array
                (
                    [value] => Sam I. Am
                    [_error_element] => group_alternative_contacts][0][field_alternativename][value
                    [_weight] => 0
                    [_remove] => 0
                )

            [1] => Array
                (
                    [value] => The Lorax
                    [_error_element] => group_alternative_contacts][1][field_alternativename][value
                    [_weight] => 1
                    [_remove] => 0
                )

        )

    [field_alternativephone] => Array
        (
            [0] => Array
                (
                    [value] => (650) 5553131
                    [_error_element] => group_alternative_contacts][0][field_alternativephone][value
                    [_weight] => 0
                    [_remove] => 0
                )

            [1] => Array
                (
                    [value] => (650) 5553344
                    [_error_element] => group_alternative_contacts][1][field_alternativephone][value
                    [_weight] => 1
                    [_remove] => 0
                )

        )

So, I'm not understanding why it isn't being saved... I'm not setting the delta, but I didn't think I'd have to? In mysql, the data is stored as:

mysql> select * from content_field_alternativename ;
+-------+-------+-------+-----------------------------+
| vid   | nid   | delta | field_alternativename_value |
+-------+-------+-------+-----------------------------+
| 22433 | 22433 |     0 | Sam I. Am                   |
+-------+-------+-------+-----------------------------+

mysql> select * from content_field_alternativephone;
+-------+-------+-------+------------------------------+
| vid   | nid   | delta | field_alternativephone_value |
+-------+-------+-------+------------------------------+
| 22433 | 22433 |     0 | (650) 5553131                |
+-------+-------+-------+------------------------------+
1

1 Answers

0
votes

The delta is how cck stores multiple values. nid x, vid x, delta 0 is the first in the multivalue field nid x, vid x, delta 1 is the second etc. It's required so if you add deltas to your multi-values it should work.