You are here

public static function S3fsCorsFile::valueCallback in S3 File System CORS Upload 8

Determines how user input is mapped to an element's #value property.

Parameters

array $element: An associative array containing the properties of the element.

mixed $input: The incoming input to populate the form element. If this is FALSE, the element's default value should be returned.

\Drupal\Core\Form\FormStateInterface $form_state: The current state of the form.

Return value

mixed The value to assign to the element.

Overrides ManagedFile::valueCallback

2 calls to S3fsCorsFile::valueCallback()
S3fsCorsFileWidget::value in src/Plugin/Field/FieldWidget/S3fsCorsFileWidget.php
Form API callback. Retrieves the value for the file_generic field element.
S3fsCorsImageWidget::value in src/Plugin/Field/FieldWidget/S3fsCorsImageWidget.php
Form API callback. Retrieves the value for the file_generic field element.

File

src/Element/S3fsCorsFile.php, line 62

Class

S3fsCorsFile
Provides an S3fs Cors File Element.

Namespace

Drupal\s3fs_cors\Element

Code

public static function valueCallback(&$element, $input, FormStateInterface $form_state) {

  // Find the current value of this field.
  $fids = !empty($input['fids']) ? explode(' ', $input['fids']) : [];

  // ksm($form_state->getValues());
  foreach ($fids as $key => $fid) {
    $fids[$key] = (int) $fid;
  }
  $force_default = FALSE;

  // @FIXME: This can certainly be improved. We have copied code from core file module
  // Process any input and save new uploads.
  if ($input !== FALSE) {
    $input['fids'] = $fids;
    $return = $input;

    // Check for #filefield_value_callback values.
    // Because FAPI does not allow multiple #value_callback values like it
    // does for #element_validate and #process, this fills the missing
    // functionality to allow File fields to be extended through FAPI.
    if (isset($element['#file_value_callbacks'])) {
      foreach ($element['#file_value_callbacks'] as $callback) {
        $callback($element, $input, $form_state);
      }
    }

    // Load files if the FIDs have changed to confirm they exist.
    if (!empty($input['fids'])) {
      $fids = [];
      foreach ($input['fids'] as $fid) {
        if ($file = File::load($fid)) {
          $fids[] = $file
            ->id();

          // Temporary files that belong to other users should never be
          // allowed.
          if ($file
            ->isTemporary()) {
            if ($file
              ->getOwnerId() != \Drupal::currentUser()
              ->id()) {
              $force_default = TRUE;
              break;
            }
            elseif (\Drupal::currentUser()
              ->isAnonymous()) {
              $token = NestedArray::getValue($form_state
                ->getUserInput(), array_merge($element['#parents'], [
                'file_' . $file
                  ->id(),
                'fid_token',
              ]));
              if ($token !== Crypt::hmacBase64('file-' . $file
                ->id(), \Drupal::service('private_key')
                ->get() . Settings::getHashSalt())) {
                $force_default = TRUE;
                break;
              }
            }
          }
        }
      }
      if ($force_default) {
        $fids = [];
      }
    }
  }

  // If there is no input or if the default value was requested above, use the
  // default value.
  if ($input === FALSE || $force_default) {
    if ($element['#extended']) {
      $default_fids = isset($element['#default_value']['fids']) ? $element['#default_value']['fids'] : [];
      $return = isset($element['#default_value']) ? $element['#default_value'] : [
        'fids' => [],
      ];
    }
    else {
      $default_fids = isset($element['#default_value']) ? $element['#default_value'] : [];
      $return = [
        'fids' => [],
      ];
    }

    // Confirm that the file exists when used as a default value.
    if (!empty($default_fids)) {
      $fids = [];
      foreach ($default_fids as $fid) {
        if ($file = File::load($fid)) {
          $fids[] = $file
            ->id();
        }
      }
    }
  }
  $return['fids'] = $fids;
  return $return;
}