You are here

public function WebformSubmitResource::post in Webform REST 8.2

Same name and namespace in other branches
  1. 8.3 src/Plugin/rest/resource/WebformSubmitResource.php \Drupal\webform_rest\Plugin\rest\resource\WebformSubmitResource::post()
  2. 8 src/Plugin/rest/resource/WebformSubmitResource.php \Drupal\webform_rest\Plugin\rest\resource\WebformSubmitResource::post()
  3. 4.x src/Plugin/rest/resource/WebformSubmitResource.php \Drupal\webform_rest\Plugin\rest\resource\WebformSubmitResource::post()

Responds to entity POST requests and saves the new entity.

Return value

\Drupal\rest\ResourceResponse The HTTP response object.

Throws

\Symfony\Component\HttpKernel\Exception\HttpException Throws HttpException in case of error.

File

src/Plugin/rest/resource/WebformSubmitResource.php, line 52

Class

WebformSubmitResource
Creates a resource for submitting a webform.

Namespace

Drupal\webform_rest\Plugin\rest\resource

Code

public function post() {
  $webform_data = $this->request
    ->getCurrentRequest()
    ->getContent();
  if (empty($webform_data)) {
    $errors = [
      'error' => [
        'message' => 'No data has been submitted.',
      ],
    ];
    return new ModifiedResourceResponse($errors, 400);
  }
  $webform_data = json_decode($webform_data, TRUE);

  // Basic check for webform ID.
  if (empty($webform_data['webform_id'])) {
    throw new BadRequestHttpException("Missing requred webform_id value.");
  }

  // Convert to webform values format.
  $values = [
    'webform_id' => $webform_data['webform_id'],
    'entity_type' => NULL,
    'entity_id' => NULL,
    'in_draft' => FALSE,
    'uri' => '/webform/' . $webform_data['webform_id'] . '/api',
  ];
  $values['data'] = $webform_data;

  // Don't submit webform ID.
  unset($values['data']['webform_id']);

  // Check for a valid webform.
  $webform = Webform::load($values['webform_id']);
  if (!$webform) {
    throw new BadRequestHttpException('Invalid webform_id value.');
  }

  // Check webform is open.
  $is_open = WebformSubmissionForm::isOpen($webform);
  if ($is_open === TRUE) {

    // Validate submission.
    $errors = WebformSubmissionForm::validateFormValues($values);

    // Check there are no validation errors.
    if (!empty($errors)) {
      return new ModifiedResourceResponse([
        'message' => 'Submitted Data contains validation errors.',
        'error' => $errors,
      ], 400);
    }
    else {

      // Return submission ID.
      $webform_submission = WebformSubmissionForm::submitFormValues($values);
      return new ModifiedResourceResponse([
        'sid' => $webform_submission
          ->id(),
      ]);
    }
  }
  else {
    throw new AccessDeniedHttpException('This webform is closed, or too many submissions have been made.');
  }
}