You are here

block_upload.module in Block Upload 7

Block Upload module.

File

block_upload.module
View source
<?php

/**
 * @file
 * Block Upload module.
 */

/**
 * Implements hook_permission().
 */
function block_upload_permission() {
  return array(
    'block upload' => array(
      'title' => t('Block upload'),
      'description' => t('Upload files through the block.'),
    ),
    'block remove' => array(
      'title' => t('Allow to remove files via block'),
      'description' => t('Allow user to remove files through the block.'),
    ),
  );
}

/**
 * Implements hook_menu().
 */
function block_upload_menu() {
  $items['admin/config/content/block_upload'] = array(
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'block_upload_settings_form',
    ),
    'title' => 'Block Upload settings',
    'access arguments' => array(
      'administer site',
    ),
    'file' => 'block_upload.admin.inc',
  );
  return $items;
}

/**
 * Implements hook_block_info().
 */
function block_upload_block_info() {
  $blocks_count = variable_get('block_upload_blocks_count', 1);
  for ($i = 1; $i <= $blocks_count; $i++) {
    $blocks['block_upload_' . $i] = array(
      'info' => t('Block Upload') . ' ' . $i,
    );
  }
  return $blocks;
}

/**
 * Implements hook_block_configure().
 */
function block_upload_block_configure($delta = '') {
  $form = array();
  $blocks_count = variable_get('block_upload_blocks_count', 1);
  for ($i = 1; $i <= $blocks_count; $i++) {
    if ($delta == 'block_upload_' . $i) {
      $fields = block_upload_get_field_list();
      $form['block_upload_' . $i . '_field'] = array(
        '#type' => 'select',
        '#title' => t('Field'),
        '#description' => t('Select field you wish to upload file.'),
        '#options' => $fields,
        '#default_value' => array(
          variable_get('block_upload_' . $i . '_field', ''),
        ),
        '#ajax' => array(
          'callback' => 'block_upload_ajax_callback',
          'wrapper' => 'config',
          'effect' => 'fade',
        ),
      );
      $form['block_upload_id'] = array(
        '#type' => 'textfield',
        '#default_value' => $i,
        '#access' => FALSE,
      );

      // Add field additional display options.
      $field_name = variable_get('block_upload_' . $i . '_field', '');
      $field = field_info_field($field_name);
      _block_upload_field_options_form_elements($form, $i, $field['type']);

      // Check if plupload module exists and displau enable option.
      if (module_exists('plupload')) {
        $settings = variable_get('block_upload_' . $i . '_settings', array());
        $form['block_upload_' . $i . '_plupload_status'] = array(
          '#type' => 'checkbox',
          '#title' => t('Use Plupoad for file uploads'),
          '#default_value' => isset($settings['plupload']) ? $settings['plupload'] : 0,
        );
      }
      else {
        $link = l(t('Plupload integration'), 'https://drupal.org/project/plupload', array(
          'external' => TRUE,
          'attributes' => array(
            'target' => '_blank',
          ),
        ));
        $description = t('To enable multiuploads and drag&drop upload features, download and install !link module', array(
          '!link' => $link,
        ));
        $form['block_upload_plupload_status'] = array(
          '#type' => 'checkbox',
          '#title' => t('Use Plupoad for file uploads'),
          '#disabled' => TRUE,
          '#description' => $description,
        );
      }
    }
  }
  return $form;
}

/**
 * Implements hook_block_save().
 */
function block_upload_block_save($delta = '', $edit = array()) {
  $id = $edit['block_upload_id'];
  $block_id = 'block_upload_' . $id . '_';
  variable_set($block_id . 'field', $edit[$block_id . 'field']);
  $settings = array();
  $settings['plupload'] = isset($edit[$block_id . 'plupload_status']) ? $edit[$block_id . 'plupload_status'] : FALSE;
  $settings['alt'] = isset($edit[$block_id . 'alt']) ? $edit[$block_id . 'alt'] : FALSE;
  $settings['title'] = isset($edit[$block_id . 'title']) ? $edit[$block_id . 'title'] : FALSE;
  $settings['desc'] = isset($edit[$block_id . 'desc']) ? $edit[$block_id . 'desc'] : FALSE;
  variable_set($block_id . 'settings', $settings);
}

/**
 * Implements hook_block_view().
 */
function block_upload_block_view($delta = '') {
  $block = array();
  $blocks_count = variable_get('block_upload_blocks_count', 1);
  for ($i = 1; $i <= $blocks_count; $i++) {
    if ($delta == 'block_upload_' . $i && user_access('block upload') && ($node = menu_get_object())) {
      $field = field_info_field(variable_get('block_upload_' . $i . '_field', ''));
      if (!empty($field['bundles']['node'])) {
        foreach ($field['bundles']['node'] as $bundle) {
          if ($bundle == $node->type) {
            $settings = variable_get('block_upload_' . $i . '_settings', array());
            if (isset($settings['plupload']) && $settings['plupload']) {

              // Plupload integration form.
              $block['content'] = drupal_get_form('block_upload_plupload_form', $node, $i);
            }
            else {

              // Simple file upload form.
              $block['content'] = drupal_get_form('block_upload_form', $node, $i);
            }
          }
        }
      }
    }
  }
  return $block;
}

/**
 * Builds form for removing the files with block.
 */
function block_upload_remove_form($field_limit, $node, $field) {
  foreach ($node->{$field}[LANGUAGE_NONE] as $key => $val) {
    $uploader = user_load($val['uid']);
    $uploader = l($uploader->name, 'user/' . $uploader->uid);
    $options[$val['fid']] = array(
      array(
        'data' => array(
          '#type' => 'item',
          '#title' => filter_xss($uploader),
          '#description' => check_plain(format_date($val['timestamp'])),
        ),
      ),
      array(
        'data' => array(
          '#theme' => 'file_link',
          '#file' => (object) $val,
        ),
        'field_type' => $field_limit['type'],
      ),
    );
  }
  $header = array(
    t('Uploader'),
    t('File'),
  );
  $form = array(
    '#type' => 'tableselect',
    '#header' => $header,
    '#options' => $options,
    '#empty' => t('No content available.'),
    '#attributes' => array(
      'class' => array(
        'delete-files',
      ),
    ),
  );
  return $form;
}

/**
 * Block upload form.
 *
 * @see block_upload_form_validate()
 * @see block_upload_form_submit()
 *
 * @return array
 *   Form.
 */
function block_upload_form($form, &$form_state, $node, $buid) {
  $submit = FALSE;
  $field = variable_get('block_upload_' . $buid . '_field', '');
  $field_limit = field_info_field($field);
  $field_info = field_info_instance('node', $field, $node->type);
  if (isset($node->{$field}[LANGUAGE_NONE])) {
    $field_files_exists = count($node->{$field}[LANGUAGE_NONE]);
  }
  else {
    $field_files_exists = 0;
  }
  if (user_access('block remove') && $field_files_exists > 0) {
    $title_remove_form = t('Remove files');
    $form['remove_files_title'] = array(
      '#markup' => '<h3>' . $title_remove_form . '</h3>',
    );
    $form['remove_files'] = block_upload_remove_form($field_limit, $node, $field);
    $submit = TRUE;
  }
  if ($field_limit['cardinality'] > $field_files_exists || $field_limit['cardinality'] == FIELD_CARDINALITY_UNLIMITED) {
    $title_upload_form = t('Upload file');
    $form['upload_files_title'] = array(
      '#markup' => '<h3>' . $title_upload_form . '</h3>',
    );
    $form['block_upload_file'] = array(
      '#type' => 'managed_file',
      '#upload_location' => block_upload_get_upload_destination($field_info),
      '#upload_validators' => block_upload_get_validators($field, $field_info),
    );
    $submit = TRUE;
    $settings = variable_get('block_upload_' . $buid . '_settings', array());
    if (isset($settings['alt']) && $settings['alt']) {
      $form['block_upload_' . $buid . '_alt'] = array(
        '#type' => 'textfield',
        '#title' => t('Alt'),
      );
    }
    if (isset($settings['title']) && $settings['title']) {
      $form['block_upload_' . $buid . '_title'] = array(
        '#type' => 'textfield',
        '#title' => t('Title'),
      );
    }
    if (isset($settings['desc']) && $settings['desc']) {
      $form['block_upload_' . $buid . '_desc'] = array(
        '#type' => 'textfield',
        '#title' => t('Description'),
      );
    }
  }
  else {
    $form[] = array(
      '#type' => 'item',
      '#description' => t('Exceeded limit of files'),
    );
  }
  if ($submit) {
    $module_path = drupal_get_path('module', 'block_upload');
    $form['#attached']['js'] = array(
      $module_path . '/theme/block_upload.js',
    );
    $form['#attached']['css'] = array(
      $module_path . '/theme/block_upload.css',
    );
    $form['block_upload_nid'] = array(
      '#type' => 'textfield',
      '#access' => FALSE,
      '#value' => $node->nid,
    );
    $form['block_upload_node_type'] = array(
      '#type' => 'textfield',
      '#access' => FALSE,
      '#value' => $node->type,
    );
    $form['buid'] = array(
      '#type' => 'value',
      '#value' => $buid,
    );
    $form['submit'] = array(
      '#type' => 'submit',
      '#value' => t('Save'),
    );
  }
  return $form;
}

/**
 * Validate and save uploaded file.
 */
function block_upload_form_validate($form, &$form_state) {
  $values = $form_state['values'];
  if (!empty($values['block_upload_file'])) {
    $buid = $values['buid'];
    $field_name = variable_get('block_upload_' . $buid . '_field', '');
    $field = field_info_instance('node', $field_name, $values['block_upload_node_type']);
    $file = file_load($form_state['values']['block_upload_file']);
    $file->status = FILE_STATUS_PERMANENT;
    if ($field['widget']['module'] == 'file') {
      $file->display = 1;
    }
    $file = file_save($file);
    $form_state['storage']['file'] = $file;
  }
}

/**
 * Save uploaded file to node.
 */
function block_upload_form_submit($form, &$form_state) {
  $values = $form_state['values'];
  $nid = $values['block_upload_nid'];
  $buid = $values['buid'];
  $field_name = variable_get('block_upload_' . $buid . '_field', '');
  $node = node_load($nid);
  if (isset($form_state['input']['remove_files'])) {
    if (array_filter($form_state['input']['remove_files'])) {
      block_upload_deletefiles($node, $field_name, $form_state);
    }
  }
  if (isset($form_state['storage']['file'])) {
    $file = $form_state['storage']['file'];
    if (isset($values['block_upload_' . $buid . '_alt'])) {
      $file->alt = check_plain($values['block_upload_' . $buid . '_alt']);
    }
    if (isset($values['block_upload_' . $buid . '_title'])) {
      $file->title = check_plain($values['block_upload_' . $buid . '_title']);
    }
    if (isset($values['block_upload_' . $buid . '_desc'])) {
      $file->description = check_plain($values['block_upload_' . $buid . '_desc']);
    }
    $node->{$field_name}[LANGUAGE_NONE][] = (array) $file;
    unset($form_state['storage']['file']);
    drupal_set_message(t('File was successfully uploaded!'));
  }

  // Do not change existing path alias if pathauto module installed.
  if (module_exists('pathauto')) {
    $node->path['pathauto'] = FALSE;
  }
  node_save($node);
}

/**
 * Returns avaliable field list of filefield type.
 *
 * @return array
 *   Field list.
 */
function block_upload_get_field_list() {
  $fields = array();
  foreach (field_info_fields() as $key => $item) {

    // Display only file type fields.
    if ($item['type'] == 'image' || $item['type'] == 'file') {
      $fields[$key] = $item['field_name'];
    }
  }
  return $fields;
}

/**
 * Returns destinaton for file upload.
 *
 * @return string
 *   Destination path.
 */
function block_upload_get_upload_destination($field) {
  if ($destination = $field['settings']['file_directory']) {
    if (module_exists('token')) {
      $node = menu_get_object();
      $destination = token_replace($destination, array(
        'node' => $node,
      ));
    }
  }
  $field_info = field_info_field($field['field_name']);
  $uri_scheme = $field_info['settings']['uri_scheme'];
  if (!$uri_scheme) {
    $uri_scheme = 'public';
  }
  $destination = $uri_scheme . '://' . $destination;
  file_prepare_directory($destination, FILE_CREATE_DIRECTORY);
  return $destination;
}

/**
 * Returns validators array.
 *
 * @return array
 *   List of validators.
 */
function block_upload_get_validators($field_name, $field) {
  $validators = file_field_widget_upload_validators($field_name, $field);
  if ($field['widget']['module'] == 'image') {
    $validators['file_validate_is_image'] = array();
    $validators['file_validate_image_resolution'] = array(
      $field['settings']['max_resolution'],
      $field['settings']['min_resolution'],
    );
  }
  return $validators;
}

/**
 * Deletes files marked by checkbox in deletion form.
 */
function block_upload_deletefiles($node, $field_name, &$form_state) {
  $delete_files = array_values($form_state['input']['remove_files']);
  foreach ($node->{$field_name}[LANGUAGE_NONE] as $key => $file_field) {
    if (in_array($file_field['fid'], $delete_files)) {
      $old_file = file_load($file_field['fid']);
      file_delete($old_file, TRUE);
      unset($node->{$field_name}[LANGUAGE_NONE][$key]);
    }
  }
  drupal_set_message(t('File(s) was successfully deleted!'));
}

/**
 * Returns plupload form for the form builder.
 *
 * @see block_upload_plupload_form_submit()
 */
function block_upload_plupload_form($form, &$form_state, $node, $buid) {
  $field_name = variable_get('block_upload_' . $buid . '_field', '');
  $field = field_info_instance('node', $field_name, $node->type);
  $validators = block_upload_get_validators($field_name, $field);
  $submit = FALSE;
  $field_limit = field_info_field($field_name);
  if (isset($node->{$field_name}[LANGUAGE_NONE])) {
    $field_files_exists = count($node->{$field_name}[LANGUAGE_NONE]);
  }
  else {
    $field_files_exists = 0;
  }
  if (user_access('block remove') && $field_files_exists > 0) {
    $title_remove_form = t('Remove files');
    $form['remove_files_title'] = array(
      '#markup' => '<h3>' . $title_remove_form . '</h3>',
    );
    $form['remove_files'] = block_upload_remove_form($field_limit, $node, $field_name);
    $submit = TRUE;
  }
  if ($field_limit['cardinality'] > $field_files_exists || $field_limit['cardinality'] == FIELD_CARDINALITY_UNLIMITED) {
    if ($field_limit['cardinality'] != FIELD_CARDINALITY_UNLIMITED) {
      $avaliable = $field_limit['cardinality'] - $field_files_exists;
      $attention = t('Attention: Thit field is limited to uploading files. Availability %num%', array(
        '%num%' => $avaliable,
      ));
      $form[] = array(
        '#type' => 'item',
        '#title' => check_plain($attention),
      );
    }
    $submit = TRUE;
    unset($validators['file_validate_is_image']);
    $title_upload_form = t('Upload files');
    $form['upload_files_title'] = array(
      '#markup' => '<h3>' . $title_upload_form . '</h3>',
    );
    $form['block_upload_file'] = array(
      '#type' => 'plupload',
      '#upload_validators' => $validators,
    );
  }
  else {
    $form[] = array(
      '#type' => 'item',
      '#description' => t('Exceeded limit of files'),
    );
  }
  $form_state['node'] = $node;
  $form_state['field'] = $field;
  $form_state['buid'] = $buid;
  if ($submit) {
    $form['submit'] = array(
      '#type' => 'submit',
      '#value' => t('Save'),
    );
  }
  return $form;
}

/**
 * Saves files uploaded via plupload form.
 *
 * Example taken from plupload_test_submit();
 */
function block_upload_plupload_form_submit($form, &$form_state) {
  $field = $form_state['field'];
  $path = block_upload_get_upload_destination($field);

  // We can't use file_save_upload() because of
  // http://www.jacobsingh.name/content/tight-coupling-no-not
  // file_uri_to_object();
  $buid = $form_state['buid'];
  $field_name = variable_get('block_upload_' . $buid . '_field', '');
  $node = node_load($form_state['node']->nid);
  if (isset($form_state['input']['remove_files'])) {
    if (array_filter($form_state['input']['remove_files'])) {
      block_upload_deletefiles($node, $field_name, $form_state);
    }
  }
  if (isset($form_state['values']['block_upload_file'])) {
    foreach ($form_state['values']['block_upload_file'] as $uploaded_file) {
      if ($uploaded_file['status'] == 'done') {
        $source = $uploaded_file['tmppath'];
        $destination = file_stream_wrapper_uri_normalize($path . '/' . $uploaded_file['name']);

        // Rename it to its original name, and put it in its final home.
        // Note - not using file_move here because if we call file_get_mime
        // (in file_uri_to_object) while it has a .tmp extension, it horks.
        $destination = file_unmanaged_move($source, $destination, FILE_EXISTS_RENAME);
        $file = plupload_file_uri_to_object($destination);
        if ($field['widget']['module'] == 'file') {
          $file->display = 1;
        }
        file_save($file);
        $node->{$field_name}[LANGUAGE_NONE][] = (array) $file;
        drupal_set_message(t('File @name was successfully uploaded!', array(
          '@name' => $uploaded_file['name'],
        )));
      }
      else {

        // @todo move this to element validate or something and clean up t().
        form_set_error('block_upload_file', t('Upload of') . $uploaded_file['name'] . t('failed'));
      }
    }
  }

  // Do not change existing path alias if pathauto module installed.
  if (module_exists('pathauto')) {
    $node->path['pathauto'] = FALSE;
  }
  node_save($node);
}

/**
 * Display fields checkboxes depends on selected field.
 */
function block_upload_ajax_callback($form, $form_state) {
  $block_upload_id = $form_state['values']['block_upload_id'];
  if (empty($form_state['values']['block_upload_' . $block_upload_id . '_field'])) {
    return;
  }
  $field_name = $form_state['values']['block_upload_' . $block_upload_id . '_field'];
  $field = field_info_field($field_name);
  _block_upload_field_options_form_elements($form, $block_upload_id, $field['type']);
  return $form['config'];
}

/**
 * Dinamic form elements for image/file field types.
 *
 * @param int $buid
 *   Block upload variable ID.
 * @param string $type
 *   Field type.
 */
function _block_upload_field_options_form_elements(&$form, $buid, $type) {
  $form['config'] = array(
    '#title' => t("Additional display"),
    '#description' => t('Alt and title fields display for single form display. Will not apply for plupload widget.'),
    '#prefix' => '<div id="config">',
    '#suffix' => '</div>',
    '#type' => 'fieldset',
  );
  $settings = variable_get('block_upload_' . $buid . '_settings', array());

  // Alt and title enable options form elements for image field type.
  if ($type == 'image') {
    $form['config']['block_upload_' . $buid . '_alt'] = array(
      '#type' => 'checkbox',
      '#title' => t('Show alt field'),
      '#default_value' => isset($settings['alt']) ? $settings['alt'] : 0,
    );
    $form['config']['block_upload_' . $buid . '_title'] = array(
      '#type' => 'checkbox',
      '#title' => t('Show title field'),
      '#default_value' => isset($settings['title']) ? $settings['title'] : 0,
    );
  }
  elseif ($type == 'file') {
    $form['config']['block_upload_' . $buid . '_desc'] = array(
      '#type' => 'checkbox',
      '#title' => t('Show description field'),
      '#default_value' => isset($settings['desc']) ? $settings['desc'] : 0,
    );
  }
}

Functions

Namesort descending Description
block_upload_ajax_callback Display fields checkboxes depends on selected field.
block_upload_block_configure Implements hook_block_configure().
block_upload_block_info Implements hook_block_info().
block_upload_block_save Implements hook_block_save().
block_upload_block_view Implements hook_block_view().
block_upload_deletefiles Deletes files marked by checkbox in deletion form.
block_upload_form Block upload form.
block_upload_form_submit Save uploaded file to node.
block_upload_form_validate Validate and save uploaded file.
block_upload_get_field_list Returns avaliable field list of filefield type.
block_upload_get_upload_destination Returns destinaton for file upload.
block_upload_get_validators Returns validators array.
block_upload_menu Implements hook_menu().
block_upload_permission Implements hook_permission().
block_upload_plupload_form Returns plupload form for the form builder.
block_upload_plupload_form_submit Saves files uploaded via plupload form.
block_upload_remove_form Builds form for removing the files with block.
_block_upload_field_options_form_elements Dinamic form elements for image/file field types.