View source
<?php
module_load_include('inc', 'multiupload_filefield_widget', 'multiupload_filefield_widget.field');
function multiupload_filefield_widget_element_info() {
$file_path = drupal_get_path('module', 'file');
$mfw_path = drupal_get_path('module', 'multiupload_filefield_widget');
$types['mfw_managed_file'] = array(
'#input' => TRUE,
'#process' => array(
'mfw_managed_file_process',
),
'#value_callback' => 'mfw_managed_file_value',
'#element_validate' => array(
'file_managed_file_validate',
),
'#pre_render' => array(
'file_managed_file_pre_render',
),
'#theme' => 'file_managed_file',
'#theme_wrappers' => array(
'form_element',
),
'#progress_indicator' => 'throbber',
'#progress_message' => NULL,
'#upload_validators' => array(),
'#upload_location' => NULL,
'#extended' => FALSE,
'#size' => 22,
'#attached' => array(
'css' => array(
$file_path . '/file.css',
),
'js' => array(
$mfw_path . '/mfw.js',
$file_path . '/file.js',
),
),
);
return $types;
}
function mfw_managed_file_process($element, &$form_state, &$form) {
$element = file_managed_file_process($element, $form_state, $form);
$element['upload']['#attributes'] = array(
'multiple' => 'multiple',
);
$element['upload']['#name'] .= '[]';
if (!empty($element['upload']['#attached']['js'][0]['data']['file'])) {
$element['upload']['#attached']['js'][0]['data']['mfw'] = $element['upload']['#attached']['js'][0]['data']['file'];
}
unset($element['upload']['#attached']['js'][0]['data']['file']);
return $element;
}
function mfw_managed_file_value(&$element, $input = FALSE, $form_state = NULL) {
$fid = 0;
$form_state_fid = $form_state['values'];
foreach ($element['#parents'] as $parent) {
$form_state_fid = isset($form_state_fid[$parent]) ? $form_state_fid[$parent] : 0;
}
if ($element['#extended'] && isset($form_state_fid['fid'])) {
$fid = $form_state_fid['fid'];
}
elseif (is_numeric($form_state_fid)) {
$fid = $form_state_fid;
}
if ($input !== FALSE) {
$return = $input;
$element_parent = drupal_array_get_nested_value($form_state['complete form'], array_slice($element['#parents'], 0, -1));
$element['#file_upload_delta_original'] = isset($element_parent['#file_upload_delta']) ? $element_parent['#file_upload_delta'] : 0;
if ($file = mfw_managed_file_save_upload($element)) {
$fid = $file->fid;
}
else {
if (isset($element['#file_value_callbacks'])) {
foreach ($element['#file_value_callbacks'] as $callback) {
$callback($element, $input, $form_state);
}
}
if (isset($input['fid']) && ($file = file_load($input['fid']))) {
$fid = $file->fid;
}
}
}
else {
if ($element['#extended']) {
$default_fid = isset($element['#default_value']['fid']) ? $element['#default_value']['fid'] : 0;
$return = isset($element['#default_value']) ? $element['#default_value'] : array(
'fid' => 0,
);
}
else {
$default_fid = isset($element['#default_value']) ? $element['#default_value'] : 0;
$return = array(
'fid' => 0,
);
}
if ($default_fid && ($file = file_load($default_fid))) {
$fid = $file->fid;
}
}
$return['fid'] = $fid;
return $return;
}
function mfw_managed_file_save_upload($element) {
$last_parent = array_pop($element['#parents']);
$upload_name = implode('_', $element['#parents']) . '_' . $element['#file_upload_delta_original'];
array_push($element['#parents'], $last_parent);
$file_number = $last_parent - $element['#file_upload_delta_original'];
if (isset($_FILES['files']['name'][$upload_name][$file_number])) {
$name = $_FILES['files']['name'][$upload_name][$file_number];
if (empty($name)) {
return FALSE;
}
$destination = isset($element['#upload_location']) ? $element['#upload_location'] : NULL;
if (isset($destination) && !file_prepare_directory($destination, FILE_CREATE_DIRECTORY)) {
watchdog('file', 'The upload directory %directory for the file field !name could not be created or is not accessible. A newly uploaded file could not be saved in this directory as a consequence, and the upload was canceled.', array(
'%directory' => $destination,
'!name' => $element['#field_name'],
));
form_set_error($upload_name, t('The file could not be uploaded.'));
return FALSE;
}
if (!($file = mfw_file_save_upload($upload_name, $file_number, $element['#upload_validators'], $destination))) {
watchdog('file', 'The file upload failed. %upload', array(
'%upload' => $upload_name,
));
form_set_error($upload_name, t('The file in the !name field was unable to be uploaded.', array(
'!name' => $element['#title'],
)));
return FALSE;
}
return $file;
}
else {
return FALSE;
}
}
function mfw_file_save_upload($source, $file_number, $validators = array(), $destination = FALSE, $replace = FILE_EXISTS_RENAME) {
global $user;
static $upload_cache;
if (isset($upload_cache[$source][$file_number])) {
return $upload_cache[$source][$file_number];
}
if (empty($_FILES['files']['name'][$source][$file_number])) {
return NULL;
}
switch ($_FILES['files']['error'][$source][$file_number]) {
case UPLOAD_ERR_INI_SIZE:
case UPLOAD_ERR_FORM_SIZE:
drupal_set_message(t('The file %file could not be saved, because it exceeds %maxsize, the maximum allowed size for uploads.', array(
'%file' => $_FILES['files']['name'][$source][$file_number],
'%maxsize' => format_size(file_upload_max_size()),
)), 'error');
return FALSE;
case UPLOAD_ERR_PARTIAL:
case UPLOAD_ERR_NO_FILE:
drupal_set_message(t('The file %file could not be saved, because the upload did not complete.', array(
'%file' => $_FILES['files']['name'][$source][$file_number],
)), 'error');
return FALSE;
case UPLOAD_ERR_OK:
if (is_uploaded_file($_FILES['files']['tmp_name'][$source][$file_number])) {
break;
}
default:
drupal_set_message(t('The file %file could not be saved. An unknown error has occurred.', array(
'%file' => $_FILES['files']['name'][$source][$file_number],
)), 'error');
return FALSE;
}
$file = new stdClass();
$file->uid = $user->uid;
$file->status = 0;
$file->filename = trim(drupal_basename($_FILES['files']['name'][$source][$file_number]), '.');
$file->uri = $_FILES['files']['tmp_name'][$source][$file_number];
$file->filemime = file_get_mimetype($file->filename);
$file->filesize = $_FILES['files']['size'][$source][$file_number];
$extensions = '';
if (isset($validators['file_validate_extensions'])) {
if (isset($validators['file_validate_extensions'][0])) {
$extensions = $validators['file_validate_extensions'][0];
}
else {
unset($validators['file_validate_extensions']);
}
}
else {
$extensions = 'jpg jpeg gif png txt doc xls pdf ppt pps odt ods odp';
$validators['file_validate_extensions'] = array();
$validators['file_validate_extensions'][0] = $extensions;
}
if (!empty($extensions)) {
$file->filename = file_munge_filename($file->filename, $extensions);
}
if (!variable_get('allow_insecure_uploads', 0) && preg_match('/\\.(php|pl|py|cgi|asp|js)(\\.|$)/i', $file->filename) && substr($file->filename, -4) != '.txt') {
$file->filemime = 'text/plain';
$file->uri .= '.txt';
$file->filename .= '.txt';
if (!empty($extensions)) {
$validators['file_validate_extensions'][0] .= ' txt';
drupal_set_message(t('For security reasons, your upload has been renamed to %filename.', array(
'%filename' => $file->filename,
)));
}
}
if (empty($destination)) {
$destination = 'temporary://';
}
$destination_scheme = file_uri_scheme($destination);
if (!$destination_scheme || !file_stream_wrapper_valid_scheme($destination_scheme)) {
drupal_set_message(t('The file could not be uploaded, because the destination %destination is invalid.', array(
'%destination' => $destination,
)), 'error');
return FALSE;
}
$file->source = $source;
if (substr($destination, -1) != '/') {
$destination .= '/';
}
$file->destination = file_destination($destination . $file->filename, $replace);
if ($file->destination === FALSE) {
drupal_set_message(t('The file %source could not be uploaded because a file by that name already exists in the destination %directory.', array(
'%source' => $source,
'%directory' => $destination,
)), 'error');
return FALSE;
}
$validators['file_validate_name_length'] = array();
$errors = file_validate($file, $validators);
if (!empty($errors)) {
$message = t('The specified file %name could not be uploaded.', array(
'%name' => $file->filename,
));
if (count($errors) > 1) {
$message .= theme('item_list', array(
'items' => $errors,
));
}
else {
$message .= ' ' . array_pop($errors);
}
form_set_error($source, $message);
return FALSE;
}
$file->uri = $file->destination;
if (!drupal_move_uploaded_file($_FILES['files']['tmp_name'][$source][$file_number], $file->uri)) {
form_set_error($source, t('File upload error. Could not move uploaded file.'));
watchdog('file', 'Upload error. Could not move uploaded file %file to destination %destination.', array(
'%file' => $file->filename,
'%destination' => $file->uri,
));
return FALSE;
}
drupal_chmod($file->uri);
if ($replace == FILE_EXISTS_REPLACE) {
$existing_files = file_load_multiple(array(), array(
'uri' => $file->uri,
));
if (count($existing_files)) {
$existing = reset($existing_files);
$file->fid = $existing->fid;
}
}
if ($file = file_save($file)) {
$upload_cache[$source][$file_number] = $file;
return $file;
}
return FALSE;
}
function multiupload_filefield_widget_insert_widgets() {
return array(
'file_mfw' => array(
'element_type' => 'mfw_managed_file',
'wrapper' => '.file-widget',
'fields' => array(
'description' => 'input[name$="[description]"]',
),
),
);
}