Допустим у нас есть нода с полем, в которое загружаются картинки, необходимо упаковать все картинки из этого поля в ZIP архив и сохранить в файловую систему. Для этого напишем функцию, которую потом можно будет вызвать в нужном месте:
/**
* Create a zip archive, which contains images.
*
* @param object $node
* The node object.
*
* @return bool|stdClass
* Zip archive, if was created, FALSE otherwise.
*/
function _example_zip_create($node) {
if (module_exists('entity') && $wrapper = entity_metadata_wrapper('node', $node)) {
// Директория, в которую сохранится архив.
$directory = 'public://example';
// Если не удалось создать директорию, записываем сообщение с ошибкой.
if (!file_prepare_directory($directory, FILE_MODIFY_PERMISSIONS | FILE_CREATE_DIRECTORY)) {
watchdog('example_zip', 'Failed to create %directory.', array('%directory' => $directory), WATCHDOG_ERROR);
return FALSE;
}
// Имя ZIP архива, которое транслитилируется, поэтому необходимо добавить зависимость от модулуя transliteration в .info.
$filename = transliteration_clean_filename($node->nid . '_' . $node->title . '_' . '.zip');
// Название поля, в которое загружаются картинки.
$field_name = 'field_images';
// Проверяем, есть ли у ноды поле.
if (isset($wrapper->{$field_name})) {
// Создаем архив.
$zip = new ZipArchive();
// Создаем полный путь к архиву.
$path = file_create_filename($filename, $directory);
// Если не удалось открыть архив, записваем сообщение с ошибкой.
if ($zip->open(drupal_realpath($path), ZIPARCHIVE::CREATE) !== TRUE) {
watchdog('example_zip', 'Error while creating zip archive', array(), WATCHDOG_ERROR);
return FALSE;
}
// Добавляем картинки в архив.
foreach ($wrapper->{$field_name} as $item) {
$image = $item->value();
$zip->addFile(drupal_realpath($image['uri']), $image['filename']);
}
// Заканчиваем работу с архивом.
$zip->close();
// Сохраняем архив в файловую систему.
$file = new stdClass();
$file->fid = NULL;
$file->uri = $path;
$file->filename = drupal_basename($path);
$file->filemime = file_get_mimetype($path);
$file->status = FILE_STATUS_PERMANENT;
file_save($file);
file_usage_add($file, 'example', 'node', $node->nid);
return $file;
}
}
return FALSE;
}
Если необходимо добавить картинки с использованием стилей изображений, необходимо воспользоваться следующим кодом:
foreach ($wrapper->{$field_name} as $item) {
$image = $item->value();
// Название стиля изображения.
$style_name = 'some_image_style_name';
if (($uri = image_style_path($style_name, $image['uri'])) && ($style = image_style_load($style_name)) && image_style_create_derivative($style, $image['uri'], $uri)) {
$zip->addFile(drupal_realpath($uri), $image['filename']);
}
}