function ManagedFile::validateManagedFile

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

Render API callback: Validates the managed_file element.

File

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

Class

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

Namespace

Drupal\file\Element

Code

public static function validateManagedFile(&$element, FormStateInterface $form_state, &$complete_form) {
    $triggering_element = $form_state->getTriggeringElement();
    $clicked_button = isset($triggering_element['#parents']) ? end($triggering_element['#parents']) : '';
    if ($clicked_button != 'remove_button' && !empty($element['fids']['#value'])) {
        $fids = $element['fids']['#value'];
        foreach ($fids as $fid) {
            if ($file = File::load($fid)) {
                // If referencing an existing file, only allow if there are existing
                // references. This prevents unmanaged files from being deleted if
                // this item were to be deleted. When files that are no longer in use
                // are automatically marked as temporary (now disabled by default),
                // it is not safe to reference a permanent file without usage. Adding
                // a usage and then later on removing it again would delete the file,
                // but it is unknown if and where it is currently referenced. However,
                // when files are not marked temporary (and then removed)
                // automatically, it is safe to add and remove usages, as it would
                // simply return to the current state.
                // @see https://www.drupal.org/node/2891902
                if ($file->isPermanent() && \Drupal::config('file.settings')->get('make_unused_managed_files_temporary')) {
                    $references = static::fileUsage()->listUsage($file);
                    if (empty($references)) {
                        // We expect the field name placeholder value to be wrapped in t()
                        // here, so it won't be escaped again as it's already marked safe.
                        $form_state->setError($element, t('The file used in the @name field may not be referenced.', [
                            '@name' => $element['#title'],
                        ]));
                    }
                }
            }
            else {
                // We expect the field name placeholder value to be wrapped in t()
                // here, so it won't be escaped again as it's already marked safe.
                $form_state->setError($element, t('The file referenced by the @name field does not exist.', [
                    '@name' => $element['#title'],
                ]));
            }
        }
    }
    // Check required property based on the FID.
    if ($element['#required'] && empty($element['fids']['#value']) && !in_array($clicked_button, [
        'upload_button',
        'remove_button',
    ])) {
        // We expect the field name placeholder value to be wrapped in t()
        // here, so it won't be escaped again as it's already marked safe.
        $form_state->setError($element, t('@name field is required.', [
            '@name' => $element['#title'],
        ]));
    }
    // Consolidate the array value of this field to array of FIDs.
    if (!$element['#extended']) {
        $form_state->setValueForElement($element, $element['fids']['#value']);
    }
}

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