You are here

webform_multifile.module in Webform Multiple File Upload 7

Same filename and directory in other branches
  1. 6 webform_multifile.module

File

webform_multifile.module
View source
<?php

/**
 * Implements hook_menu().
 */
function webform_multifile_menu() {
  $items = array();
  $items['node/%webform_menu/submission/%webform_menu_submission/multifile_delete/%/%'] = array(
    'title' => 'Delete multifile upload',
    'load arguments' => array(
      1,
    ),
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'webform_multifile_delete_form',
      1,
      3,
      5,
      6,
    ),
    'access callback' => 'webform_multifile_delete_access',
    'access arguments' => array(
      1,
      3,
      5,
      6,
    ),
    'type' => MENU_CALLBACK,
  );
  return $items;
}

/**
 * Access callback.
 */
function webform_multifile_delete_access($node, $submission, $component_id, $file_id) {
  $submission_access = webform_submission_access($node, $submission, 'edit') && $submission->nid == $node->nid && isset($submission->data[$component_id]);
  if (!$submission_access) {
    return FALSE;
  }
  $submitted_fids = array();
  foreach ($submission->data[$component_id] as $data) {
    $decoded = drupal_json_decode($data);
    if ($decoded) {
      $submitted_fids = array_merge($submitted_fids, $decoded);
    }
  }
  return !empty($submitted_fids) && in_array($file_id, $submitted_fids);
}

/**
 * Implements hook_webform_component_info().
 */
function webform_multifile_webform_component_info() {
  $components = array();
  $components['multifile'] = array(
    'label' => t('Multifile'),
    'description' => t('Multifile Support For Webform File Uploads.'),
    'features' => array(
      'conditional' => FALSE,
      'attachment' => TRUE,
    ),
    'file' => 'multifile.inc',
  );
  return $components;
}

/**
 * Menu callback to delete a single file from a multifile upload.
 */
function webform_multifile_delete_form($form, &$form_state, $webform, $submission, $component_id, $fid) {
  if ($file = file_load($fid)) {
    $form['webform'] = array(
      '#type' => 'value',
      '#value' => $webform,
    );
    $form['submission'] = array(
      '#type' => 'value',
      '#value' => $submission,
    );
    $form['component_id'] = array(
      '#type' => 'value',
      '#value' => $component_id,
    );
    $form['fid'] = array(
      '#type' => 'value',
      '#value' => $file->fid,
    );
    return confirm_form($form, t('Are you sure you want to delete %file?', array(
      '%file' => $file->filename,
    )), 'node/' . $webform->nid . '/submission/' . $submission->sid . '/edit');
  }
  drupal_goto('node/' . $webform->nid . '/submission/' . $submission->sid . '/edit');
}

/**
 * Form submit callback.
 */
function webform_multifile_delete_form_submit($form, &$form_state) {
  $file = file_load($form_state['values']['fid']);
  file_delete($file);

  // Update the submission data and re-save it without the deleted fid.
  $fids = drupal_json_decode($form_state['values']['submission']->data[$form_state['values']['component_id']]['value'][0]);
  $key = array_search($file->fid, $fids);
  unset($fids[$key]);
  $form_state['values']['submission']->data[$form_state['values']['component_id']]['value'][0] = drupal_json_encode($fids);
  module_load_include('inc', 'webform', 'includes/webform.submissions');
  webform_submission_update($form_state['values']['webform'], $form_state['values']['submission']);
  $form_state['redirect'] = 'node/' . $form_state['values']['webform']->nid . '/submission/' . $form_state['values']['submission']->sid . '/edit';
}

/**
 * Implements hook_file_download().
 */
function webform_multifile_file_download($uri) {
  global $user;

  // Determine whether this file was a webform upload. If it was, retrieve file
  // information, plus the user id of the uploader.
  $target_document = db_select('file_managed', 'fm')
    ->fields('fm')
    ->condition('uri', $uri)
    ->execute()
    ->fetchObject();
  $q = db_select('webform_submitted_data', 'wsd');
  $q
    ->join('webform_component', 'wc', 'wsd.cid = wc.cid AND wsd.nid = wc.nid');
  $q
    ->fields('wsd')
    ->condition('wc.type', 'multifile', '=');
  $multifile_scan = $q
    ->execute();
  $submission_id = $submission_uid = NULL;
  while ($multifile_row = $multifile_scan
    ->fetchAssoc()) {
    $file_ids = drupal_json_decode($multifile_row['data']);
    if (in_array($target_document->fid, $file_ids)) {
      $submission_id = $multifile_row['sid'];
    }
  }
  if ($submission_id) {
    $submission_uid = db_select('webform_submissions', 'ws')
      ->fields('ws', array(
      'uid',
    ))
      ->condition('sid', $submission_id, '=')
      ->execute()
      ->fetchObject();
  }
  if ($target_document && $submission_uid) {

    // Allow file access for admins, or for users who are viewing their own
    // submissions.
    if (user_access('access all webform results') || $user->uid == $submission_uid->uid && user_access('access own webform results')) {
      return file_get_content_headers($target_document);
    }

    // This is a webform-controlled file, but the user doesn't have access.
    return -1;
  }

  // This is not a webform-controlled file.
  return NULL;
}

Functions

Namesort descending Description
webform_multifile_delete_access Access callback.
webform_multifile_delete_form Menu callback to delete a single file from a multifile upload.
webform_multifile_delete_form_submit Form submit callback.
webform_multifile_file_download Implements hook_file_download().
webform_multifile_menu Implements hook_menu().
webform_multifile_webform_component_info Implements hook_webform_component_info().