t('elFinder'), 'label' => t('elFinder File browser'), 'description' => t('Uses elFinder file manager for file selection'), 'process' => 'filefield_source_elfinder_process', 'weight' => -1, ); return $source; } /** * Implementation of hook_menu(). */ function filefield_source_elfinder_menu() { $items = array(); $items['filefield/elfinder/%/%'] = array( 'page callback' => 'filefield_source_elfinder_page', 'page arguments' => array(2, 3), 'access callback' => 'filefield_edit_access', 'access arguments' => array(2, 3), 'type' => MENU_CALLBACK, ); return $items; } /** * Implementation of hook_theme(). */ function elfinder_ffsel_theme() { return array( 'filefield_source_elfinder_element' => array( 'render element' => 'element', ), ); } /** * Implementation of hook_filefield_source_settings(). */ function filefield_source_elfinder_settings($op, $field) { $return = array(); // Add settings to the FileField widget form. return $return; } /** * A #process callback to extend the filefield_widget element type. */ function filefield_source_elfinder_process($element, &$form_state, $form) { $instance = field_widget_instance($element, $form_state); $element['filefield_elfinder'] = array( '#weight' => 100.5, '#theme' => 'filefield_source_elfinder_element', '#filefield_source' => TRUE, // Required for proper theming. '#description' => filefield_sources_element_validation_help($element['#upload_validators']), ); $filepath_id = $element['#id'] . '-elfinder-path'; $display_id = $element['#id'] . '-elfinder-display'; $select_id = $element['#id'] . '-elfinder-select'; $element['filefield_elfinder']['file_path'] = array( '#type' => 'hidden', '#attributes' => array( 'id' => $filepath_id, 'onchange' => "if (!jQuery('#$select_id').attr('disabled')) { jQuery('#$select_id').mousedown().attr('disabled', true); jQuery('#$display_id').html(this.value); }", ), '#value_callback' => 'elfinder_ffsel_element_value', '#upload_validators' => $element['#upload_validators'], '#maxlength' => NULL, ); $width = variable_get('elfinder_settings_misc_manager_width', ''); if (!$width) { $width = ELFINDER_POPUP_WIDTH; } $height = variable_get('elfinder_settings_misc_manager_height', ''); if (!$height) { $height = ELFINDER_POPUP_HEIGHT; } $elfinder_function = 'var left = window.screenX + (window.innerWidth / 2) - (' . $width . ' / 2); var top = window.screenY + (window.innerHeight / 2) - (' . $height . ' / 2); window.open(\'' . url('elfinder', array('query' => array('app' => 'ffs', 'field_name' => $element['#field_name'], 'filepath_id' => $filepath_id, 'select_id' => $select_id))) . '\', \'\', \'width=' . $width . ',height=' . $height . ',top=\'+top+\',left=\'+left+\',resizable=1\'); return false;'; $element['filefield_elfinder']['display_path'] = array( '#type' => 'markup', '#markup' => '' . t('No file selected') . ' (' . t('browse') . ')', ); $element['filefield_elfinder']['upload_button'] = array( '#name' => implode('_', $element['#array_parents']) . '_elfinder_select', '#type' => 'submit', '#value' => t('Select'), '#validate' => array(), '#submit' => array('filefield_sources_field_submit'), '#limit_validation_errors' => array($element['#parents']), '#name' => $element['#name'] . '[filefield_elfinder][button]', '#id' => $select_id, '#attributes' => array('style' => 'display: none;'), '#ajax' => array( 'path' => 'file/ajax/' . implode('/', $element['#array_parents']) . '/' . $form['form_build_id']['#value'], 'wrapper' => $element['upload_button']['#ajax']['wrapper'], 'method' => 'replace', 'effect' => 'fade', ), ); return $element; } /** * A #filefield_value_callback function. * * No longer used. */ function filefield_source_elfinder_value($element, &$item) { if (isset($item['filefield_elfinder']['file_path']) && $item['filefield_elfinder']['file_path'] != '') { $field = field_info_field($element['#field_name']); $scheme = $field['settings']['uri_scheme']; $wrapper = file_stream_wrapper_get_instance_by_scheme($scheme); $file_directory_prefix = $wrapper->getDirectoryPath(); $uri = preg_replace('/.*(' . preg_quote('/' . $file_directory_prefix . '/', '/') . ')/', $scheme . '://', $item['filefield_elfinder']['file_path']); // Resolve the file path to an FID. $fid = db_select('file_managed', 'f') ->condition('uri', rawurldecode($uri)) ->fields('f', array('fid')) ->execute() ->fetchField(); if ($fid) { $file = file_load($fid); if (filefield_sources_element_validate($element, $file)) { $item = array_merge($item, (array)$file); } } else { $local_root = elfinder_document_root() . '/' . $file_directory_prefix . '/'; $file_path = preg_replace('/.*(' . preg_quote('/' . $file_directory_prefix . '/', '/') . ')/', $local_root, $item['filefield_elfinder']['file_path']); if ($file = filefield_sources_save_file($file_path, $element['#upload_validators'], $element['#upload_location'], FILE_EXISTS_REPLACE)) { $item = array_merge($item, (array)$file); drupal_set_message(t('File created')); } else { form_error($element, t('The selected file could not be used because the file does not exist in the database.')); } } // No matter what happens, clear the value from the file path field. $item['filefield_elfinder']['file_path'] = ''; } } /** * Theme the output of the autocomplete field. */ function theme_filefield_source_elfinder_element($variables) { $element = $variables['element']; $output = drupal_render_children($element); return '