Advertising sustains the DA. Ads are hidden for members. Join today

Webform Cookbook

How to programmatically create and update a submission

Last updated on
15 October 2023

New submission

This example creates a new submission for webform ID "my_webform" and validates the data.

use Drupal\webform\Entity\Webform;
use Drupal\webform\WebformSubmissionForm;

// Get submission values and data.
$values = [
  'webform_id' => 'my_webform',
  'entity_type' => NULL,
  'entity_id' => NULL,
  'in_draft' => FALSE,
  'uid' => '1',
  'langcode' => 'en',
  'token' => 'pgmJREX2l4geg2RGFp0p78Qdfm1ksLxe6IlZ-mN9GZI',
  'uri' => '/webform/my_webform/api',
  'remote_addr' => '',
  'data' => [
    'checkboxes_field' => [
      'Option 1',
      'Option 2',
      'Option 3',
    ],
    'integer_field' => 10,
    'radio_field' => 'Mail',
    'email' => 'myemail@mydomain.com',
  ],
];

// Check webform is open.
$webform = Webform::load($values['webform_id']);
$is_open = WebformSubmissionForm::isOpen($webform);

if ($is_open === TRUE) {
  // Validate submission.
  $errors = WebformSubmissionForm::validateFormValues($values);

  // Check there are no validation errors.
  if (!empty($errors)) {
     print_r($errors);
  }
  else {
    // Submit values and get submission ID.
    $webform_submission = WebformSubmissionForm::submitFormValues($values);
    print $webform_submission->id();
  }
}

Update submission

You also can create and update a submission using $webform_submission instead an array values with WebformSubmissionForm::submitWebformSubmission().

Example of submission creation:

use Drupal\webform\Entity\Webform;
use Drupal\webform\Entity\WebformSubmission;
use Drupal\webform\WebformSubmissionForm;

// Get submission values and data.
$values = [
  'webform_id' => 'my_webform',
  'entity_type' => NULL,
  'entity_id' => NULL,
  'in_draft' => FALSE,
  'uid' => '1',
  'langcode' => 'en',
  'token' => 'pgmJREX2l4geg2RGFp0p78Qdfm1ksLxe6IlZ-mN9GZI',
  'uri' => '/webform/my_webform/api',
  'remote_addr' => '',
  'data' => [
    'checkboxes_field' => [
      'Option 1',
      'Option 2',
      'Option 3',
    ],
    'integer_field' => 10,
    'radio_field' => 'Mail',
    'email' => 'myemail@mydomain.com',
  ],
];

// Check webform is open.
$webform = Webform::load($values['webform_id']);
$is_open = WebformSubmissionForm::isOpen($webform);

if ($is_open === TRUE) {
  // Create new submission instance
  $webform_submission = WebformSubmission::create($values);

  // Validate submission.
  $errors = WebformSubmissionForm::validateWebformSubmission($webform_submission);

  // Check there are no validation errors.
  if (!empty($errors)) {
     print_r($errors);
  }
  else {
    // Submit values and get submission ID.
    $webform_submission = WebformSubmissionForm::submitWebformSubmission($webform_submission);
    print $webform_submission->id();
  }
}

Example of submission update:

use Drupal\webform\Entity\Webform;
use Drupal\webform\Entity\WebformSubmission;
use Drupal\webform\WebformSubmissionForm;

// Example IDs
$webform_id = 'my_webform';
$webform_submission_id = 5;

// Check webform is open.
$webform = Webform::load($webform_id);
$is_open = WebformSubmissionForm::isOpen($webform);

if ($is_open === TRUE) {
  // Load submission
  $webform_submission = WebformSubmission::load($webform_submission_id);

  // Modify submission values
  $webform_submission->setElementData('integer_field', 7);

  // Validate submission.
  $errors = WebformSubmissionForm::validateWebformSubmission($webform_submission);

  // Check there are no validation errors.
  if (!empty($errors)) {
     print_r($errors);
  }
  else {
    // Submit values and get submission ID.
    $webform_submission = WebformSubmissionForm::submitWebformSubmission($webform_submission);
    print $webform_submission->id();
  }
}

Create submission without form (or Directly as submission entity)

All the above examples assume that the data is coming from end-user that should be validated before insert. However, if you have a case where the data is already sanitized or entered programmatically or have to skip the form level validation like captcha, the submission could be done directly via submission entity instead of form. Here is an example of creating a submission:

use Drupal\webform\Entity\Webform;
use Drupal\webform\Entity\WebformSubmission;

// Example IDs
$webform_id = 'my_webform';
$webform = Webform::load($webform_id);
// Create webform submission.
$values = [
  'webform_id' => $webform->id(),
  'data' => [
    'name' => 'John Smith',
    'email' => 'John.Smith@example.com',
    'subject' => 'Hi!',
    'message' => 'Added via submission entity',
  ],
];

/** @var \Drupal\webform\WebformSubmissionInterface $webform_submission */
$webform_submission = WebformSubmission::create($values);
$webform_submission->save();

Help improve this page

Page status: No known problems

You can: