function file_entity_add_upload_submit in File Entity (fieldable files) 7.3
Same name and namespace in other branches
- 7.2 file_entity.pages.inc \file_entity_add_upload_submit()
Submit handler for the add file form.
3 string references to 'file_entity_add_upload_submit'
- file_entity_add_upload_step_fields in ./
file_entity.pages.inc - Generate form fields for the fourth step in the add file wizard.
- file_entity_add_upload_step_filetype in ./
file_entity.pages.inc - Generate form fields for the second step in the add file wizard.
- file_entity_add_upload_step_scheme in ./
file_entity.pages.inc - Generate form fields for the third step in the add file wizard.
File
- ./
file_entity.pages.inc, line 495 - Supports file operations including View, Edit, and Delete.
Code
function file_entity_add_upload_submit($form, &$form_state) {
$form_state['storage'] = isset($form_state['storage']) ? $form_state['storage'] : array();
$form_state['storage'] = array_merge($form_state['storage'], $form_state['values']);
// Field selected allowed types.
$selected_files = $form['#options']['types'];
// This var is set to TRUE when we are ready to save the file.
$save = FALSE;
$trigger = $form_state['triggering_element']['#id'];
$triggered_next = $trigger == 'edit-next' || strpos($trigger, 'edit-next--') === 0;
$triggered_previous = $trigger == 'edit-previous' || strpos($trigger, 'edit-previous--') === 0;
$step_delta = $triggered_previous ? -1 : 1;
$steps_to_check = array(
2,
3,
);
if ($triggered_previous) {
// If the previous button was hit,
// the step checking order should be reversed 3, 2.
$steps_to_check = array_reverse($steps_to_check);
}
foreach ($steps_to_check as $step) {
// Check if we can skip step 2 and 3.
if ($form['#step'] == $step - 1 && $triggered_next || $form['#step'] == $step + 1 && $triggered_previous) {
$file = file_load($form_state['storage']['upload']);
if ($step == 2) {
// Check if we can skip step 2.
$candidates = file_entity_get_filetype_candidates($file, $selected_files);
if (count($candidates) == 1) {
$candidates_keys = array_keys($candidates);
// There is only one possible filetype for this file.
// Skip the second page.
$form['#step'] += $step_delta;
$form_state['storage']['type'] = reset($candidates_keys);
}
elseif (!$candidates || variable_get('file_entity_file_upload_wizard_skip_file_type', FALSE)) {
// Do not assign the file a file type.
$form['#step'] += $step_delta;
$form_state['storage']['type'] = FILE_TYPE_NONE;
}
}
else {
// Check if we can skip step 3.
$options = $form['#options'];
$schemes = file_get_stream_wrappers(STREAM_WRAPPERS_WRITE_VISIBLE);
// Remove any schemes not found in the instance settings.
if (!empty($options['schemes'])) {
$schemes = array_intersect_key($schemes, $options['schemes']);
}
if (!file_entity_file_is_writeable($file)) {
// The file is read-only (remote) and must use its provided scheme.
$form['#step'] += $step_delta;
$form_state['storage']['scheme'] = file_uri_scheme($file->uri);
}
elseif (count($schemes) == 1) {
// There is only one possible stream wrapper for this file.
// Skip the third page.
$form['#step'] += $step_delta;
$form_state['storage']['scheme'] = key($schemes);
}
elseif (variable_get('file_entity_file_upload_wizard_skip_scheme', FALSE)) {
$form['#step'] += $step_delta;
// Fallback to the URI scheme specified in the field settings
// otherwise use the default file scheme.
if (!empty($options['uri_scheme'])) {
$form_state['storage']['scheme'] = $options['uri_scheme'];
}
else {
$form_state['storage']['scheme'] = file_default_scheme();
}
}
}
}
}
// We have the filetype, check if we can skip step 4.
if ($form['#step'] == 3 && $triggered_next) {
$file = file_load($form_state['storage']['upload']);
$form_state['file'] = $file;
if (!field_info_instances('file', $form_state['storage']['type'])) {
// This filetype doesn't have fields, save the file.
$save = TRUE;
}
elseif (variable_get('file_entity_file_upload_wizard_skip_fields', FALSE)) {
// Save the file with blanks fields.
$save = TRUE;
}
// Allow other modules to choose to skip or complete step 4.
drupal_alter('file_entity_file_upload_skip_fields', $save, $form_state);
}
// Form id's can vary depending on how many other forms are displayed, so we
// need to do string comparissons. e.g edit-submit--2.
if ($triggered_next) {
$form_state['step'] = $form['#step'] + 1;
}
elseif ($triggered_previous) {
$form_state['step'] = $form['#step'] - 1;
}
elseif (strpos($trigger, 'edit-submit') !== FALSE) {
$save = TRUE;
}
if ($save) {
$file = file_load($form_state['storage']['upload']);
if ($file) {
if (file_uri_scheme($file->uri) != $form_state['storage']['scheme']) {
$file_destination = $form_state['storage']['scheme'] . '://' . file_uri_target($file->uri);
$file_destination = file_stream_wrapper_uri_normalize($file_destination);
if ($moved_file = file_move($file, $file_destination, FILE_EXISTS_RENAME)) {
// Only re-assign the file object if file_move() did not fail.
$file = $moved_file;
}
}
$file->type = $form_state['storage']['type'];
$file->display = TRUE;
// Change the file from temporary to permanent.
$file->status = FILE_STATUS_PERMANENT;
// Save the form fields.
// Keep in mind that the values for the Field API fields must be in
// $form_state['values'] and not in ['storage']. This is true as long as
// the fields are on the last page of the multi step form.
entity_form_submit_build_entity('file', $file, $form, $form_state);
file_save($file);
$form_state['file'] = $file;
drupal_set_message(t('@type %name was uploaded.', array(
'@type' => file_entity_type_get_name($file),
'%name' => $file->filename,
)));
}
else {
drupal_set_message(t('An error occurred and no file was uploaded.'), 'error');
return;
}
// Figure out destination.
if (user_access('administer files')) {
$path = 'admin/content/file';
}
else {
$path = 'file/' . $file->fid;
}
$form_state['redirect'] = $path;
}
else {
$form_state['rebuild'] = TRUE;
}
// Clear the page and block caches.
cache_clear_all();
}