file_managed_file_submit($form, FormStateInterface $form_state)
Form submission handler for upload / remove buttons of managed_file elements.
See also
\Drupal\file\Element\ManagedFile::processManagedFile()
File
- core/modules/file/file.module, line 1102
- Defines a "managed_file" Form API field and a "file" field for Field module.
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | 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 = array (); 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 = array (); } 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(); } |
Please login to continue.