You are here

public function WebformSubmissionExportImportImporter::exportSubmission in Webform 6.x

Same name and namespace in other branches
  1. 8.5 modules/webform_submission_export_import/src/WebformSubmissionExportImportImporter.php \Drupal\webform_submission_export_import\WebformSubmissionExportImportImporter::exportSubmission()

Export webform submission as a CSV record.

Parameters

\Drupal\webform\WebformSubmissionInterface $webform_submission: A webform submission.

array $export_options: An associative array of export options.

Return value

array The webform submission converted to a CSV record.

Overrides WebformSubmissionExportImportImporterInterface::exportSubmission

File

modules/webform_submission_export_import/src/WebformSubmissionExportImportImporter.php, line 273

Class

WebformSubmissionExportImportImporter
Webform submission export importer.

Namespace

Drupal\webform_submission_export_import

Code

public function exportSubmission(WebformSubmissionInterface $webform_submission, array $export_options = []) {
  $submission_data = $webform_submission
    ->toArray(TRUE);
  $record = [];

  // Append fields.
  $field_definitions = $this
    ->getFieldDefinitions();
  foreach ($field_definitions as $field_name => $field_definition) {
    switch ($field_name) {
      case 'uid':
        $value = $this
          ->getEntityExportId($webform_submission
          ->getOwner(), $export_options);
        break;
      case 'entity_id':
        $value = $this
          ->getEntityExportId($webform_submission
          ->getSourceEntity(), $export_options);
        break;
      default:
        $value = isset($submission_data[$field_name]) ? $submission_data[$field_name] : '';
        break;
    }
    $record[] = $this
      ->exportValue($value);
  }

  // Append elements.
  $elements = $this
    ->getElements();
  foreach ($elements as $element) {
    $element_plugin = $this->elementManager
      ->getElementInstance($element);
    $has_multiple_values = $element_plugin
      ->hasMultipleValues($element);
    if ($element_plugin instanceof WebformManagedFileBase) {

      // Files: Get File URLS.

      /** @var \Drupal\file\FileInterface $files */
      $files = $element_plugin
        ->getTargetEntities($element, $webform_submission) ?: [];
      $values = [];
      foreach ($files as $file) {
        $values[] = file_create_url($file
          ->getFileUri());
      }
      $value = implode(',', $values);
      $record[] = $this
        ->exportValue($value);
    }
    elseif ($element_plugin instanceof WebformElementEntityReferenceInterface) {

      // Entity references: Get entity UUIDs.
      $entities = $element_plugin
        ->getTargetEntities($element, $webform_submission);
      $values = [];
      foreach ($entities as $entity) {
        $values[] = $this
          ->getEntityExportId($entity, $export_options);
      }
      $value = implode(',', $values);
      $record[] = $this
        ->exportValue($value);
    }
    elseif ($element_plugin instanceof WebformLikert) {

      // Single Composite: Split questions into individual columns.
      $value = $element_plugin
        ->getValue($element, $webform_submission);
      $question_keys = array_keys($element['#questions']);
      foreach ($question_keys as $question_key) {
        $question_value = isset($value[$question_key]) ? $value[$question_key] : '';
        $record[] = $this
          ->exportValue($question_value);
      }
    }
    elseif ($element_plugin instanceof WebformCompositeBase && !$has_multiple_values) {

      // Composite: Split single composite sub elements into individual columns.
      $value = $element_plugin
        ->getValue($element, $webform_submission);
      $composite_element_keys = array_keys($element_plugin
        ->getCompositeElements());
      foreach ($composite_element_keys as $composite_element_key) {
        $composite_value = isset($value[$composite_element_key]) ? $value[$composite_element_key] : '';
        $record[] = $this
          ->exportValue($composite_value);
      }
    }
    elseif ($element_plugin
      ->isComposite()) {

      // Composite: Convert multiple composite values to a single line of YAML.
      $value = $element_plugin
        ->getValue($element, $webform_submission);
      $dumper = new Dumper(2);
      $record[] = $dumper
        ->dump($value);
    }
    elseif ($has_multiple_values) {

      // Multiple: Convert to comma separated values with commas URL encodes.
      $values = $element_plugin
        ->getValue($element, $webform_submission);
      $values = $values !== NULL ? (array) $values : [];
      foreach ($values as $index => $value) {
        $values[$index] = str_replace(',', '%2C', $value);
      }
      $value = implode(',', $values);
      $record[] = $this
        ->exportValue($value);
    }
    else {

      // Default: Convert NULL values to empty strings.
      $value = $element_plugin
        ->getValue($element, $webform_submission);
      $value = $value !== NULL ? $value : '';
      $record[] = $this
        ->exportValue($value);
    }
  }
  return $record;
}