public function GeofieldWidget::fileParse in farmOS 2.x
Submit function to parse geometries from uploaded files.
Parameters
array $form: The form.
\Drupal\Core\Form\FormStateInterface $form_state: The form state.
File
- modules/
core/ map/ src/ Plugin/ Field/ FieldWidget/ GeofieldWidget.php, line 209  
Class
- GeofieldWidget
 - Plugin implementation of the map 'geofield' widget.
 
Namespace
Drupal\farm_map\Plugin\Field\FieldWidgetCode
public function fileParse(array &$form, FormStateInterface $form_state) {
  // Bail if no populate file field is not configured.
  $populate_file_field = $this
    ->getSetting('populate_file_field');
  if (empty($populate_file_field)) {
    return;
  }
  // Get the form field element.
  $triggering_element = $form_state
    ->getTriggeringElement();
  $element = NestedArray::getValue($form, array_slice($triggering_element['#array_parents'], 0, -1));
  // Load the uploaded files.
  $uploaded_files = $form_state
    ->getValue($populate_file_field);
  if (!empty($uploaded_files)) {
    // Get file IDs.
    $file_ids = array_reduce($uploaded_files, function ($carry, $file) {
      return array_merge($carry, array_values($file['fids']));
    }, []);
    // Load and process each file.
    /** @var \Drupal\file\Entity\File[] $files */
    $files = \Drupal::entityTypeManager()
      ->getStorage('file')
      ->loadMultiple($file_ids);
    // @todo Support geometry field with > 1 cardinality.
    $wkt_strings = [];
    if (!empty($files)) {
      foreach ($files as $file) {
        // Get the geometry type.
        $geophp_type = $this
          ->getGeoPhpType($file);
        // Bail if the file is not a supported format.
        if ($geophp_type === FALSE) {
          $this
            ->messenger()
            ->addWarning($this
            ->t('%filename is not a supported geometry file format. Supported formats: %formats', [
            '%filename' => $file
              ->getFilename(),
            '%formats' => implode(', ', array_keys(static::$geoPhpTypes)),
          ]));
          return;
        }
        // Try to parse geometry using the specified geoPHP type.
        $path = $file
          ->getFileUri();
        if ($geophp_type == 'kml' && $file
          ->getMimeType() === 'application/vnd.google-earth.kmz' && extension_loaded('zip')) {
          $path = 'zip://' . $this->fileSystem
            ->realpath($path) . '#doc.kml';
        }
        $data = file_get_contents($path);
        if ($geom = $this->geoPhpWrapper
          ->load($data, $geophp_type)) {
          $wkt_strings[] = $geom
            ->out('wkt');
        }
      }
    }
    // Merge WKT geometries into a single geometry collection.
    $wkt = '';
    if (!empty($wkt_strings)) {
      if (count($wkt_strings) > 1) {
        $wkt = $this
          ->combineWkt($wkt_strings);
      }
      else {
        $wkt = reset($wkt_strings);
      }
    }
    // Bail if no geometry was parsed.
    if (empty($wkt)) {
      $this
        ->messenger()
        ->addWarning($this
        ->t('No geometry could be parsed from %filename.', [
        '%filename' => $file
          ->getFilename(),
      ]));
      return;
    }
    // Unset the current geometry value from the user input.
    $field_name = $this->fieldDefinition
      ->getName();
    $delta = $element['#delta'];
    $user_input = $form_state
      ->getUserInput();
    unset($user_input[$field_name][$delta]['value']);
    $form_state
      ->setUserInput($user_input);
    // Set the new form value.
    $form_state
      ->setValue([
      $field_name,
      $delta,
      'value',
    ], $wkt);
    // Rebuild the form so the map widget is rebuilt with the new value.
    $form_state
      ->setRebuild(TRUE);
  }
}