<?php

function views_bulk_operations_archive_action_info() {
  return array('views_bulk_operations_archive_action' => array(
    'type' => 'file',
    'description' => t('Download archive of selected files'),
    'configurable' => FALSE,
    'aggregate' => TRUE,
  ));
}

function views_bulk_operations_archive_action($fids, $context) {
  // Iterate on files.
  $files = array();
  $placeholders = db_placeholders($fids);
  $f = db_query("SELECT * FROM {files} WHERE fid IN ($placeholders)", $fids);
  while ($file = db_fetch_object($f)) {
    $files[] = $file;
  }
  views_bulk_operations_archive_action_do($files, $context);
}

function views_bulk_operations_archive_action_do($files, $context) {
  // Create zip file.
  $zipfile = tempnam(file_directory_temp(), 'zip');
  $zip = new ZipArchive();
  if (!$zip->open($zipfile, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE)) {
    return;
  }
  foreach ($files as $file) {
    $zip->addFile(file_create_path($file->filepath), $file->filename);
  }
  $zip->close();

  // Download zip file.
  $view = views_get_view($context['view']['vid']);
  $zipname = $view->name .'-'. date('Ymd-His') .'.zip';
  header('Content-Type: application/zip');
  header('Content-Disposition: attachment; filename='. $zipname);
  header('Content-Transfer-Encoding: binary');
  header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
  header('Pragma: public');
  header('Expires: 0');
  header('Content-Length: '. filesize($zipfile));
  readfile($zipfile);
  unlink($zipfile);
  exit;
}
