Drupal 6: Programmatically submit a webform using drupal_execute()

In this snippet, I’ll show you how you can submit a webform programmatically using drupal_execute(). The first thing you’ll need to do is figure out what the $form_state data looks like when the webform is submitted, so you can recreate that structure and pass it into drupal_execute().

One way to accomplish this is to add a validation/submit handler to the form using hook_form_alter() and then output the contents of the submitted data (using krumo, print_r, etc).

The following code will prepend a validation handler to the webform $form, so we can dump the submitted data to the screen:

<?php
function MYMODULE_form_alter(&$form, $form_state, $form_id) {

  // define node id of webform
  $webform_node_id = 146;

  // check for form id of webform
  if ($form_id == 'webform_client_form_' . $webform_node_id) {

    // prepend a validation callback to the form
    array_unshift($form['#validate'],
      '_MYMODULE_form_alter_webform_' . $webform_node_id . '_validate');

  }

}
?>

And here is the validation handler which will dump the submitted data to the screen. NOTE: krumo() is available from the devel module; you could use print_r() as well:

<?php
function _MYMODULE_form_alter_webform_146_validate($form, &$form_state) {
  // debug
  krumo($form_state);
  die;
}

?>

Now if I populate the webform with some data:

webform submit

And submit the form, I will get the following debug output:

webform submitted

You’ll need to mirror the structure of the submitted data when creating your $form_state variable, which will be passed into drupal_execute().

In the following function, I show how you can submit a webform programmatically. There is even additional code in there which loads a user’s previously submitted data, if you care.

<?php
function MYMODULE_some_function() {

  // define webform node id
  $webform_node_id = 146;

  // define user submitting the webform
  $user_id = 2;

  // load webform node
  if ($node = node_load($webform_node_id)) {

    // load module include file, per loading previously submitted webform data
    module_load_include('inc', 'webform', 'webform_report');

    // get submissions for user
    $submissions = webform_get_submissions($node->nid, NULL, $user_id);

    // get submission data ($submission) and submission id ($sid)
    if (FALSE !== ($sid = key($submissions))) {
      $submission = $submissions[$sid];
    }
    else {
      $submission = NULL;
      $sid = NULL;
    }

    // create array of $form_state data
    // NOTE: be sure to use the debug output as a guide to make this array match!
    $form_state = array(
      'submitted' => true,
      'values' => array(
        'submission' => $submission,
        'submitted' => array(
          'test_field_1' => 'abc',
          'test_field_2' => '123',
          'test_field_3' => 'def',
        ),
        'details' => array(
          'email_subject' => $node->webform['email_subject'],
          'email_from_name' => $node->webform['email_from_name'],
          'email_from_address' => $node->webform['email_from_address'],
          'nid' => $webform_node_id,
          'sid' => $sid,
        ),
        'op' => t('Submit'),
        'submit' => t('Submit'),
        'form_id' => 'webform_client_form_'. $webform_node_id,
      ),
    );

    // Saves the webform data submited prior to login.
    drupal_execute('webform_client_form_'. $webform_node_id, $form_state, $node, $submission, TRUE, FALSE);

  }

}

?>

Updated: