diff options
Diffstat (limited to 'admin')
-rw-r--r-- | admin/include/functions_upload.inc.php | 37 | ||||
-rw-r--r-- | admin/themes/default/images/ajax-loader.gif | bin | 0 -> 673 bytes | |||
-rw-r--r-- | admin/themes/default/template/thumbnail.tpl | 223 | ||||
-rw-r--r-- | admin/thumbnail.php | 292 |
4 files changed, 185 insertions, 367 deletions
diff --git a/admin/include/functions_upload.inc.php b/admin/include/functions_upload.inc.php index 022d99e46..aa25e5219 100644 --- a/admin/include/functions_upload.inc.php +++ b/admin/include/functions_upload.inc.php @@ -604,7 +604,7 @@ function pwg_image_resize_gd($source_filepath, $destination_filepath, $max_width { // the image doesn't need any resize! We just copy it to the destination copy($source_filepath, $destination_filepath); - return true; + return get_resize_result($source_filepath, $destination_filepath, $resize_dimensions['width'], $resize_dimensions['height'], $starttime, 'GD'); } $destination_image = imagecreatetruecolor($resize_dimensions['width'], $resize_dimensions['height']); @@ -646,15 +646,7 @@ function pwg_image_resize_gd($source_filepath, $destination_filepath, $max_width imagedestroy($destination_image); // everything should be OK if we are here! - return array( - 'source' => $source_filepath, - 'destination' => $destination_filepath, - 'width' => $resize_dimensions['width'], - 'height' => $resize_dimensions['height'], - 'size' => floor(filesize($destination_filepath) / 1024).' KB', - 'time' => number_format((get_moment() - $starttime) * 1000, 2, '.', ' ').' ms', - 'library' => 'GD', - ); + return get_resize_result($source_filepath, $destination_filepath, $resize_dimensions['width'], $resize_dimensions['height'], $starttime, 'GD'); } function pwg_image_resize_im($source_filepath, $destination_filepath, $max_width, $max_height, $quality, $strip_metadata=false, $crop=false, $follow_orientation=true) @@ -691,7 +683,7 @@ function pwg_image_resize_im($source_filepath, $destination_filepath, $max_width { // the image doesn't need any resize! We just copy it to the destination copy($source_filepath, $destination_filepath); - return true; + get_resize_result($source_filepath, $destination_filepath, $resize_dimensions['width'], $resize_dimensions['height'], $starttime, 'ImageMagick'); } $image->setImageCompressionQuality($quality); @@ -716,15 +708,7 @@ function pwg_image_resize_im($source_filepath, $destination_filepath, $max_width $image->destroy(); // everything should be OK if we are here! - return array( - 'source' => $source_filepath, - 'destination' => $destination_filepath, - 'width' => $resize_dimensions['width'], - 'height' => $resize_dimensions['height'], - 'size' => floor(filesize($destination_filepath) / 1024).' KB', - 'time' => number_format((get_moment() - $starttime) * 1000, 2, '.', ' ').' ms', - 'library' => 'ImageMagick', - ); + return get_resize_result($source_filepath, $destination_filepath, $resize_dimensions['width'], $resize_dimensions['height'], $starttime, 'ImageMagick'); } function get_rotation_angle($source_filepath) @@ -966,4 +950,17 @@ function file_path_for_type($file_path, $type='thumb') return $file_path; } + +function get_resize_result($source_filepath, $destination_filepath, $width, $height, $time, $library) +{ + return array( + 'source' => $source_filepath, + 'destination' => $destination_filepath, + 'width' => $width, + 'height' => $height, + 'size' => floor(filesize($destination_filepath) / 1024).' KB', + 'time' => number_format((get_moment() - $time) * 1000, 2, '.', ' ').' ms', + 'library' => $library, + ); +} ?>
\ No newline at end of file diff --git a/admin/themes/default/images/ajax-loader.gif b/admin/themes/default/images/ajax-loader.gif Binary files differnew file mode 100644 index 000000000..d0bce1542 --- /dev/null +++ b/admin/themes/default/images/ajax-loader.gif diff --git a/admin/themes/default/template/thumbnail.tpl b/admin/themes/default/template/thumbnail.tpl index 1981671ed..3c46b2c2e 100644 --- a/admin/themes/default/template/thumbnail.tpl +++ b/admin/themes/default/template/thumbnail.tpl @@ -1,119 +1,168 @@ +{combine_script id='jquery.ajaxmanager' load='footer' path='themes/default/js/plugins/jquery.ajaxmanager.js'} + +{footer_script} +var width_str = '{'Width'|@translate}'; +var height_str = '{'Height'|@translate}'; +var max_width_str = '{'Maximum Width'|@translate}'; +var max_height_str = '{'Maximum Height'|@translate}'; +var remaining = '{'photos without thumbnail (jpeg and png only)'|@translate}'; +var todo = {$TOTAL_NB_REMAINING}; +var done = 0; + +{literal} +var queuedManager = $.manageAjax.create('queued', { + queue: true, + cacheResponse: false, + maxRequests: 3, + complete: function() { + jQuery("#thumb_remaining").text(todo-(++done) + ' ' + remaining); + if (todo == done) { + jQuery('.waiting_bar, #thumb_remaining, .properties').hide(); + } + } +}); + +function processThumbs(width,height,crop,follow_orientation) { + jQuery('tr.nothumb').each(function() { + var image_path = jQuery(this).find('td.filepath').text(); + var td=this; + queuedManager.add({ + type: 'GET', + url: 'ws.php', + data: { + method: 'pwg.images.resize', + image_path: image_path, + type: 'thumbnail', + maxwidth: width, + maxheight: height, + crop: crop, + follow_orientation: follow_orientation, + format:'json' + }, + dataType: 'json', + success: (function(row) { return function(data) { + if (data.stat =='ok') { + if (todo < 200) + jQuery(row).find('td.thumbpic').html('<img src="'+data.result.destination+'"/>'); + jQuery(row).find('td.thumbdim').html(""+data.result.width+" x "+data.result.height); + jQuery(row).find('td.thumbgentime').html(""+data.result.time); + jQuery(row).find('td.thumbsize').html(""+data.result.size); + jQuery(row).removeClass("nothumb"); + } else { + jQuery(row).find('td.thumbpic').html('#ERR#'+data.err+"# : "+data.message); + jQuery(row).removeClass("nothumb"); + jQuery(row).addClass("error"); + } + } + })(td) + }); + }); +} + +function toggleCropFields() { + if (jQuery("#thumb_crop").is(':checked')) { + jQuery("label[for='thumb_maxwidth']").text(width_str); + jQuery("label[for='thumb_maxheight']").text(height_str); + jQuery("#thumb_follow_orientation_li").show(); + } + else { + jQuery("label[for='thumb_maxwidth']").text(max_width_str); + jQuery("label[for='thumb_maxheight']").text(max_height_str); + jQuery("#thumb_follow_orientation_li").hide(); + } +} + +jQuery(document).ready(function(){ + jQuery('input#proceed').click (function () { + var width = jQuery('input[name="thumb_maxwidth"]').val(); + var height = jQuery('input[name="thumb_maxheight"]').val(); + var crop = jQuery('#crop').is(':checked'); + var follow_orientation = jQuery('#follow_orientation').is(':checked'); + jQuery(".waiting_bar").toggle(); + if (todo < 200) + jQuery('.thumbpic').show(); + jQuery('.thumbgentime, .thumbsize, .thumbdim').show(); + processThumbs(width,height,crop,follow_orientation); + }); + + jQuery('input#cancel').click (function () { + queuedManager.clear(); + queuedManager.abort(); + jQuery("input:not(.nodisable)").attr("disabled",false); + jQuery('tr.nothumb td.thumbpic').html(" "); + + }); + + toggleCropFields(); + jQuery("#thumb_crop").click(function () {toggleCropFields()}); + + jQuery('.thumbpic, .thumbgentime, .thumbsize, .thumbdim').hide(); +}); +{/literal}{/footer_script} + <div class="titrePage"> <h2>{'Thumbnail creation'|@translate}</h2> </div> -{if isset($results) } -<div class="admin">{'Results of miniaturization'|@translate}</div> -<table style="width:100%;"> - <tr class="throw"> - <td>{'Path'|@translate}</td> - <td>{'Thumbnail'|@translate}</td> - <td>{'generated in'|@translate}</td> - <td>{'Filesize'|@translate}</td> - <td>{'Dimensions'|@translate}</td> - </tr> - {foreach from=$results.elements item=elt} - <tr> - <td>{$elt.PATH}</td> - <td><img src="{$elt.TN_FILE_IMG}"></td> - <td style="text-align:right;">{$elt.GEN_TIME}</td> - <td style="text-align:right;">{$elt.TN_FILESIZE_IMG}</td> - <td style="text-align:right;">{$elt.TN_WIDTH_IMG} x {$elt.TN_HEIGHT_IMG}</td> - </tr> - {/foreach} -</table> - -<table class="table2"> - <tr class="throw"> - <td colspan="2">{'General statistics'|@translate}</td> - </tr> - <tr> - <td>{'number of miniaturized photos'|@translate}</td> - <td style="text-align:center;">{$results.TN_NB}</td> - </tr> - <tr> - <td>{'total time'|@translate}</td> - <td style="text-align:right;">{$results.TN_TOTAL}</td> - </tr> - <tr> - <td>{'max time'|@translate}</td> - <td style="text-align:right;">{$results.TN_MAX}</td> - </tr> - <tr> - <td>{'min time'|@translate}</td> - <td style="text-align:right;">{$results.TN_MIN}</td> - </tr> - <tr> - <td>{'average time'|@translate}</td> - <td style="text-align:right;">{$results.TN_AVERAGE}</td> - </tr> -</table> -<br> -{/if} - -{if isset($params) } +{if !empty($remainings) } <form method="post" action="{$params.F_ACTION}" class="properties"> <fieldset> - <legend>{'Miniaturization parameters'|@translate}</legend> + <legend>{'Thumbnail creation'|@translate}</legend> <ul> <li> - <span class="property">{'GD version'|@translate}</span> - <label> - <input type="radio" name="gd" value="2" {if $params.GD_SELECTED==2}checked="checked"{/if}>2.x - </label> - <label> - <input type="radio" name="gd" value="1" {if $params.GD_SELECTED==1}checked="checked"{/if}>1.x - </label> + <span class="property"><label for="thumb_crop">{'Crop'|@translate}</label></span> + <input type="checkbox" name="thumb_crop" id="thumb_crop" {$values.thumb_crop}> + </li> + <li id="thumb_follow_orientation_li"> + <span class="property"><label for="thumb_follow_orientation">{'Follow Orientation'|@translate}</label></span> + <input type="checkbox" name="thumb_follow_orientation" id="thumb_follow_orientation" {$values.thumb_follow_orientation}> </li> - <li> - <span class="property"> - <label for="width">{'maximum width'|@translate}</label> - </span> - <input type="text" id="width" name="width" value="{$params.WIDTH_TN}"> + <span class="property"><label for="thumb_maxwidth">{'Maximum Width'|@translate}</label></span> + <input type="text" name="thumb_maxwidth" id="thumb_maxwidth" value="{$values.thumb_maxwidth}" size="4" maxlength="4"> {'pixels'|@translate} </li> - <li> - <span class="property"> - <label for="height">{'maximum height'|@translate}</label> - </span> - <input type="text" id="height" name="height" value="{$params.HEIGHT_TN}"> + <span class="property"><label for="thumb_maxheight">{'Maximum Height'|@translate}</label></span> + <input type="text" name="thumb_maxheight" id="thumb_maxheight" value="{$values.thumb_maxheight}" size="4" maxlength="4"> {'pixels'|@translate} </li> - <li> - <span class="property">{'Number of thumbnails to create'|@translate}</span> - <label><input type="radio" name="n" value="5" {if $params.N_SELECTED==5}checked="checked"{/if}> 5</label> - <label><input type="radio" name="n" value="10" {if $params.N_SELECTED==10}checked="checked"{/if}> 10</label> - <label><input type="radio" name="n" value="20" {if $params.N_SELECTED==20}checked="checked"{/if}> 20</label> - <label><input type="radio" name="n" value="all" {if $params.N_SELECTED=='all'}checked="checked"{/if}> {'all'|@translate}</label> + <span class="property"><label for="thumb_quality">{'Image Quality'|@translate}</label></span> + <input type="text" name="thumb_quality" id="thumb_quality" value="{$values.thumb_quality}" size="3" maxlength="3"> % </li> </ul> </fieldset> - <p><input class="submit" type="submit" name="submit" value="{'Submit'|@translate}"></p> + <p class="waiting_bar"><input type="button" name="submit" id="proceed" value="{'Submit'|@translate}"></p> + <p class="waiting_bar" style="display:none;">{'Please wait...'|@translate}<br><img src="admin/themes/default/images/ajax-loader-bar.gif"></p> </form> -{/if} {*isset params*} -{if !empty($remainings) } -<div class="admin">{$TOTAL_NB_REMAINING} {'photos without thumbnail (jpeg and png only)'|@translate}</div> +<div class="admin"><span id="thumb_remaining">{$TOTAL_NB_REMAINING} {'photos without thumbnail (jpeg and png only)'|@translate}</span></div> <table style="width:100%;"> <tr class="throw"> - <td> </td> - <td style="width:60%;">{'Path'|@translate}</td> - <td>{'Filesize'|@translate}</td> - <td>{'Dimensions'|@translate}</td> + <th> </th> + <th style="width:60%;">{'Path'|@translate}</th> + <th>{'Filesize'|@translate}</th> + <th>{'Dimensions'|@translate}</th> + <th class="thumbpic">{'Thumbnail'|@translate}</th> + <th class="thumbgentime">{'generated in'|@translate}</th> + <th class="thumbsize">{'Filesize'|@translate}</th> + <th class="thumbdim">{'Dimensions'|@translate}</th> </tr> {foreach from=$remainings item=elt name=remain_loop} - <tr class="{if $smarty.foreach.remain_loop.index is odd}row1{else}row2{/if}"> + <tr class="{if $smarty.foreach.remain_loop.index is odd}row1{else}row2{/if} nothumb item" id="th_{$smarty.foreach.remain_loop.iteration}"> <td>{$smarty.foreach.remain_loop.iteration}</td> - <td><div style="margin-left:10px;">{$elt.PATH}</div></td> - <td><div style="margin-left:10px;">{$elt.FILESIZE_IMG}</div></td> - <td><div style="margin-left:10px;">{$elt.WIDTH_IMG} x {$elt.HEIGHT_IMG}</div></td> + <td class="filepath">{$elt.PATH}</td> + <td>{$elt.FILESIZE_IMG}</td> + <td>{$elt.WIDTH_IMG} x {$elt.HEIGHT_IMG}</td> + <td class="thumbpic"><img src="admin/themes/default/images/ajax-loader.gif"></td> + <td class="thumbgentime"> </td> + <td class="thumbsize"> </td> + <td class="thumbdim"> </td> </tr> {/foreach} </table> {else} <div style="text-align:center;font-weight:bold;margin:10px;"> [ {'No missing thumbnail'|@translate} ]</div> -{/if} +{/if}
\ No newline at end of file diff --git a/admin/thumbnail.php b/admin/thumbnail.php index b9faafc0f..461b11425 100644 --- a/admin/thumbnail.php +++ b/admin/thumbnail.php @@ -22,163 +22,29 @@ // +-----------------------------------------------------------------------+ include_once(PHPWG_ROOT_PATH.'admin/include/functions.php'); +include_once(PHPWG_ROOT_PATH.'admin/include/functions_upload.inc.php'); -// +-----------------------------------------------------------------------+ -// | Check Access and exit when user status is not ok | -// +-----------------------------------------------------------------------+ check_status(ACCESS_ADMINISTRATOR); -//------------------------------------------------------------------- functions -// RatioResizeImg creates a new picture (a thumbnail since it is supposed to -// be smaller than original picture !) in the sub directory named -// "thumbnail". -function RatioResizeImg($info, $path, $newWidth, $newHeight, $tn_ext) -{ - global $conf, $lang, $page; - - if ($info !== false) - { - //someone hooked us - so we skip - return $info; - } - - if (!function_exists('gd_info')) - { - return; - } - - $filename = basename($path); - $dirname = dirname($path); - - // extension of the picture filename - $extension = get_extension($filename); - - if (in_array($extension, array('jpg', 'JPG', 'jpeg', 'JPEG'))) - { - $srcImage = @imagecreatefromjpeg($path); - } - else if ($extension == 'png' or $extension == 'PNG') - { - $srcImage = @imagecreatefrompng($path); - } - else - { - unset($extension); - } - - if ( isset( $srcImage ) ) - { - // width/height - $srcWidth = imagesx( $srcImage ); - $srcHeight = imagesy( $srcImage ); - $ratioWidth = $srcWidth/$newWidth; - $ratioHeight = $srcHeight/$newHeight; - - // maximal size exceeded ? - if ( ( $ratioWidth > 1 ) or ( $ratioHeight > 1 ) ) - { - if ( $ratioWidth < $ratioHeight) - { - $destWidth = $srcWidth/$ratioHeight; - $destHeight = $newHeight; - } - else - { - $destWidth = $newWidth; - $destHeight = $srcHeight/$ratioWidth; - } - } - else - { - $destWidth = $srcWidth; - $destHeight = $srcHeight; - } - // according to the GD version installed on the server - if ( $_POST['gd'] == 2 ) - { - // GD 2.0 or more recent -> good results (but slower) - $destImage = imagecreatetruecolor( $destWidth, $destHeight); - imagecopyresampled( $destImage, $srcImage, 0, 0, 0, 0, - $destWidth,$destHeight,$srcWidth,$srcHeight ); - } - else - { - // GD prior to version 2 -> pretty bad results :-/ (but fast) - $destImage = imagecreate( $destWidth, $destHeight); - imagecopyresized( $destImage, $srcImage, 0, 0, 0, 0, - $destWidth,$destHeight,$srcWidth,$srcHeight ); - } - - if (($tndir = mkget_thumbnail_dir($dirname, $page['errors'])) == false) - { - return false; - } +// +-----------------------------------------------------------------------+ +// | Load configuration | +// +-----------------------------------------------------------------------+ +prepare_upload_configuration(); - $dest_file = $tndir.'/'.$conf['prefix_thumbnail']; - $dest_file.= get_filename_wo_extension($filename); - $dest_file.= '.'.$tn_ext; - - // creation and backup of final picture - if (!is_writable($tndir)) - { - array_push($page['errors'], '['.$tndir.'] : '.l10n('no write access')); - return false; - } - imagejpeg($destImage, $dest_file, $conf['tn_compression_level']); - // freeing memory ressources - imagedestroy( $srcImage ); - imagedestroy( $destImage ); - - list($tn_width, $tn_height) = getimagesize($dest_file); - $tn_size = floor(filesize($dest_file) / 1024).' KB'; - - $info = array( 'path' => $path, - 'tn_file' => $dest_file, - 'tn_width' => $tn_width, - 'tn_height' => $tn_height, - 'tn_size' => $tn_size ); - return $info; - } - // error - else - { - echo l10n('Photo unreachable or no support')." "; - if ( isset( $extension ) ) - { - echo l10n('for the file format').' '.$extension; - } - else - { - echo l10n('for this file format'); - } - exit(); - } -} +$upload_form_config = get_upload_form_config(); -$pictures = array(); -$stats = array(); +$form_values = array(); -if (!function_exists('gd_info')) +foreach ($upload_form_config as $param_shortname => $param) { - array_push($page['errors'], l10n('GD library is missing')); + $param_name = 'upload_form_'.$param_shortname; + $form_values[$param_shortname] = $conf[$param_name]; } -// add default event handler for thumbnail resize -add_event_handler('thumbnail_resize', 'RatioResizeImg', EVENT_HANDLER_PRIORITY_NEUTRAL, 5); - -// +-----------------------------------------------------------------------+ -// | template initialization | -// +-----------------------------------------------------------------------+ -$template->set_filenames( array('thumbnail'=>'thumbnail.tpl') ); - -$template->assign( - array('U_HELP' => get_root_url().'admin/popuphelp.php?page=thumbnail') - ); // +-----------------------------------------------------------------------+ // | search pictures without thumbnails | // +-----------------------------------------------------------------------+ $wo_thumbnails = array(); -$thumbnalized = array(); // what is the directory to search in ? $query = ' @@ -230,127 +96,13 @@ while ( $row=pwg_db_fetch_assoc($result) ) } } // next element } // next site id -// +-----------------------------------------------------------------------+ -// | thumbnails creation | -// +-----------------------------------------------------------------------+ -if (isset($_POST['submit'])) -{ - $times = array(); - $infos = array(); - - // checking criteria - if (!preg_match('/^[0-9]{2,3}$/', $_POST['width']) or $_POST['width'] < 10) - { - array_push($page['errors'], l10n('width must be a number superior to').' 10'); - } - if (!preg_match('/^[0-9]{2,3}$/', $_POST['height']) or $_POST['height'] < 10) - { - array_push($page['errors'], l10n('height must be a number superior to').' 10'); - } - - // picture miniaturization - if (count($page['errors']) == 0) - { - $num = 1; - foreach ($wo_thumbnails as $path) - { - if (is_numeric($_POST['n']) and $num > $_POST['n']) - { - break; - } - - $starttime = get_moment(); - if ($info = trigger_event('thumbnail_resize', - false, - $path, - $_POST['width'], - $_POST['height'], - 'jpg' - ) - ) - { - $endtime = get_moment(); - $info['time'] = ($endtime - $starttime) * 1000; - array_push($infos, $info); - array_push($times, $info['time']); - array_push($thumbnalized, $path); - $num++; - } - else - { - break; - } - } - if (count($infos) > 0) - { - $sum = array_sum($times); - $average = $sum / count($times); - sort($times, SORT_NUMERIC); - $max = array_pop($times); - if (count($thumbnalized) == 1) - { - $min = $max; - } - else - { - $min = array_shift($times); - } - - $tpl_var = - array( - 'TN_NB'=>count($infos), - 'TN_TOTAL'=>number_format($sum, 2, '.', ' ').' ms', - 'TN_MAX'=>number_format($max, 2, '.', ' ').' ms', - 'TN_MIN'=>number_format($min, 2, '.', ' ').' ms', - 'TN_AVERAGE'=>number_format($average, 2, '.', ' ').' ms', - 'elements' => array() - ); - - foreach ($infos as $i => $info) - { - $tpl_var['elements'][] = - array( - 'PATH'=>$info['path'], - 'TN_FILE_IMG'=>$info['tn_file'], - 'TN_FILESIZE_IMG'=>$info['tn_size'], - 'TN_WIDTH_IMG'=>$info['tn_width'], - 'TN_HEIGHT_IMG'=>$info['tn_height'], - 'GEN_TIME'=>number_format($info['time'], 2, '.', ' ').' ms', - ); - } - $template->assign('results', $tpl_var); - } - } -} // +-----------------------------------------------------------------------+ // | form & pictures without thumbnails display | // +-----------------------------------------------------------------------+ -$remainings = array_diff($wo_thumbnails, $thumbnalized); - -if (count($remainings) > 0) +if (count($wo_thumbnails) > 0) { - $form_url = get_root_url().'admin.php?page=thumbnail'; - $gd = !empty($_POST['gd']) ? $_POST['gd'] : 2; - $width = !empty($_POST['width']) ? $_POST['width'] : $conf['tn_width']; - $height = !empty($_POST['height']) ? $_POST['height'] : $conf['tn_height']; - $n = !empty($_POST['n']) ? $_POST['n'] : 5; - - $template->assign( - 'params', - array( - 'F_ACTION'=> $form_url, - 'GD_SELECTED' => $gd, - 'N_SELECTED' => $n, - 'WIDTH_TN'=>$width, - 'HEIGHT_TN'=>$height - )); - - $template->assign( - 'TOTAL_NB_REMAINING', - count($remainings)); - - foreach ($remainings as $path) + foreach ($wo_thumbnails as $path) { list($width, $height) = getimagesize($path); $size = floor(filesize($path) / 1024).' KB'; @@ -366,8 +118,28 @@ if (count($remainings) > 0) } } +foreach (array_keys($upload_form_config) as $field) +{ + if (is_bool($upload_form_config[$field]['default'])) + { + $form_values[$field] = $form_values[$field] ? 'checked="checked"' : ''; + } +} + +$template->assign( + array( + 'F_ACTION' => get_root_url().'admin.php?page=thumbnail', + 'values' => $form_values, + 'TOTAL_NB_REMAINING' => count($wo_thumbnails), + ) +); + // +-----------------------------------------------------------------------+ // | return to admin | // +-----------------------------------------------------------------------+ +$template->set_filenames( array('thumbnail'=>'thumbnail.tpl') ); + +$template->assign('U_HELP', get_root_url().'admin/popuphelp.php?page=thumbnail'); + $template->assign_var_from_handle('ADMIN_CONTENT', 'thumbnail'); ?> |