function ManagedFile::valueCallback

Same name and namespace in other branches
  1. 8.9.x core/modules/file/src/Element/ManagedFile.php \Drupal\file\Element\ManagedFile::valueCallback()
  2. 10 core/modules/file/src/Element/ManagedFile.php \Drupal\file\Element\ManagedFile::valueCallback()
  3. 11.x core/modules/file/src/Element/ManagedFile.php \Drupal\file\Element\ManagedFile::valueCallback()

Overrides FormElement::valueCallback

1 call to ManagedFile::valueCallback()
FileWidget::value in core/modules/file/src/Plugin/Field/FieldWidget/FileWidget.php
Form API callback. Retrieves the value for the file_generic field element.

File

core/modules/file/src/Element/ManagedFile.php, line 62

Class

ManagedFile
Provides an AJAX/progress aware widget for uploading and saving a file.

Namespace

Drupal\file\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']) : [];
    foreach ($fids as $key => $fid) {
        $fids[$key] = (int) $fid;
    }
    $force_default = FALSE;
    // Process any input and save new uploads.
    if ($input !== FALSE) {
        $input['fids'] = $fids;
        $return = $input;
        // Uploads take priority over all other values.
        if ($files = file_managed_file_save_upload($element, $form_state)) {
            if ($element['#multiple']) {
                $fids = array_merge($fids, array_keys($files));
            }
            else {
                $fids = array_keys($files);
            }
        }
        else {
            // 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();
                        if (!$file->access('download')) {
                            $force_default = TRUE;
                            break;
                        }
                        // 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',
                                ]));
                                $file_hmac = Crypt::hmacBase64('file-' . $file->id(), \Drupal::service('private_key')->get() . Settings::getHashSalt());
                                if ($token === NULL || !hash_equals($file_hmac, $token)) {
                                    $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 = $element['#default_value']['fids'] ?? [];
            $return = $element['#default_value'] ?? [
                'fids' => [],
            ];
        }
        else {
            $default_fids = $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;
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.