You are here

function elfinder_ffsel_element_value in elFinder file manager 7.3

Same name and namespace in other branches
  1. 7.2 modules/elfinder_ffsel/elfinder_ffsel.module \elfinder_ffsel_element_value()

Value handler that adds the files to the filefield values.

Adapted from filefield_source_elfinder_value() and filefield_sources_plupload_element_value()

1 string reference to 'elfinder_ffsel_element_value'
filefield_source_elfinder_process in modules/elfinder_ffsel/elfinder_ffsel.module
A #process callback to extend the filefield_widget element type.

File

modules/elfinder_ffsel/elfinder_ffsel.module, line 232

Code

function elfinder_ffsel_element_value($element, $input = FALSE, &$form_state = NULL) {
  if (empty($input)) {
    return array();
  }
  $field_parents = array_slice($element['#array_parents'], 0, -3);
  $field_element = drupal_array_get_nested_value($form_state['complete form'], $field_parents);
  $field_name = $field_element['#field_name'];
  $langcode = $field_element['#language'];
  $field = field_info_field($field_name);
  $scheme = $field['settings']['uri_scheme'];
  $wrapper = file_stream_wrapper_get_instance_by_scheme($scheme);
  $file_directory_prefix = $wrapper
    ->getDirectoryPath();

  // Get existing file values.
  // File Field items are stored in the field state starting from Drupal 7.9.
  $field_state = field_form_get_state($field_element['#field_parents'], $field_name, $langcode, $form_state);
  if (isset($field_state['items'])) {
    $items = $field_state['items'];
  }
  else {
    $items = drupal_array_get_nested_value($form_state['values'], $field_parents);
  }

  // Update field values with new files.
  $upload_delta = isset($field_element['#file_upload_delta']) ? $field_element['#file_upload_delta'] : 0;
  $files = explode('%%', $input);
  foreach ($files as $delta => $file) {

    // Respect the field's count limit.
    if ($upload_delta == $field['cardinality']) {
      break;
    }
    $uri = preg_replace('/.*(' . preg_quote('/' . $file_directory_prefix . '/', '/') . ')/', $scheme . '://', $file);

    // 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)) {
        $items[$upload_delta] = (array) $file;
        $items[$upload_delta]['_weight'] = $upload_delta;
        $upload_delta++;
      }
    }
    else {
      $local_root = elfinder_document_root() . '/' . $file_directory_prefix . '/';
      $file_path = preg_replace('/.*(' . preg_quote('/' . $file_directory_prefix . '/', '/') . ')/', $local_root, $file);
      if ($file = filefield_sources_save_file($file_path, $element['#upload_validators'], $element['#upload_location'], FILE_EXISTS_REPLACE)) {
        $items[$upload_delta] = (array) $file;
        $items[$upload_delta]['_weight'] = $upload_delta;
        $upload_delta++;
        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.'));
      }
    }
  }

  // Update form_state values.
  drupal_array_set_nested_value($form_state['values'], $field_parents, $items);

  // Update items.
  $field_state['items'] = $items;
  field_form_set_state($field_element['#field_parents'], $field_name, $langcode, $form_state, $field_state);
  return '';
}