View source
<?php
function emthumb_menu($maycache) {
$items = array();
if (!$maycache && $_SESSION['emthumb']) {
foreach ($_SESSION['emthumb'] as $fieldname => $files) {
if (is_array($files)) {
foreach ($files as $delta => $file) {
if ($file['preview']) {
$items[] = array(
'path' => $file['preview'],
'callback' => '_emthumb_preview',
'access' => TRUE,
'type' => MENU_CALLBACK,
);
}
}
}
}
}
return $items;
}
function _emthumb_preview() {
foreach ($_SESSION['emthumb'] as $fieldname => $files) {
foreach ($files as $delta => $file) {
if ($file['preview'] == $_GET['q']) {
file_transfer($file['filepath'], array(
'Content-Type: ' . mime_header_encode($file['filemime']),
'Content-Length: ' . $file['filesize'],
));
exit;
}
}
}
}
function emthumb_file_insert($node, &$file, $field) {
$fieldname = $field['field_name'];
$filepath = file_create_path($field['widget']['emimport_image_path']) . '/' . $file['filename'];
if (emthumb_check_directory($field['widget']['emimport_image_path']) && ($file = file_save_upload((object) $file, $filepath))) {
$file = (array) $file;
$file['fid'] = db_next_id('{files}_fid');
db_query("INSERT into {files} (fid, nid, filename, filepath, filemime, filesize)\n VALUES (%d, %d, '%s','%s','%s',%d)", $file['fid'], $node->nid, $file['filename'], $file['filepath'], $file['filemime'], $file['filesize']);
return (array) $file;
}
else {
form_set_error(NULL, t('Thumbnail upload was unsuccessful.'));
return FALSE;
}
}
function emthumb_file_update($node, &$file, $field) {
$file = (array) $file;
if ($file['flags']['delete'] == TRUE) {
if (_emthumb_file_delete($file, $field['field_name'])) {
return array();
}
}
if ($file['fid'] == 'upload') {
return emthumb_file_insert($node, $file, $field);
}
else {
}
return $file;
}
function emthumb_emfield_field_extra($op, $node, $field, &$items, $teaser, $page) {
switch ($op) {
case 'submit':
case 'validate':
if ($field['multiple']) {
foreach ($items as $delta => $item) {
$items[$delta]['data'] = $list['provider'];
}
}
else {
$emthumb = array_pop($items);
if (empty($items)) {
array_push($items, $emthumb);
}
else {
$items[0]['data']['emthumb'] = $emthumb['emthumb']['emthumb'];
}
}
break;
case 'load':
$output = array();
if (count($items)) {
$values = array();
foreach ($items as $delta => $file) {
$items[$delta]['data']['emthumb'] = _emthumb_file_load($file['data']['emthumb']['fid']);
}
return array(
$field['field_name'] => $items,
);
}
break;
case 'rss item':
$output = array();
if (count($items)) {
$values = array();
foreach ($items as $delta => $file) {
$thumbnail = _emthumb_file_load($file['data']['emthumb']['fid']);
if (isset($thumbnail['filepath'])) {
$thumbnail['filepath'] = url($thumbnail['filepath'], NULL, NULL, TRUE);
$output[$delta]['thumbnail'] = $thumbnail;
}
}
}
return $output;
case 'insert':
foreach ($items as $delta => $item) {
$items[$delta]['data']['emthumb'] = emthumb_file_insert($node, $items[$delta]['data']['emthumb'], $field);
}
break;
case 'update':
foreach ($items as $delta => $item) {
$items[$delta]['data']['emthumb'] = emthumb_file_update($node, $items[$delta]['data']['emthumb'], $field);
}
$items = array_values($items);
break;
case 'delete':
foreach ($items as $delta => $item) {
_emthumb_file_delete($item['data']['emthumb'], $field['field_name']);
}
break;
}
}
function emthumb_emfield_widget_settings_extra($op, $widget) {
switch ($op) {
case 'form':
$form = array();
$form['emthumb'] = array(
'#type' => 'fieldset',
'#title' => t('Embedded Custom Thumbnails'),
'#collapsible' => TRUE,
'#collapsed' => FALSE,
);
$form['emthumb']['emthumb'] = array(
'#type' => 'checkbox',
'#title' => t('Allow custom thumbnails for this field'),
'#description' => t('If checked, then editors may specify a custom thumbnail to be used, overriding any automatic thumbnails otherwise created.'),
'#default_value' => isset($widget['emthumb']) ? $widget['emthumb'] : 0,
);
$form['emthumb']['emthumb_label'] = array(
'#type' => 'textfield',
'#title' => t('Custom thumbnail label'),
'#default_value' => $widget['emthumb_label'] ? $widget['emthumb_label'] : t('@field custom thumbnail', array(
'@field' => $widget['label'],
)),
'#description' => t('This label will be displayed when uploading a custom thumbnail.'),
);
$form['emthumb']['emthumb_description'] = array(
'#type' => 'textfield',
'#title' => t('Custom thumbnail description'),
'#default_value' => $widget['emthumb_description'] ? $widget['emthumb_description'] : t('If you upload a custom thumbnail, then this will be displayed when the @field thumbnail is called for, overriding any automatic thumbnails by custom providers.', array(
'@field' => $widget['label'],
)),
'#description' => t('This description will be displayed when uploading a custom thumbnail.'),
'#maxlength' => 512,
);
$form['emthumb']['emthumb_max_resolution'] = array(
'#type' => 'textfield',
'#title' => t('Maximum resolution for Images'),
'#default_value' => $widget['emthumb_max_resolution'] ? $widget['emthumb_max_resolution'] : 0,
'#size' => 15,
'#maxlength' => 10,
'#description' => t('The maximum allowed custom thumbnail size expressed as WIDTHxHEIGHT (e.g. 640x480). Set to 0 for no restriction.'),
);
$form['emthumb']['emimport_image_path'] = array(
'#type' => 'textfield',
'#title' => t('Image path'),
'#default_value' => $widget['emimport_image_path'] ? $widget['emimport_image_path'] : '',
'#description' => t('Optional subdirectory within the "%dir" directory where images will be stored. Do not include trailing slash.', array(
'%dir' => variable_get('file_directory_path', 'files'),
)),
'#after_build' => array(
'emthumb_form_check_directory',
),
);
$form['emthumb']['emthumb_custom_alt'] = array(
'#type' => 'checkbox',
'#title' => t('Enable custom alternate text'),
'#default_value' => $widget['emthumb_custom_alt'] ? $widget['emthumb_custom_alt'] : 0,
'#description' => t('Enable custom alternate text for custom thumbnails. Filename will be used if not checked.'),
);
$form['emthumb']['emthumb_custom_title'] = array(
'#type' => 'checkbox',
'#title' => t('Enable custom title text'),
'#default_value' => $widget['emthumb_custom_title'] ? $widget['emthumb_custom_title'] : 0,
'#description' => t('Enable custom title text for custom thumbnails. Filename will be used if not checked.'),
);
return $form;
case 'save':
return array(
'emthumb',
'emthumb_label',
'emthumb_description',
'emthumb_max_resolution',
'emimport_image_path',
'emthumb_custom_alt',
'emthumb_custom_title',
);
}
}
function emthumb_emfield_widget_extra($op, $node, $field, $items) {
$fieldname = $field['field_name'];
$content_type = $field['type_name'];
switch ($op) {
case 'prepare form values':
if (!count($_POST)) {
emthumb_clear_session();
}
if ($file = file_check_upload($fieldname . '_upload')) {
$file = (array) $file;
if (strpos($file['filemime'], 'image') !== FALSE) {
$file = _emthumb_scale_image($file, $field['widget']['emthumb_max_resolution']);
$filepath = file_create_filename($file['filename'], file_create_path($field['widget']['emimport_image_path']));
if (variable_get('file_downloads', FILE_DOWNLOADS_PUBLIC) == FILE_DOWNLOADS_PRIVATE) {
if (strpos($filepath, file_directory_path()) !== FALSE) {
$filepath = trim(substr($filepath, strlen(file_directory_path())), '\\/');
}
$filepath = 'system/files/' . $filepath;
}
$file['fid'] = 'upload';
$file['preview'] = $filepath;
if (!$field['multiple']) {
if (is_array($items)) {
foreach ($items as $delta => $session_file) {
$items[$delta]['data']['emthumb']['flags']['delete'] = TRUE;
}
}
emthumb_clear_field_session($fieldname);
}
$file_id = count($items) + count($_SESSION['emthumb'][$fieldname]);
$_SESSION['emthumb'][$fieldname][$file_id] = $file;
}
}
if (is_array($_SESSION['emthumb'][$fieldname]) && count($_SESSION['emthumb'][$fieldname])) {
foreach ($_SESSION['emthumb'][$fieldname] as $delta => $file) {
$items[$delta - 1]['data']['emthumb'] = $file;
}
}
break;
case 'form':
if ($field['widget']['emthumb']) {
$form = _emthumb_widget_form($node, $field, $items);
return $form;
}
break;
}
}
function _emthumb_widget_form($node, $field, $items) {
$fieldname = $field['field_name'];
drupal_add_css(drupal_get_path('module', 'emthumb') . '/emthumb.css');
$form = array(
'#type' => 'fieldset',
'#title' => t($field['widget']['emthumb_label'] ? t('@label', array(
'@label' => $field['widget']['emthumb_label'],
)) : t('@field custom thumbnail', array(
'@field' => $field['widget']['label'],
))),
'#weight' => $field['widget']['emthumb_weight'],
'#collapsible' => TRUE,
'#collapsed' => FALSE,
'#tree' => TRUE,
);
$form[$fieldname . '_upload'] = array(
'#type' => 'file',
'#description' => $field['widget']['emthumb_description'] ? t('@description', array(
'@description' => $field['widget']['emthumb_description'],
)) : t('If you upload a custom thumbnail, then this will be displayed when the @field thumbnail is called for, overriding any automatic thumbnails by custom providers.', array(
'@field' => $field['widget']['label'],
)),
'#tree' => FALSE,
'#weight' => 9,
);
$form['upload'] = array(
'#type' => 'button',
'#value' => t('Upload'),
'#name' => 'emthumb_' . $fieldname . '_op',
'#attributes' => array(
'id' => $fieldname . '-attach-button',
),
'#tree' => FALSE,
'#weight' => 10,
);
$file = $items['data']['emthumb'];
if ($file['filepath'] && !$file['flags']['delete']) {
$form['emthumb'] = array(
'#theme' => 'emthumb_edit_image_row',
);
$form['emthumb']['flags']['delete'] = array(
'#type' => 'checkbox',
'#title' => t('Delete'),
'#default_value' => 0,
);
$filename = $file['fid'] == 'upload' ? file_create_filename($file['filename'], file_create_path($field['widget']['emimport_image_path'])) : $file['filepath'];
$form['emthumb']['preview'] = array(
'#type' => 'markup',
'#value' => theme('emthumb_image', $file, $file['emthumb_alt'], $file['emthumb_title'], array(
'width' => '150',
), FALSE),
);
$form['emthumb']['description'] = array(
'#type' => 'markup',
'#value' => '<strong>' . t('Filename: ') . '</strong>' . check_plain($file['filename']),
);
$form['emthumb']['emthumb_alt'] = array(
'#type' => 'hidden',
'#value' => $file['filename'],
);
if ($field['widget']['emthumb_custom_alt']) {
$form['emthumb']['emthumb_alt'] = array(
'#type' => 'textfield',
'#title' => t('Alternate text'),
'#default_value' => $file['emthumb_alt'],
'#description' => t('Alternate text to be displayed if the image cannot be displayed.'),
'#maxlength' => 255,
'#size' => 10,
);
}
$form['emthumb']['emthumb_title'] = array(
'#type' => 'hidden',
'#value' => $file['filename'],
);
if ($field['widget']['emthumb_custom_title']) {
$form['emthumb']['emthumb_title'] = array(
'#type' => 'textfield',
'#title' => t('Title'),
'#default_value' => $file['emthumb_title'],
'#description' => t('Text to be displayed on mouse overs.'),
'#maxlength' => 255,
'#size' => 10,
);
}
$form['emthumb']['filename'] = array(
'#type' => 'value',
'#value' => $file['filename'],
);
$form['emthumb']['filepath'] = array(
'#type' => 'value',
'#value' => $file['filepath'],
);
$form['emthumb']['filemime'] = array(
'#type' => 'value',
'#value' => $file['filemime'],
);
$form['emthumb']['filesize'] = array(
'#type' => 'value',
'#value' => $file['filesize'],
);
$form['emthumb']['fid'] = array(
'#type' => 'value',
'#value' => $file['fid'],
);
if (!$field['multiple']) {
$form['emthumb']['replace'] = array(
'#type' => 'markup',
'#value' => t('If a new custom thumbnail is chosen, the current custom thumbnail will be replaced upon submitting the form.'),
);
}
}
elseif ($file['filepath'] && $file['flags']['delete']) {
$form['emthumb']['flags']['delete'] = array(
'#type' => 'hidden',
'#value' => $file['flags']['delete'],
);
}
return $form;
}
function emthumb_form_check_directory($form_element) {
if (!empty($form_element['#value'])) {
emthumb_check_directory($form_element['#value'], $form_element);
}
return $form_element;
}
function emthumb_check_directory($directory, $form_element = array()) {
foreach (explode('/', $directory) as $dir) {
$dirs[] = $dir;
$path = file_create_path(implode($dirs, '/'));
file_check_directory($path, FILE_CREATE_DIRECTORY, $form_element['#parents'][0]);
}
return true;
}
function _emthumb_scale_image($file, $resolution = 0) {
$info = image_get_info($file['filepath']);
if ($info) {
list($width, $height) = explode('x', $resolution);
if ($width && $height) {
$result = image_scale($file['filepath'], $file['filepath'], $width, $height);
if ($result) {
$file['filesize'] = filesize($file['filepath']);
drupal_set_message(t('The thumbnail was resized to fit within the maximum allowed resolution of %resolution pixels', array(
'%resolution' => $resolution,
)));
}
}
}
return $file;
}
function _emthumb_file_delete($file, $fieldname) {
if (is_numeric($file['fid'])) {
db_query('DELETE FROM {files} WHERE fid = %d', $file['fid']);
}
else {
unset($_SESSION['emthumb'][$fieldname][$file['sessionid']]);
}
return file_delete($file['filepath']);
}
function _emthumb_file_load($fid = NULL) {
if (isset($fid)) {
if (is_numeric($fid)) {
$result = db_query('SELECT * FROM {files} WHERE fid = %d', $fid);
$file = db_fetch_array($result);
return $file ? $file : array();
}
}
return array();
}
function emthumb_clear_session() {
if (is_array($_SESSION['emthumb']) && count($_SESSION['emthumb'])) {
foreach (array_keys($_SESSION['emthumb']) as $fieldname) {
emthumb_clear_field_session($fieldname);
}
unset($_SESSION['emthumb']);
}
}
function emthumb_clear_field_session($fieldname) {
if (is_array($_SESSION['emthumb'][$fieldname]) && count($_SESSION['emthumb'][$fieldname])) {
foreach ($_SESSION['emthumb'][$fieldname] as $files) {
if (is_file($file['filepath'])) {
file_delete($file['filepath']);
}
}
unset($_SESSION['emthumb'][$fieldname]);
}
}
function emthumb_thumbnail_url($item) {
if ($item['data']['emthumb']['filepath']) {
return file_create_url($item['data']['emthumb']['filepath']);
}
}
function theme_emthumb_view_image($file, $alt = '', $title = '', $attributes = NULL, $getsize = TRUE) {
return theme('emthumb_image', $file, $alt, $title, $attributes, $getsize);
}
function theme_emthumb_edit_image_row($element) {
$output = '<div class="emthumb-edit-preview">' . drupal_render($element['preview']) . '</div>';
$output .= '<div class="emthumb-edit-image-detail">';
$output .= '<div class="emthumb-edit-image-flags">' . drupal_render($element['flags']) . '</div>';
$output .= '<div class="emthumb-edit-image-description">' . drupal_render($element['description']);
$output .= '</div>';
$output .= drupal_render($element['emthumb_alt']);
$output .= drupal_render($element['emthumb_title']);
$output .= '</div>';
$output = '<div class="emthumb-edit-image-row clear-block">' . $output . '</div>';
if (isset($element['replace'])) {
$output .= '<div class="emthumb-edit-image-replace">' . drupal_render($element['replace']) . '</div>';
}
return $output;
}
function theme_emthumb_image($file, $alt = '', $title = '', $attributes = NULL, $getsize = TRUE) {
$file = (array) $file;
if (!$getsize || is_file($file['filepath']) && (list($width, $height, $type, $image_attributes) = @getimagesize($file['filepath']))) {
$attributes = drupal_attributes($attributes);
$path = $file['fid'] == 'upload' ? $file['preview'] : $file['filepath'];
$alt = empty($alt) ? $file['emthumb_alt'] : $alt;
$title = empty($title) ? $file['emthumb_title'] : $title;
$url = file_create_url($path);
return '<img src="' . check_url($url) . '" alt="' . check_plain($alt) . '" title="' . check_plain($title) . '" ' . $image_attributes . $attributes . ' />';
}
}
function theme_emthumb_multiple($images) {
return implode("\n", $images);
}
if (!function_exists('upload_file_download') && !function_exists('imagecache_file_download')) {
function emthumb_file_download($file) {
$file = file_create_path($file);
$result = db_query("SELECT f.* FROM {files} f WHERE filepath = '%s'", $file);
if ($file = db_fetch_object($result)) {
if (user_access('view uploaded files')) {
$node = node_load($file->nid);
if (node_access('view', $node)) {
$name = mime_header_encode($file->filename);
$type = mime_header_encode($file->filemime);
$disposition = ereg('^(text/|image/)', $file->filemime) ? 'inline' : 'attachment';
return array(
'Content-Type: ' . $type . '; name=' . $name,
'Content-Length: ' . $file->filesize,
'Content-Disposition: ' . $disposition . '; filename=' . $name,
'Cache-Control: private',
);
}
else {
return -1;
}
}
else {
return -1;
}
}
}
}