You are here

class WebformSubmission in Webform 6.x

Same name and namespace in other branches
  1. 8.5 src/Entity/WebformSubmission.php \Drupal\webform\Entity\WebformSubmission

Defines the WebformSubmission entity.

Plugin annotation


@ContentEntityType(
  id = "webform_submission",
  label = @Translation("Webform submission"),
  label_collection = @Translation("Submissions"),
  label_singular = @Translation("submission"),
  label_plural = @Translation("submissions"),
  label_count = @PluralTranslation(
    singular = "@count submission",
    plural = "@count submissions",
  ),
  bundle_label = @Translation("Webform"),
  handlers = {
    "storage" = "Drupal\webform\WebformSubmissionStorage",
    "storage_schema" = "Drupal\webform\WebformSubmissionStorageSchema",
    "views_data" = "Drupal\webform\WebformSubmissionViewsData",
    "view_builder" = "Drupal\webform\WebformSubmissionViewBuilder",
    "list_builder" = "Drupal\webform\WebformSubmissionListBuilder",
    "access" = "Drupal\webform\WebformSubmissionAccessControlHandler",
    "form" = {
      "add" = "Drupal\webform\WebformSubmissionForm",
      "edit" = "Drupal\webform\WebformSubmissionForm",
      "edit_all" = "Drupal\webform\WebformSubmissionForm",
      "api" = "Drupal\webform\WebformSubmissionForm",
      "test" = "Drupal\webform\WebformSubmissionForm",
      "notes" = "Drupal\webform\WebformSubmissionNotesForm",
      "duplicate" = "Drupal\webform\WebformSubmissionDuplicateForm",
      "delete" = "Drupal\webform\Form\WebformSubmissionDeleteForm",
    },
  },
  bundle_entity_type = "webform",
  list_cache_contexts = { "user" },
  list_cache_tags = { "config:webform_list", "webform_submission_list" },
  base_table = "webform_submission",
  admin_permission = "administer webform",
  entity_keys = {
    "id" = "sid",
    "bundle" = "webform_id",
    "uuid" = "uuid",
    "langcode" = "langcode"
  },
  links = {
    "canonical" = "/admin/structure/webform/manage/{webform}/submission/{webform_submission}",
    "access-denied" = "/admin/structure/webform/manage/{webform}/submission/{webform_submission}/access-denied",
    "table" = "/admin/structure/webform/manage/{webform}/submission/{webform_submission}/table",
    "text" = "/admin/structure/webform/manage/{webform}/submission/{webform_submission}/text",
    "yaml" = "/admin/structure/webform/manage/{webform}/submission/{webform_submission}/yaml",
    "edit-form" = "/admin/structure/webform/manage/{webform}/submission/{webform_submission}/edit",
    "notes-form" = "/admin/structure/webform/manage/{webform}/submission/{webform_submission}/notes",
    "resend-form" = "/admin/structure/webform/manage/{webform}/submission/{webform_submission}/resend",
    "duplicate-form" = "/admin/structure/webform/manage/{webform}/submission/{webform_submission}/duplicate",
    "delete-form" = "/admin/structure/webform/manage/{webform}/submission/{webform_submission}/delete",
    "collection" = "/admin/structure/webform/submissions/manage/list"
  },
  permission_granularity = "bundle"
)

Hierarchy

Expanded class hierarchy of WebformSubmission

72 files declare their use of WebformSubmission
webform.install.update.inc in includes/webform.install.update.inc
Archived Webform update hooks.
webform.module in ./webform.module
Enables the creation of webforms and questionnaires.
Webform.php in src/Element/Webform.php
WebformAccessSubmissionViewsTest.php in modules/webform_access/tests/src/Functional/WebformAccessSubmissionViewsTest.php
WebformAccessTokensTest.php in modules/webform_access/tests/src/Functional/WebformAccessTokensTest.php

... See full list

File

src/Entity/WebformSubmission.php, line 83

Namespace

Drupal\webform\Entity
View source
class WebformSubmission extends ContentEntityBase implements WebformSubmissionInterface {
  use EntityChangedTrait;
  use StringTranslationTrait;

  /**
   * Store a reference to the current temporary webform.
   *
   * @var \Drupal\webform\WebformInterface
   *
   * @see \Drupal\webform\WebformEntityElementsValidator::validateRendering()
   */
  protected static $webform;

  /**
   * The data.
   *
   * @var array
   */
  protected $data = [];

  /**
   * Reference to original data loaded before any updates.
   *
   * @var array
   */
  protected $originalData = [];

  /**
   * The data with computed values.
   *
   * @var array
   */
  protected $computedData = [];

  /**
   * The data hashed.
   *
   * @var string
   */
  protected $dataHash;

  /**
   * Flag to indicated if submission is being converted from anonymous to authenticated.
   *
   * @var bool
   */
  protected $converting = FALSE;

  /**
   * {@inheritdoc}
   */
  public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
    $fields['serial'] = BaseFieldDefinition::create('integer')
      ->setLabel(t('Serial number'))
      ->setDescription(t('The serial number of the webform submission entity.'))
      ->setReadOnly(TRUE);
    $fields['sid'] = BaseFieldDefinition::create('integer')
      ->setLabel(t('Submission ID'))
      ->setDescription(t('The ID of the webform submission entity.'))
      ->setReadOnly(TRUE);
    $fields['uuid'] = BaseFieldDefinition::create('uuid')
      ->setLabel(t('Submission UUID'))
      ->setDescription(t('The UUID of the webform submission entity.'))
      ->setReadOnly(TRUE);
    $fields['token'] = BaseFieldDefinition::create('string')
      ->setLabel(t('Token'))
      ->setDescription(t('A secure token used to look up a submission.'))
      ->setSetting('max_length', 255)
      ->setReadOnly(TRUE);
    $fields['uri'] = BaseFieldDefinition::create('string')
      ->setLabel(t('Submission URI'))
      ->setDescription(t('The URI the user submitted the webform.'))
      ->setSetting('max_length', 2000)
      ->setReadOnly(TRUE);
    $fields['created'] = BaseFieldDefinition::create('created')
      ->setLabel(t('Created'))
      ->setDescription(t('The time that the webform submission was first saved as draft or submitted.'));
    $fields['completed'] = BaseFieldDefinition::create('timestamp')
      ->setLabel(t('Completed'))
      ->setDescription(t('The time that the webform submission was submitted as complete (not draft).'));
    $fields['changed'] = BaseFieldDefinition::create('changed')
      ->setLabel(t('Changed'))
      ->setDescription(t('The time that the webform submission was last saved (complete or draft).'));
    $fields['in_draft'] = BaseFieldDefinition::create('boolean')
      ->setLabel(t('Is draft'))
      ->setDescription(t('Is this a draft of the submission?'))
      ->setDefaultValue(FALSE);
    $fields['current_page'] = BaseFieldDefinition::create('string')
      ->setLabel(t('Current page'))
      ->setDescription(t('The current wizard page.'))
      ->setSetting('max_length', 128);
    $fields['remote_addr'] = BaseFieldDefinition::create('string')
      ->setLabel(t('Remote IP address'))
      ->setDescription(t('The IP address of the user that submitted the webform.'))
      ->setSetting('max_length', 128);
    $fields['uid'] = BaseFieldDefinition::create('entity_reference')
      ->setLabel(t('Submitted by'))
      ->setDescription(t('The username of the user that submitted the webform.'))
      ->setSetting('target_type', 'user')
      ->setDefaultValueCallback('Drupal\\webform\\Entity\\WebformSubmission::getCurrentUserId');
    $fields['langcode'] = BaseFieldDefinition::create('language')
      ->setLabel(t('Language'))
      ->setDescription(t('The submission language code.'));
    $fields['webform_id'] = BaseFieldDefinition::create('entity_reference')
      ->setLabel(t('Webform'))
      ->setDescription(t('The associated webform.'))
      ->setSetting('target_type', 'webform');
    $fields['entity_type'] = BaseFieldDefinition::create('string')
      ->setLabel(t('Submitted to: Entity type'))
      ->setDescription(t('The entity type to which this submission was submitted from.'))
      ->setSetting('is_ascii', TRUE)
      ->setSetting('max_length', EntityTypeInterface::ID_MAX_LENGTH);

    // Can't use entity reference without a target type because it defaults to
    // an integer which limits reference to only content entities (and not
    // config entities like Views, Panels, etc…).
    // @see \Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem::propertyDefinitions()
    $fields['entity_id'] = BaseFieldDefinition::create('string')
      ->setLabel(t('Submitted to: Entity ID'))
      ->setDescription(t('The ID of the entity of which this webform submission was submitted from.'))
      ->setSetting('max_length', 255);
    $fields['locked'] = BaseFieldDefinition::create('boolean')
      ->setLabel(t('Locked'))
      ->setDescription(t('A flag that indicates a locked webform submission.'))
      ->setDefaultValue(FALSE);
    $fields['sticky'] = BaseFieldDefinition::create('boolean')
      ->setLabel(t('Sticky'))
      ->setDescription(t('A flag that indicate the status of the webform submission.'))
      ->setDefaultValue(FALSE);
    $fields['notes'] = BaseFieldDefinition::create('string_long')
      ->setLabel(t('Notes'))
      ->setDescription(t('Administrative notes about the webform submission.'))
      ->setDefaultValue('');
    return $fields;
  }

  /**
   * {@inheritdoc}
   */
  public function serial() {
    return $this
      ->get('serial')->value;
  }

  /**
   * {@inheritdoc}
   */
  public function label() {
    $submission_label = $this
      ->getWebform()
      ->getSetting('submission_label') ?: \Drupal::config('webform.settings')
      ->get('settings.default_submission_label');

    /** @var \Drupal\webform\WebformTokenManagerInterface $token_manager */
    $token_manager = \Drupal::service('webform.token_manager');
    return PlainTextOutput::renderFromHtml($token_manager
      ->replaceNoRenderContext($submission_label, $this));
  }

  /**
   * {@inheritdoc}
   */
  public function getLangcode() {
    return $this
      ->get('langcode')->value;
  }

  /**
   * {@inheritdoc}
   */
  public function setLangcode($langcode) {
    $this
      ->set('langcode', $langcode);
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function getCreatedTime() {
    if (isset($this
      ->get('created')->value)) {
      return $this
        ->get('created')->value;
    }
    return NULL;
  }

  /**
   * {@inheritdoc}
   */
  public function setCreatedTime($created) {
    $this
      ->set('created', $created);
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function getChangedTime() {
    return $this
      ->get('changed')->value;
  }

  /**
   * {@inheritdoc}
   */
  public function setChangedTime($timestamp) {
    $this
      ->set('changed', $timestamp);
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function getCompletedTime() {
    return $this
      ->get('completed')->value;
  }

  /**
   * {@inheritdoc}
   */
  public function setCompletedTime($timestamp) {
    $this
      ->set('completed', $timestamp);
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function getNotes() {
    return $this
      ->get('notes')->value;
  }

  /**
   * {@inheritdoc}
   */
  public function setNotes($notes) {
    $this
      ->set('notes', $notes);
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function getSticky() {
    return $this
      ->get('sticky')->value;
  }

  /**
   * {@inheritdoc}
   */
  public function setSticky($sticky) {
    $this
      ->set('sticky', $sticky);
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function setLocked($locked) {
    $this
      ->set('locked', $locked);
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function getRemoteAddr() {
    return $this
      ->get('remote_addr')->value ?: $this
      ->t('(unknown)');
  }

  /**
   * {@inheritdoc}
   */
  public function setRemoteAddr($ip_address) {
    $this
      ->set('remote_addr', $ip_address);
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function getCurrentPage() {
    return $this
      ->get('current_page')->value;
  }

  /**
   * {@inheritdoc}
   */
  public function setCurrentPage($current_page) {
    $this
      ->set('current_page', $current_page);
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function getCurrentPageTitle() {
    $current_page = $this
      ->getCurrentPage();
    $page = $this
      ->getWebform()
      ->getPage('default', $current_page);
    return $page && isset($page['#title']) ? $page['#title'] : $current_page;
  }

  /**
   * {@inheritdoc}
   */
  public function getElementData($key) {
    $data = $this
      ->getData();
    return isset($data[$key]) ? $data[$key] : NULL;
  }

  /**
   * {@inheritdoc}
   */
  public function setElementData($key, $value) {

    // Make sure the element exists before setting its value.
    if ($this
      ->getWebform()
      ->getElement($key)) {
      $this->data[$key] = $value;
      $this->computedData = NULL;
      $this->dataHash = NULL;
    }
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function getRawData() {
    return $this->data;
  }

  /**
   * {@inheritdoc}
   */
  public function getData() {
    if (isset($this->computedData)) {
      return $this->computedData;
    }

    // If there is no active theme and we can't prematurely start computing
    // element values because it will define and lock the active theme.

    /** @var \Drupal\webform\WebformThemeManagerInterface $theme_manager */
    $theme_manager = \Drupal::service('webform.theme_manager');
    if (!$theme_manager
      ->hasActiveTheme()) {
      return $this->data;
    }

    // Set computed element values in to submission data.
    $this->computedData = $this->data;
    $webform = $this
      ->getWebform();
    if ($webform
      ->hasComputed()) {

      /** @var \Drupal\webform\Plugin\WebformElementManagerInterface $element_manager */
      $element_manager = \Drupal::service('plugin.manager.webform.element');
      $computed_elements = $webform
        ->getElementsComputed();
      foreach ($computed_elements as $computed_element_name) {
        $computed_element = $webform
          ->getElement($computed_element_name);

        /** @var \Drupal\webform\Plugin\WebformElementComputedInterface $element_plugin */
        $element_plugin = $element_manager
          ->getElementInstance($computed_element);
        $this->computedData[$computed_element_name] = $element_plugin
          ->computeValue($computed_element, $this);
      }
    }
    return $this->computedData;
  }

  /**
   * {@inheritdoc}
   */
  public function setData(array $data) {
    $this->data = $data;
    $this->computedData = NULL;
    $this->dataHash = NULL;
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function getOriginalData() {
    return $this->originalData;
  }

  /**
   * {@inheritdoc}
   */
  public function setOriginalData(array $data) {
    $this->originalData = $data;
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function getElementOriginalData($key) {
    return isset($this->originalData[$key]) ? $this->originalData[$key] : NULL;
  }

  /**
   * {@inheritdoc}
   */
  public function getDataHash() {
    if (isset($this->dataHash)) {
      return $this->dataHash;
    }
    $this->dataHash = Crypt::hmacBase64(serialize($this
      ->getRawData()), Settings::getHashSalt());
    return $this->dataHash;
  }

  /**
   * {@inheritdoc}
   */
  public function getToken() {
    return $this->token->value;
  }

  /**
   * {@inheritdoc}
   */
  public function getWebform() {
    if (isset($this->webform_id->entity)) {
      return $this->webform_id->entity;
    }
    else {
      return static::$webform;
    }
  }

  /**
   * {@inheritdoc}
   */
  public function getSourceEntity($translate = FALSE) {
    if ($this->entity_type->value && $this->entity_id->value) {
      $entity_type = $this->entity_type->value;
      $entity_id = $this->entity_id->value;
      $source_entity = $this
        ->entityTypeManager()
        ->getStorage($entity_type)
        ->load($entity_id);

      // If translated is set, get the translated source entity.
      if ($translate && $source_entity instanceof ContentEntityInterface) {
        $langcode = $this
          ->language()
          ->getId();
        if ($source_entity
          ->hasTranslation($langcode)) {
          $source_entity = $source_entity
            ->getTranslation($langcode);
        }
      }
      return $source_entity;
    }
    else {
      return NULL;
    }
  }

  /**
   * {@inheritdoc}
   */
  public function getSourceUrl() {
    $uri = $this->uri->value;
    if ($uri !== NULL && ($url = \Drupal::pathValidator()
      ->getUrlIfValid($uri))) {
      return $url
        ->setOption('absolute', TRUE);
    }
    elseif (($entity = $this
      ->getSourceEntity()) && $entity
      ->hasLinkTemplate('canonical')) {
      return $entity
        ->toUrl()
        ->setOption('absolute', TRUE);
    }
    else {
      return $this
        ->getWebform()
        ->toUrl()
        ->setOption('absolute', TRUE);
    }
  }

  /**
   * {@inheritdoc}
   */
  public function getTokenUrl($operation = 'update') {
    switch ($operation) {
      case 'view':

        /** @var \Drupal\webform\WebformRequestInterface $request_handler */
        $request_handler = \Drupal::service('webform.request');
        $url = $request_handler
          ->getUrl($this, $this
          ->getSourceEntity(), 'webform.user.submission');
        break;
      case 'update':
        $url = $this
          ->getSourceUrl();
        break;
      case 'delete':

        /** @var \Drupal\webform\WebformRequestInterface $request_handler */
        $request_handler = \Drupal::service('webform.request');
        $url = $request_handler
          ->getUrl($this, $this
          ->getSourceEntity(), 'webform.user.submission.delete');
        break;
      default:
        throw new \Exception("Token URL operation {$operation} is not supported");
    }
    $options = $url
      ->setAbsolute()
      ->getOptions();
    $options['query']['token'] = $this
      ->getToken();
    return $url
      ->setOptions($options);
  }

  /**
   * {@inheritdoc}
   */
  public function invokeWebformHandlers($method, &$context1 = NULL, &$context2 = NULL, &$context3 = NULL) {
    if ($webform = $this
      ->getWebform()) {
      return $webform
        ->invokeHandlers($method, $this, $context1, $context2, $context3);
    }
  }

  /**
   * {@inheritdoc}
   */
  public function invokeWebformElements($method, &$context1 = NULL, &$context2 = NULL, &$context3 = NULL) {
    if ($webform = $this
      ->getWebform()) {
      $webform
        ->invokeElements($method, $this, $context1, $context2, $context3);
    }
  }

  /**
   * {@inheritdoc}
   */
  public function getOwner() {
    $user = $this
      ->get('uid')->entity;
    if (!$user || $user
      ->isAnonymous()) {
      $user = User::getAnonymousUser();
    }
    return $user;
  }

  /**
   * {@inheritdoc}
   */
  public function getOwnerId() {
    return $this
      ->get('uid')->target_id;
  }

  /**
   * {@inheritdoc}
   */
  public function setOwnerId($uid) {
    $this
      ->set('uid', $uid);
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function setOwner(UserInterface $account) {
    $this
      ->set('uid', $account
      ->id());
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function isDraft() {
    return $this
      ->get('in_draft')->value ? TRUE : FALSE;
  }

  /**
   * {@inheritdoc}
   */
  public function isConverting() {
    return $this->converting;
  }

  /**
   * {@inheritdoc}
   */
  public function isCompleted() {
    return $this
      ->get('completed')->value ? TRUE : FALSE;
  }

  /**
   * {@inheritdoc}
   */
  public function isLocked() {
    return $this
      ->get('locked')->value ? TRUE : FALSE;
  }

  /**
   * {@inheritdoc}
   */
  public function isSticky() {
    return (bool) $this
      ->get('sticky')->value;
  }

  /**
   * {@inheritdoc}
   */
  public function isOwner(AccountInterface $account) {
    if ($account
      ->isAnonymous()) {
      return !empty($_SESSION['webform_submissions']) && isset($_SESSION['webform_submissions'][$this
        ->id()]);
    }
    else {
      return $account
        ->id() === $this
        ->getOwnerId();
    }
  }

  /**
   * {@inheritdoc}
   */
  public function hasNotes() {
    return $this->notes ? TRUE : FALSE;
  }

  /**
   * {@inheritdoc}
   */
  public function getState() {
    if (!$this
      ->id()) {
      return WebformSubmissionInterface::STATE_UNSAVED;
    }
    elseif ($this
      ->isConverting()) {
      return WebformSubmissionInterface::STATE_CONVERTED;
    }
    elseif ($this
      ->isDraft()) {
      return $this->created->value === $this->changed->value ? WebformSubmissionInterface::STATE_DRAFT_CREATED : WebformSubmissionInterface::STATE_DRAFT_UPDATED;
    }
    elseif ($this
      ->isLocked()) {
      return WebformSubmissionInterface::STATE_LOCKED;
    }
    elseif ($this->completed->value === $this->changed->value) {
      return WebformSubmissionInterface::STATE_COMPLETED;
    }
    else {
      return WebformSubmissionInterface::STATE_UPDATED;
    }
  }

  /**
   * {@inheritdoc}
   */
  protected function urlRouteParameters($rel) {
    $uri_route_parameters = parent::urlRouteParameters($rel);
    $webform = $this
      ->getWebform();
    if ($webform) {
      $uri_route_parameters['webform'] = $webform
        ->id();
    }
    return $uri_route_parameters;
  }

  /**
   * {@inheritdoc}
   */
  public function createDuplicate() {

    /** @var \Drupal\webform\WebformSubmissionInterface $duplicate */
    $duplicate = parent::createDuplicate();
    $duplicate
      ->set('serial', NULL);
    $duplicate
      ->set('token', Crypt::randomBytesBase64());

    // Clear state.
    $duplicate
      ->set('in_draft', FALSE);
    $duplicate
      ->set('current_page', NULL);

    // Create timestamps.
    $duplicate
      ->set('created', NULL);
    $duplicate
      ->set('changed', NULL);
    $duplicate
      ->set('completed', NULL);

    // Clear admin notes, sticky, and locked.
    $duplicate
      ->set('notes', '');
    $duplicate
      ->set('sticky', FALSE);
    $duplicate
      ->set('locked', FALSE);
    return $duplicate;
  }

  /**
   * {@inheritdoc}
   */
  public static function preCreate(EntityStorageInterface $storage, array &$values) {
    if (empty($values['webform_id']) && empty($values['webform'])) {
      if (empty($values['webform_id'])) {
        throw new \Exception('Webform id (webform_id) is required to create a webform submission.');
      }
      elseif (empty($values['webform'])) {
        throw new \Exception('Webform (webform) is required to create a webform submission.');
      }
    }

    // Get temporary webform entity and store it in the static
    // WebformSubmission::$webform property.
    // This could be reworked to use \Drupal\Core\TempStore\PrivateTempStoreFactory
    // but it might be overkill since we are just using this to validate
    // that a webform's elements can be rendered.
    // @see \Drupal\webform\WebformEntityElementsValidator::validateRendering()
    // @see \Drupal\webform_ui\Form\WebformUiElementTestForm::buildForm()
    if (isset($values['webform']) && $values['webform'] instanceof WebformInterface) {
      $webform = $values['webform'];
      static::$webform = $values['webform'];
      $values['webform_id'] = $values['webform']
        ->id();
    }
    else {

      /** @var \Drupal\webform\WebformInterface $webform */
      $webform = Webform::load($values['webform_id']);
      static::$webform = NULL;
    }

    // Get request's source entity parameter.

    /** @var \Drupal\webform\WebformRequestInterface $request_handler */
    $request_handler = \Drupal::service('webform.request');
    $source_entity = $request_handler
      ->getCurrentSourceEntity('webform');
    $values += [
      'entity_type' => $source_entity ? $source_entity
        ->getEntityTypeId() : NULL,
      'entity_id' => $source_entity ? $source_entity
        ->id() : NULL,
    ];

    // Decode all data in an array.
    if (empty($values['data'])) {
      $values['data'] = [];
    }
    elseif (is_string($values['data'])) {
      $values['data'] = Yaml::decode($values['data']);
    }

    // Get default date from source entity 'webform' field.
    if ($values['entity_type'] && $values['entity_id']) {
      $source_entity = \Drupal::entityTypeManager()
        ->getStorage($values['entity_type'])
        ->load($values['entity_id']);

      /** @var \Drupal\webform\WebformEntityReferenceManagerInterface $entity_reference_manager */
      $entity_reference_manager = \Drupal::service('webform.entity_reference_manager');
      if ($webform_field_name = $entity_reference_manager
        ->getFieldName($source_entity)) {
        if ($source_entity->{$webform_field_name}->target_id === $webform
          ->id() && $source_entity->{$webform_field_name}->default_data) {
          $values['data'] += Yaml::decode($source_entity->{$webform_field_name}->default_data);
        }
      }
    }

    // Set default values.
    $current_request = \Drupal::requestStack()
      ->getCurrentRequest();
    $values += [
      'in_draft' => FALSE,
      'uid' => \Drupal::currentUser()
        ->id(),
      'langcode' => \Drupal::languageManager()
        ->getCurrentLanguage()
        ->getId(),
      'token' => Crypt::randomBytesBase64(),
      'uri' => preg_replace('#^' . base_path() . '#', '/', $current_request
        ->getRequestUri()),
      'remote_addr' => $webform && $webform
        ->hasRemoteAddr() ? $current_request
        ->getClientIp() : '',
    ];
    $webform
      ->invokeHandlers(__FUNCTION__, $values);
    $webform
      ->invokeElements(__FUNCTION__, $values);
  }

  /**
   * {@inheritdoc}
   */
  public function preSave(EntityStorageInterface $storage) {

    // Because the original data is not stored in the persistent entity storage
    // cache we have to reset it for the original webform submission entity.
    // @see \Drupal\Core\Entity\EntityStorageBase::doPreSave
    // @see \Drupal\Core\Entity\ContentEntityStorageBase::getFromPersistentCache
    if (isset($this->original)) {
      $this->original
        ->setData($this->originalData);
      $this->original
        ->setOriginalData($this->original
        ->getData());
    }
    $request_time = \Drupal::time()
      ->getRequestTime();

    // Set created.
    if (!$this->created->value) {
      $this->created->value = $request_time;
    }

    // Set changed.
    $this->changed->value = $request_time;

    // Set completed.
    if ($this
      ->isDraft()) {
      $this->completed->value = NULL;
    }
    elseif (!$this
      ->isCompleted()) {
      $this->completed->value = $request_time;
    }
    parent::preSave($storage);
  }

  /**
   * {@inheritdoc}
   */
  public function postSave(EntityStorageInterface $storage, $update = TRUE) {
    parent::postSave($storage, $update);
  }

  /**
   * {@inheritdoc}
   */
  public function save() {

    // Clear the remote_addr for confidential submissions.
    if (!$this
      ->getWebform()
      ->hasRemoteAddr()) {
      $this
        ->get('remote_addr')->value = '';
    }
    return parent::save();
  }

  /**
   * {@inheritdoc}
   */
  public function resave() {
    return $this
      ->entityTypeManager()
      ->getStorage($this->entityTypeId)
      ->resave($this);
  }

  /**
   * {@inheritdoc}
   */
  public function access($operation, AccountInterface $account = NULL, $return_as_object = FALSE) {
    $access = parent::access($operation, $account, TRUE)
      ->orIf($this
      ->invokeWebformHandlers('access', $operation, $account));
    return $return_as_object ? $access : $access
      ->isAllowed();
  }

  /**
   * {@inheritdoc}
   */
  public function convert(UserInterface $account) {
    $this->converting = TRUE;
    $this
      ->setOwner($account);
    $this
      ->save();
    $this->converting = FALSE;
  }

  /**
   * {@inheritdoc}
   */
  public function toArray($custom = FALSE, $check_access = FALSE) {
    if ($custom === FALSE) {
      return parent::toArray();
    }
    else {
      $values = parent::toArray();
      foreach ($values as $key => $item) {

        // Issue #2567899 It seems it is impossible to save an empty string to an entity.
        // @see https://www.drupal.org/node/2567899
        // Solution: Set empty (aka NULL) items to an empty string.
        if (empty($item)) {
          $values[$key] = '';
        }
        else {
          $value = reset($item);
          $values[$key] = reset($value);
        }
      }
      $values['data'] = $this
        ->getData();

      // Check access.
      if ($check_access) {

        // Check field definition access.
        $submission_storage = \Drupal::entityTypeManager()
          ->getStorage('webform_submission');
        $field_definitions = $submission_storage
          ->getFieldDefinitions();
        $field_definitions = $submission_storage
          ->checkFieldDefinitionAccess($this
          ->getWebform(), $field_definitions + [
          'data' => TRUE,
        ]);
        $values = array_intersect_key($values, $field_definitions);

        // Check element data access.
        $elements = $this
          ->getWebform()
          ->getElementsInitializedFlattenedAndHasValue('view');
        $values['data'] = array_intersect_key($values['data'], $elements);
      }
      return $values;
    }
  }

  /**
   * Default value callback for 'uid' base field definition.
   *
   * @see ::baseFieldDefinitions()
   *
   * @return array
   *   An array of default values.
   */
  public static function getCurrentUserId() {
    return [
      \Drupal::currentUser()
        ->id(),
    ];
  }

}

Members

Namesort descending Modifiers Type Description Overrides
CacheableDependencyTrait::$cacheContexts protected property Cache contexts.
CacheableDependencyTrait::$cacheMaxAge protected property Cache max-age.
CacheableDependencyTrait::$cacheTags protected property Cache tags.
CacheableDependencyTrait::setCacheability protected function Sets cacheability; useful for value object constructors.
ContentEntityBase::$activeLangcode protected property Language code identifying the entity active language.
ContentEntityBase::$defaultLangcode protected property Local cache for the default language code.
ContentEntityBase::$defaultLangcodeKey protected property The default langcode entity key.
ContentEntityBase::$enforceRevisionTranslationAffected protected property Whether the revision translation affected flag has been enforced.
ContentEntityBase::$entityKeys protected property Holds untranslatable entity keys such as the ID, bundle, and revision ID.
ContentEntityBase::$fieldDefinitions protected property Local cache for field definitions.
ContentEntityBase::$fields protected property The array of fields, each being an instance of FieldItemListInterface.
ContentEntityBase::$fieldsToSkipFromTranslationChangesCheck protected static property Local cache for fields to skip from the checking for translation changes.
ContentEntityBase::$isDefaultRevision protected property Indicates whether this is the default revision.
ContentEntityBase::$langcodeKey protected property The language entity key.
ContentEntityBase::$languages protected property Local cache for the available language objects.
ContentEntityBase::$loadedRevisionId protected property The loaded revision ID before the new revision was set.
ContentEntityBase::$newRevision protected property Boolean indicating whether a new revision should be created on save.
ContentEntityBase::$revisionTranslationAffectedKey protected property The revision translation affected entity key.
ContentEntityBase::$translatableEntityKeys protected property Holds translatable entity keys such as the label.
ContentEntityBase::$translationInitialize protected property A flag indicating whether a translation object is being initialized.
ContentEntityBase::$translations protected property An array of entity translation metadata.
ContentEntityBase::$validated protected property Whether entity validation was performed.
ContentEntityBase::$validationRequired protected property Whether entity validation is required before saving the entity.
ContentEntityBase::$values protected property The plain data values of the contained fields.
ContentEntityBase::addTranslation public function Adds a new translation to the translatable object. Overrides TranslatableInterface::addTranslation
ContentEntityBase::bundle public function Gets the bundle of the entity. Overrides EntityBase::bundle
ContentEntityBase::bundleFieldDefinitions public static function Provides field definitions for a specific bundle. Overrides FieldableEntityInterface::bundleFieldDefinitions 4
ContentEntityBase::clearTranslationCache protected function Clear entity translation object cache to remove stale references.
ContentEntityBase::get public function Gets a field item list. Overrides FieldableEntityInterface::get
ContentEntityBase::getEntityKey protected function Gets the value of the given entity key, if defined. 1
ContentEntityBase::getFieldDefinition public function Gets the definition of a contained field. Overrides FieldableEntityInterface::getFieldDefinition
ContentEntityBase::getFieldDefinitions public function Gets an array of field definitions of all contained fields. Overrides FieldableEntityInterface::getFieldDefinitions
ContentEntityBase::getFields public function Gets an array of all field item lists. Overrides FieldableEntityInterface::getFields
ContentEntityBase::getFieldsToSkipFromTranslationChangesCheck protected function Returns an array of field names to skip in ::hasTranslationChanges. 1
ContentEntityBase::getIterator public function
ContentEntityBase::getLanguages protected function
ContentEntityBase::getLoadedRevisionId public function Gets the loaded Revision ID of the entity. Overrides RevisionableInterface::getLoadedRevisionId
ContentEntityBase::getRevisionId public function Gets the revision identifier of the entity. Overrides RevisionableInterface::getRevisionId
ContentEntityBase::getTranslatableFields public function Gets an array of field item lists for translatable fields. Overrides FieldableEntityInterface::getTranslatableFields
ContentEntityBase::getTranslatedField protected function Gets a translated field.
ContentEntityBase::getTranslation public function Gets a translation of the data. Overrides TranslatableInterface::getTranslation
ContentEntityBase::getTranslationLanguages public function Returns the languages the data is translated to. Overrides TranslatableInterface::getTranslationLanguages
ContentEntityBase::getTranslationStatus public function Returns the translation status. Overrides TranslationStatusInterface::getTranslationStatus
ContentEntityBase::getUntranslated public function Returns the translatable object referring to the original language. Overrides TranslatableInterface::getUntranslated
ContentEntityBase::hasField public function Determines whether the entity has a field with the given name. Overrides FieldableEntityInterface::hasField
ContentEntityBase::hasTranslation public function Checks there is a translation for the given language code. Overrides TranslatableInterface::hasTranslation
ContentEntityBase::hasTranslationChanges public function Determines if the current translation of the entity has unsaved changes. Overrides TranslatableInterface::hasTranslationChanges
ContentEntityBase::id public function Gets the identifier. Overrides EntityBase::id
ContentEntityBase::initializeTranslation protected function Instantiates a translation object for an existing translation.
ContentEntityBase::isDefaultRevision public function Checks if this entity is the default revision. Overrides RevisionableInterface::isDefaultRevision
ContentEntityBase::isDefaultTranslation public function Checks whether the translation is the default one. Overrides TranslatableInterface::isDefaultTranslation
ContentEntityBase::isDefaultTranslationAffectedOnly public function Checks if untranslatable fields should affect only the default translation. Overrides TranslatableRevisionableInterface::isDefaultTranslationAffectedOnly
ContentEntityBase::isLatestRevision public function Checks if this entity is the latest revision. Overrides RevisionableInterface::isLatestRevision
ContentEntityBase::isLatestTranslationAffectedRevision public function Checks whether this is the latest revision affecting this translation. Overrides TranslatableRevisionableInterface::isLatestTranslationAffectedRevision
ContentEntityBase::isNewRevision public function Determines whether a new revision should be created on save. Overrides RevisionableInterface::isNewRevision
ContentEntityBase::isNewTranslation public function Checks whether the translation is new. Overrides TranslatableInterface::isNewTranslation
ContentEntityBase::isRevisionTranslationAffected public function Checks whether the current translation is affected by the current revision. Overrides TranslatableRevisionableInterface::isRevisionTranslationAffected
ContentEntityBase::isRevisionTranslationAffectedEnforced public function Checks if the revision translation affected flag value has been enforced. Overrides TranslatableRevisionableInterface::isRevisionTranslationAffectedEnforced
ContentEntityBase::isTranslatable public function Returns the translation support status. Overrides TranslatableInterface::isTranslatable
ContentEntityBase::isValidationRequired public function Checks whether entity validation is required before saving the entity. Overrides FieldableEntityInterface::isValidationRequired
ContentEntityBase::language public function Gets the language of the entity. Overrides EntityBase::language
ContentEntityBase::onChange public function Reacts to changes to a field. Overrides FieldableEntityInterface::onChange
ContentEntityBase::postCreate public function Acts on a created entity before hooks are invoked. Overrides EntityBase::postCreate
ContentEntityBase::preSaveRevision public function Acts on a revision before it gets saved. Overrides RevisionableInterface::preSaveRevision 3
ContentEntityBase::referencedEntities public function Gets a list of entities referenced by this entity. Overrides EntityBase::referencedEntities 1
ContentEntityBase::removeTranslation public function Removes the translation identified by the given language code. Overrides TranslatableInterface::removeTranslation
ContentEntityBase::set public function Sets a field value. Overrides FieldableEntityInterface::set
ContentEntityBase::setDefaultLangcode protected function Populates the local cache for the default language code.
ContentEntityBase::setNewRevision public function Enforces an entity to be saved as a new revision. Overrides RevisionableInterface::setNewRevision
ContentEntityBase::setRevisionTranslationAffected public function Marks the current revision translation as affected. Overrides TranslatableRevisionableInterface::setRevisionTranslationAffected
ContentEntityBase::setRevisionTranslationAffectedEnforced public function Enforces the revision translation affected flag value. Overrides TranslatableRevisionableInterface::setRevisionTranslationAffectedEnforced
ContentEntityBase::setValidationRequired public function Sets whether entity validation is required before saving the entity. Overrides FieldableEntityInterface::setValidationRequired
ContentEntityBase::updateFieldLangcodes protected function Updates language for already instantiated fields.
ContentEntityBase::updateLoadedRevisionId public function Updates the loaded Revision ID with the revision ID. Overrides RevisionableInterface::updateLoadedRevisionId
ContentEntityBase::updateOriginalValues public function Updates the original values with the interim changes.
ContentEntityBase::uuid public function Gets the entity UUID (Universally Unique Identifier). Overrides EntityBase::uuid
ContentEntityBase::validate public function Validates the currently set values. Overrides FieldableEntityInterface::validate 1
ContentEntityBase::wasDefaultRevision public function Checks whether the entity object was a default revision when it was saved. Overrides RevisionableInterface::wasDefaultRevision
ContentEntityBase::__clone public function Magic method: Implements a deep clone.
ContentEntityBase::__construct public function Constructs an Entity object. Overrides EntityBase::__construct
ContentEntityBase::__get public function Implements the magic method for getting object properties.
ContentEntityBase::__isset public function Implements the magic method for isset().
ContentEntityBase::__set public function Implements the magic method for setting object properties.
ContentEntityBase::__sleep public function Overrides EntityBase::__sleep
ContentEntityBase::__unset public function Implements the magic method for unset().
DependencySerializationTrait::$_entityStorages protected property
DependencySerializationTrait::$_serviceIds protected property
DependencySerializationTrait::__sleep public function Aliased as: traitSleep 2
DependencySerializationTrait::__wakeup public function 2
EntityBase::$enforceIsNew protected property Boolean indicating whether the entity should be forced to be new.
EntityBase::$entityTypeId protected property The entity type.
EntityBase::$typedData protected property A typed data object wrapping this entity.
EntityBase::create public static function Constructs a new entity object, without permanently saving it. Overrides EntityInterface::create
EntityBase::delete public function Deletes an entity permanently. Overrides EntityInterface::delete 2
EntityBase::enforceIsNew public function Enforces an entity to be new. Overrides EntityInterface::enforceIsNew
EntityBase::entityTypeBundleInfo protected function Gets the entity type bundle info service.
EntityBase::entityTypeManager protected function Gets the entity type manager.
EntityBase::getCacheContexts public function The cache contexts associated with this object. Overrides CacheableDependencyTrait::getCacheContexts
EntityBase::getCacheMaxAge public function The maximum age for which this object may be cached. Overrides CacheableDependencyTrait::getCacheMaxAge
EntityBase::getCacheTags public function The cache tags associated with this object. Overrides CacheableDependencyTrait::getCacheTags
EntityBase::getCacheTagsToInvalidate public function Returns the cache tags that should be used to invalidate caches. Overrides EntityInterface::getCacheTagsToInvalidate 4
EntityBase::getConfigDependencyKey public function Gets the key that is used to store configuration dependencies. Overrides EntityInterface::getConfigDependencyKey
EntityBase::getConfigDependencyName public function Gets the configuration dependency name. Overrides EntityInterface::getConfigDependencyName 1
EntityBase::getConfigTarget public function Gets the configuration target identifier for the entity. Overrides EntityInterface::getConfigTarget 1
EntityBase::getEntityType public function Gets the entity type definition. Overrides EntityInterface::getEntityType
EntityBase::getEntityTypeId public function Gets the ID of the type of the entity. Overrides EntityInterface::getEntityTypeId
EntityBase::getListCacheTagsToInvalidate protected function The list cache tags to invalidate for this entity.
EntityBase::getOriginalId public function Gets the original ID. Overrides EntityInterface::getOriginalId 1
EntityBase::getTypedData public function Gets a typed data object for this entity object. Overrides EntityInterface::getTypedData
EntityBase::hasLinkTemplate public function Indicates if a link template exists for a given key. Overrides EntityInterface::hasLinkTemplate
EntityBase::invalidateTagsOnDelete protected static function Invalidates an entity's cache tags upon delete. 1
EntityBase::invalidateTagsOnSave protected function Invalidates an entity's cache tags upon save. 1
EntityBase::isNew public function Determines whether the entity is new. Overrides EntityInterface::isNew 2
EntityBase::languageManager protected function Gets the language manager.
EntityBase::linkTemplates protected function Gets an array link templates. 1
EntityBase::load public static function Loads an entity. Overrides EntityInterface::load
EntityBase::loadMultiple public static function Loads one or more entities. Overrides EntityInterface::loadMultiple
EntityBase::postDelete public static function Acts on deleted entities before the delete hook is invoked. Overrides EntityInterface::postDelete 18
EntityBase::postLoad public static function Acts on loaded entities. Overrides EntityInterface::postLoad 2
EntityBase::preDelete public static function Acts on entities before they are deleted and before hooks are invoked. Overrides EntityInterface::preDelete 6
EntityBase::setOriginalId public function Sets the original ID. Overrides EntityInterface::setOriginalId 1
EntityBase::toLink public function Generates the HTML for a link to this entity. Overrides EntityInterface::toLink
EntityBase::toUrl public function Gets the URL object for the entity. Overrides EntityInterface::toUrl 2
EntityBase::uriRelationships public function Gets a list of URI relationships supported by this entity. Overrides EntityInterface::uriRelationships
EntityBase::uuidGenerator protected function Gets the UUID generator.
EntityChangedTrait::getChangedTimeAcrossTranslations public function Returns the timestamp of the last entity change across all translations.
EntityChangesDetectionTrait::getFieldsToSkipFromTranslationChangesCheck protected function Returns an array of field names to skip when checking for changes. Aliased as: traitGetFieldsToSkipFromTranslationChangesCheck
RefinableCacheableDependencyTrait::addCacheableDependency public function 1
RefinableCacheableDependencyTrait::addCacheContexts public function
RefinableCacheableDependencyTrait::addCacheTags public function
RefinableCacheableDependencyTrait::mergeCacheMaxAge public function
StringTranslationTrait::$stringTranslation protected property The string translation service. 4
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.
SynchronizableEntityTrait::$isSyncing protected property Whether this entity is being created, updated or deleted through a synchronization process.
SynchronizableEntityTrait::isSyncing public function
SynchronizableEntityTrait::setSyncing public function
TranslationStatusInterface::TRANSLATION_CREATED constant Status code identifying a newly created translation.
TranslationStatusInterface::TRANSLATION_EXISTING constant Status code identifying an existing translation.
TranslationStatusInterface::TRANSLATION_REMOVED constant Status code identifying a removed translation.
WebformSubmission::$computedData protected property The data with computed values.
WebformSubmission::$converting protected property Flag to indicated if submission is being converted from anonymous to authenticated.
WebformSubmission::$data protected property The data.
WebformSubmission::$dataHash protected property The data hashed.
WebformSubmission::$originalData protected property Reference to original data loaded before any updates.
WebformSubmission::$webform protected static property Store a reference to the current temporary webform.
WebformSubmission::access public function Checks data value access. Overrides ContentEntityBase::access
WebformSubmission::baseFieldDefinitions public static function Provides base field definitions for an entity type. Overrides ContentEntityBase::baseFieldDefinitions
WebformSubmission::convert public function Convert anonymous submission to authenticated. Overrides WebformSubmissionInterface::convert
WebformSubmission::createDuplicate public function Creates a duplicate of the entity. Overrides ContentEntityBase::createDuplicate
WebformSubmission::getChangedTime public function Gets the timestamp of the last submission change. Overrides EntityChangedTrait::getChangedTime
WebformSubmission::getCompletedTime public function Gets the timestamp of the submission completion. Overrides WebformSubmissionInterface::getCompletedTime
WebformSubmission::getCreatedTime public function Returns the time that the submission was created. Overrides WebformSubmissionInterface::getCreatedTime
WebformSubmission::getCurrentPage public function Gets the submission's current page. Overrides WebformSubmissionInterface::getCurrentPage
WebformSubmission::getCurrentPageTitle public function Get the submission's current page title. Overrides WebformSubmissionInterface::getCurrentPageTitle
WebformSubmission::getCurrentUserId public static function Default value callback for 'uid' base field definition.
WebformSubmission::getData public function Gets the webform submission's data with computed valued. Overrides WebformSubmissionInterface::getData
WebformSubmission::getDataHash public function Get a webform submission data as a hash view. Overrides WebformSubmissionInterface::getDataHash
WebformSubmission::getElementData public function Get a webform submission element's data. Overrides WebformSubmissionInterface::getElementData
WebformSubmission::getElementOriginalData public function Get a webform submission element's original data. Overrides WebformSubmissionInterface::getElementOriginalData
WebformSubmission::getLangcode public function Gets the langcode of the field values held in the object. Overrides WebformSubmissionInterface::getLangcode
WebformSubmission::getNotes public function Get the submission's notes. Overrides WebformSubmissionInterface::getNotes
WebformSubmission::getOriginalData public function Gets the webform submission's original data before any changes. Overrides WebformSubmissionInterface::getOriginalData
WebformSubmission::getOwner public function Returns the entity owner's user entity. Overrides EntityOwnerInterface::getOwner
WebformSubmission::getOwnerId public function Returns the entity owner's user ID. Overrides EntityOwnerInterface::getOwnerId
WebformSubmission::getRawData public function Gets the webform submission's raw data. Overrides WebformSubmissionInterface::getRawData
WebformSubmission::getRemoteAddr public function Gets the remote IP address of the submission. Overrides WebformSubmissionInterface::getRemoteAddr
WebformSubmission::getSourceEntity public function Gets the webform submission's source entity. Overrides WebformSubmissionInterface::getSourceEntity
WebformSubmission::getSourceUrl public function Gets the webform submission's source URL. Overrides WebformSubmissionInterface::getSourceUrl
WebformSubmission::getState public function Track the state of a submission. Overrides WebformSubmissionInterface::getState
WebformSubmission::getSticky public function Get the submission's sticky flag. Overrides WebformSubmissionInterface::getSticky
WebformSubmission::getToken public function Gets the webform submission's token. Overrides WebformSubmissionInterface::getToken
WebformSubmission::getTokenUrl public function Gets the webform submission's secure tokenized URL. Overrides WebformSubmissionInterface::getTokenUrl
WebformSubmission::getWebform public function Gets the webform submission's webform entity. Overrides WebformSubmissionInterface::getWebform
WebformSubmission::hasNotes public function Checks submission notes. Overrides WebformSubmissionInterface::hasNotes
WebformSubmission::invokeWebformElements public function Invoke a webform element elements method. Overrides WebformSubmissionInterface::invokeWebformElements
WebformSubmission::invokeWebformHandlers public function Invoke all webform handlers method. Overrides WebformSubmissionInterface::invokeWebformHandlers
WebformSubmission::isCompleted public function Is the current submission completed. Overrides WebformSubmissionInterface::isCompleted
WebformSubmission::isConverting public function Is the current submission being converted from anonymous to authenticated. Overrides WebformSubmissionInterface::isConverting
WebformSubmission::isDraft public function Is the current submission in draft. Overrides WebformSubmissionInterface::isDraft
WebformSubmission::isLocked public function Get the submission's locked status. Overrides WebformSubmissionInterface::isLocked
WebformSubmission::isOwner public function Test whether the provided account is owner of this webform submission. Overrides WebformSubmissionInterface::isOwner
WebformSubmission::isSticky public function Returns the submission sticky status. Overrides WebformSubmissionInterface::isSticky
WebformSubmission::label public function Gets the label of the entity. Overrides ContentEntityBase::label
WebformSubmission::postSave public function Acts on a saved entity before the insert or update hook is invoked. Overrides ContentEntityBase::postSave
WebformSubmission::preCreate public static function Changes the values of an entity before it is created. Overrides EntityBase::preCreate
WebformSubmission::preSave public function Acts on an entity before the presave hook is invoked. Overrides ContentEntityBase::preSave
WebformSubmission::resave public function Resave a webform submission without trigger any hooks or handlers. Overrides WebformSubmissionInterface::resave
WebformSubmission::save public function Saves an entity permanently. Overrides EntityBase::save
WebformSubmission::serial public function Gets the serial number. Overrides WebformSubmissionInterface::serial
WebformSubmission::setChangedTime public function Sets the timestamp of the last submission change. Overrides EntityChangedTrait::setChangedTime
WebformSubmission::setCompletedTime public function Sets the timestamp of the submission completion. Overrides WebformSubmissionInterface::setCompletedTime
WebformSubmission::setCreatedTime public function Sets the creation date of the submission. Overrides WebformSubmissionInterface::setCreatedTime
WebformSubmission::setCurrentPage public function Sets the submission's current page. Overrides WebformSubmissionInterface::setCurrentPage
WebformSubmission::setData public function Set the webform submission's data. Overrides WebformSubmissionInterface::setData
WebformSubmission::setElementData public function Set a webform submission element's data. Overrides WebformSubmissionInterface::setElementData
WebformSubmission::setLangcode public function Sets the langcode of the field values held in the object. Overrides WebformSubmissionInterface::setLangcode
WebformSubmission::setLocked public function Sets the submission's locked flag. Overrides WebformSubmissionInterface::setLocked
WebformSubmission::setNotes public function Sets the submission's notes. Overrides WebformSubmissionInterface::setNotes
WebformSubmission::setOriginalData public function Set the webform submission's original data. Overrides WebformSubmissionInterface::setOriginalData
WebformSubmission::setOwner public function Sets the entity owner's user entity. Overrides EntityOwnerInterface::setOwner
WebformSubmission::setOwnerId public function Sets the entity owner's user ID. Overrides EntityOwnerInterface::setOwnerId
WebformSubmission::setRemoteAddr public function Sets remote IP address of the submission. Overrides WebformSubmissionInterface::setRemoteAddr
WebformSubmission::setSticky public function Sets the submission's sticky flag. Overrides WebformSubmissionInterface::setSticky
WebformSubmission::toArray public function Gets an array of all property values. Overrides ContentEntityBase::toArray
WebformSubmission::urlRouteParameters protected function Gets an array of placeholders for this entity. Overrides EntityBase::urlRouteParameters
WebformSubmissionInterface::STATE_COMPLETED constant Return status for submission that has been completed.
WebformSubmissionInterface::STATE_CONVERTED constant Return status for submission that has been converted from anonymous to authenticated.
WebformSubmissionInterface::STATE_DELETED constant Return status for submission that has been deleted.
WebformSubmissionInterface::STATE_DRAFT constant Return status for submission in draft created.
WebformSubmissionInterface::STATE_DRAFT_CREATED constant Return status for submission in draft created.
WebformSubmissionInterface::STATE_DRAFT_UPDATED constant Return status for submission in draft updated.
WebformSubmissionInterface::STATE_LOCKED constant Return status for submission that has been locked.
WebformSubmissionInterface::STATE_UNSAVED constant Return status for new submission.
WebformSubmissionInterface::STATE_UPDATED constant Return status for submission that has been updated.