You are here

imce_uploader_plupload.module in IMCE Uploader 7

IMCE Uploader - Plupload

File

plugins/plupload/imce_uploader_plupload.module
View source
<?php

/**
 * @file
 * IMCE Uploader - Plupload
 */

/**
 * Implements hook_imce_uploader().
 */
function imce_uploader_plupload_imce_uploader() {
  $uploaders = array();
  $uploaders['plupload'] = array(
    'title' => t('Plupload'),
    'description' => t('Allows you to upload multiple files using HTML5, Gears, Silverlight, Flash, BrowserPlus or normal forms.'),
    'callback' => 'imce_uploader_plupload',
  );
  return $uploaders;
}

/**
 * Callback to override the upload form.
 *
 * @param array $form
 *   Form element.
 *
 * @param array $form_state
 *   Form state
 *
 * @param array $imce
 *   IMCE profile
 *
 * @see imce_uploader_plupload_process()
 * @see imce_uploader_plupload_value()
 * @see imce_uploader_plupload_submit()
 */
function imce_uploader_plupload(&$form, &$form_state, &$imce) {
  $module_path = drupal_get_path('module', 'imce_uploader_plupload');
  $uploader =& $form['fset_upload']['imce'];
  $uploader['#title_display'] = 'invisible';
  $uploader['#type'] = 'plupload';

  // Find validators.
  if ($imce['extensions'] === '*') {
    $plupload_info = element_info('plupload');
    $value_callback = empty($plupload_info['#value_callback']) ? 'plupload_element_value' : $plupload_info['#value_callback'];
    $uploader['#process'][] = 'imce_uploader_plupload_process';
    $uploader['#value_callback'] = 'imce_uploader_plupload_value';
    $uploader['#default_value_callback'] = $value_callback;
  }
  else {
    $validators['file_validate_extensions'] = array(
      $imce['extensions'],
    );
  }
  $validators['imce_validate_all'] = array(
    &$imce,
  );

  // Element validators.
  $uploader['#upload_validators'] = $validators;

  // Change submit.
  foreach ($form['fset_upload']['upload']['#submit'] as $i => $handler) {
    if ($handler == 'imce_upload_submit') {
      $form['fset_upload']['upload']['#submit'][$i] = 'imce_uploader_plupload_submit';
      break;
    }
  }
  $form['#attached']['js'][] = $module_path . '/js/plupload.min.js';
  $form['#attached']['css'][] = $module_path . '/css/plupload.css';
  unset($form['fset_upload']['imce']['#size']);
}

/**
 * Process callback (#process) for plupload form element.
 *
 * @see imce_uploader_plupload()
 * @see imce_uploader_plupload_value()
 */
function imce_uploader_plupload_process($element) {
  unset($element['#upload_validators']['file_validate_extensions']);
  return $element;
}

/**
 * Validate callback for plupload form element.
 *
 * @see imce_uploader_plupload()
 * @see imce_uploader_plupload_process()
 */
function imce_uploader_plupload_value(&$element, $input = FALSE, $form_state = NULL) {

  // Fool the default element value callback.
  $extensions = array();
  $id = $element['#id'];
  $files = array();
  foreach ($form_state['input'] as $key => $value) {
    if (preg_match('/' . $id . '_([0-9]+)_(.*)/', $key, $reg)) {
      $i = $reg[1];
      $key = $reg[2];
      if (in_array($key, array(
        'tmpname',
        'name',
      ))) {
        $info = pathinfo($value);
        if (!empty($info['extension'])) {
          $ext = strtolower($info['extension']);
          $extensions[$ext] = $ext;
        }
      }
    }
  }
  $element['#upload_validators']['file_validate_extensions'] = array_values($extensions);
  $callback = $element['#default_value_callback'];
  $files = $callback($element, $input, $form_state);
  unset($element['#upload_validators']['file_validate_extensions']);
  return $files;
}

/**
 * Submit handler.
 *
 * @param array $form
 *   Form element.
 *
 * @param array $form_state
 *   Form state
 *
 * @see imce_uploader_plupload()
 */
function imce_uploader_plupload_submit($form, &$form_state) {
  $form_state['redirect'] = FALSE;
  $imce =& $form_state['build_info']['args'][0]['imce'];
  $diruri = imce_dir_uri($imce);
  $replace = variable_get('imce_settings_replace', FILE_EXISTS_RENAME);
  $validators = empty($form['fset_upload']['imce']['#upload_validators']) ? array() : $form['fset_upload']['imce']['#upload_validators'];
  foreach ($form_state['values']['imce'] as $uploaded_file) {
    $tmp = plupload_file_uri_to_object($uploaded_file['tmppath']);
    $tmp->filename = $uploaded_file['name'];
    $errors = file_validate($tmp, $validators);
    if (!empty($errors)) {
      $message = t('The specified file %name could not be uploaded.', array(
        '%name' => $uploaded_file['name'],
      ));
      if (count($errors) > 1) {
        $message .= theme('item_list', array(
          'items' => $errors,
        ));
      }
      else {
        $message .= ' ' . array_pop($errors);
      }
      drupal_set_message($message, 'error');
    }
    elseif ($file = file_move($tmp, $diruri . $uploaded_file['name'], $replace)) {

      // Core bug #54223.
      if ($replace == FILE_EXISTS_RENAME) {
        $name = basename($file->uri);
        if ($name != $tmp->filename) {
          $file->filename = $name;
          drupal_set_message(t('The file has been renamed to %filename.', array(
            '%filename' => $file->filename,
          )));
        }
      }

      // Global user may not be the owner.
      $file->uid = $imce['uid'];
      $file->status = FILE_STATUS_PERMANENT;
      $file->filemime = file_get_mimetype($file->uri);
      drupal_chmod($file->uri);
      file_save($file);
      imce_file_register($file);
      drupal_set_message(t('%filename has been uploaded.', array(
        '%filename' => $file->filename,
      )));

      // Update file list.
      $img = imce_image_info($file->uri);
      $file->width = $img ? $img['width'] : 0;
      $file->height = $img ? $img['height'] : 0;
      imce_add_file($file, $imce);

      // Create thumbnails.
      if (isset($form_state['values']['thumbnails']) && $img) {
        imce_create_thumbnails($file->filename, $imce, $form_state['values']['thumbnails']);
      }
    }
    else {
      $message = t('The specified file %name could not be uploaded.', array(
        '%name' => $uploaded_file['name'],
      ));
      drupal_set_message($message, 'error');
    }
  }
}

Functions

Namesort descending Description
imce_uploader_plupload Callback to override the upload form.
imce_uploader_plupload_imce_uploader Implements hook_imce_uploader().
imce_uploader_plupload_process Process callback (#process) for plupload form element.
imce_uploader_plupload_submit Submit handler.
imce_uploader_plupload_value Validate callback for plupload form element.