function file_managed_file_submit in Drupal 9
Same name and namespace in other branches
- 8 core/modules/file/file.module \file_managed_file_submit()
- 7 modules/file/file.module \file_managed_file_submit()
Form submission handler for upload / remove buttons of managed_file elements.
See also
\Drupal\file\Element\ManagedFile::processManagedFile()
2 string references to 'file_managed_file_submit'
- ImageWidget::validateRequiredFields in core/
modules/ image/ src/ Plugin/ Field/ FieldWidget/ ImageWidget.php - Validate callback for alt and title field, if the user wants them required.
- ManagedFile::processManagedFile in core/
modules/ file/ src/ Element/ ManagedFile.php - Render API callback: Expands the managed_file element type.
File
- core/
modules/ file/ file.module, line 1337 - Defines a "managed_file" Form API field and a "file" field for Field module.
Code
function file_managed_file_submit($form, FormStateInterface $form_state) {
// Determine whether it was the upload or the remove button that was clicked,
// and set $element to the managed_file element that contains that button.
$parents = $form_state
->getTriggeringElement()['#array_parents'];
$button_key = array_pop($parents);
$element = NestedArray::getValue($form, $parents);
// No action is needed here for the upload button, because all file uploads on
// the form are processed by \Drupal\file\Element\ManagedFile::valueCallback()
// regardless of which button was clicked. Action is needed here for the
// remove button, because we only remove a file in response to its remove
// button being clicked.
if ($button_key == 'remove_button') {
$fids = array_keys($element['#files']);
// Get files that will be removed.
if ($element['#multiple']) {
$remove_fids = [];
foreach (Element::children($element) as $name) {
if (strpos($name, 'file_') === 0 && $element[$name]['selected']['#value']) {
$remove_fids[] = (int) substr($name, 5);
}
}
$fids = array_diff($fids, $remove_fids);
}
else {
// If we deal with single upload element remove the file and set
// element's value to empty array (file could not be removed from
// element if we don't do that).
$remove_fids = $fids;
$fids = [];
}
foreach ($remove_fids as $fid) {
// If it's a temporary file we can safely remove it immediately, otherwise
// it's up to the implementing module to remove usages of files to have them
// removed.
if ($element['#files'][$fid] && $element['#files'][$fid]
->isTemporary()) {
$element['#files'][$fid]
->delete();
}
}
// Update both $form_state->getValues() and FormState::$input to reflect
// that the file has been removed, so that the form is rebuilt correctly.
// $form_state->getValues() must be updated in case additional submit
// handlers run, and for form building functions that run during the
// rebuild, such as when the managed_file element is part of a field widget.
// FormState::$input must be updated so that
// \Drupal\file\Element\ManagedFile::valueCallback() has correct information
// during the rebuild.
$form_state
->setValueForElement($element['fids'], implode(' ', $fids));
NestedArray::setValue($form_state
->getUserInput(), $element['fids']['#parents'], implode(' ', $fids));
}
// Set the form to rebuild so that $form is correctly updated in response to
// processing the file removal. Since this function did not change $form_state
// if the upload button was clicked, a rebuild isn't necessary in that
// situation and calling $form_state->disableRedirect() would suffice.
// However, we choose to always rebuild, to keep the form processing workflow
// consistent between the two buttons.
$form_state
->setRebuild();
}