mirror of
https://github.com/Piwigo/Piwigo.git
synced 2025-04-26 11:19:55 +03:00
fixes #1381 orphans calculation is done only when needed by ajax call
This commit is contained in:
parent
b9394d967c
commit
ddbdbd93bb
4 changed files with 176 additions and 80 deletions
|
@ -189,68 +189,6 @@ $subcat_ids = get_subcat_ids(array($category['id']));
|
|||
|
||||
$category['nb_subcats'] = count($subcat_ids) - 1;
|
||||
|
||||
// total number of images under this category (including sub-categories)
|
||||
$query = '
|
||||
SELECT
|
||||
DISTINCT(image_id)
|
||||
FROM '.IMAGE_CATEGORY_TABLE.'
|
||||
WHERE category_id IN ('.implode(',', $subcat_ids).')
|
||||
;';
|
||||
$image_ids_recursive = query2array($query, null, 'image_id');
|
||||
|
||||
$category['nb_images_recursive'] = count($image_ids_recursive);
|
||||
|
||||
// number of images that would become orphan on album deletion
|
||||
$category['nb_images_becoming_orphan'] = 0;
|
||||
$category['nb_images_associated_outside'] = 0;
|
||||
|
||||
if ($category['nb_images_recursive'] > 0)
|
||||
{
|
||||
// if we don't have "too many" photos, it's faster to compute the orphans with MySQL
|
||||
if ($category['nb_images_recursive'] < 1000)
|
||||
{
|
||||
$query = '
|
||||
SELECT
|
||||
DISTINCT(image_id)
|
||||
FROM '.IMAGE_CATEGORY_TABLE.'
|
||||
WHERE category_id NOT IN ('.implode(',', $subcat_ids).')
|
||||
AND image_id IN ('.implode(',', $image_ids_recursive).')
|
||||
;';
|
||||
|
||||
$image_ids_associated_outside = query2array($query, null, 'image_id');
|
||||
$category['nb_images_associated_outside'] = count($image_ids_associated_outside);
|
||||
|
||||
$image_ids_becoming_orphan = array_diff($image_ids_recursive, $image_ids_associated_outside);
|
||||
$category['nb_images_becoming_orphan'] = count($image_ids_becoming_orphan);
|
||||
}
|
||||
// else it's better to avoid sending a huge SQL request, we compute the orphan list with PHP
|
||||
else
|
||||
{
|
||||
$image_ids_recursive_keys = array_flip($image_ids_recursive);
|
||||
|
||||
$query = '
|
||||
SELECT
|
||||
image_id
|
||||
FROM '.IMAGE_CATEGORY_TABLE.'
|
||||
WHERE category_id NOT IN ('.implode(',', $subcat_ids).')
|
||||
;';
|
||||
$image_ids_associated_outside = query2array($query, null, 'image_id');
|
||||
$image_ids_not_orphan = array();
|
||||
|
||||
foreach ($image_ids_associated_outside as $image_id)
|
||||
{
|
||||
if (isset($image_ids_recursive_keys[$image_id]))
|
||||
{
|
||||
$image_ids_not_orphan[] = $image_id;
|
||||
}
|
||||
}
|
||||
|
||||
$category['nb_images_associated_outside'] = count(array_unique($image_ids_not_orphan));
|
||||
$image_ids_becoming_orphan = array_diff($image_ids_recursive, $image_ids_not_orphan);
|
||||
$category['nb_images_becoming_orphan'] = count($image_ids_becoming_orphan);
|
||||
}
|
||||
}
|
||||
|
||||
// Navigation path
|
||||
$navigation = get_cat_display_name_cache(
|
||||
$category['uppercats'],
|
||||
|
@ -391,9 +329,9 @@ $template->assign(
|
|||
array(
|
||||
'CATEGORY_FULLNAME' => trim(strip_tags($navigation)),
|
||||
'NB_SUBCATS' => $category['nb_subcats'],
|
||||
'NB_IMAGES_RECURSIVE' => $category['nb_images_recursive'],
|
||||
'NB_IMAGES_BECOMING_ORPHAN' => $category['nb_images_becoming_orphan'],
|
||||
'NB_IMAGES_ASSOCIATED_OUTSIDE' => $category['nb_images_associated_outside'],
|
||||
// 'NB_IMAGES_RECURSIVE' => $category['nb_images_recursive'],
|
||||
// 'NB_IMAGES_BECOMING_ORPHAN' => $category['nb_images_becoming_orphan'],
|
||||
// 'NB_IMAGES_ASSOCIATED_OUTSIDE' => $category['nb_images_associated_outside'],
|
||||
)
|
||||
);
|
||||
|
||||
|
|
|
@ -1,11 +1,17 @@
|
|||
{combine_script id='common' load='footer' path='admin/themes/default/js/common.js'}
|
||||
{include file='include/colorbox.inc.tpl'}
|
||||
{combine_script id='LocalStorageCache' load='footer' path='admin/themes/default/js/LocalStorageCache.js'}
|
||||
{combine_script id='jquery.confirm' load='footer' require='jquery' path='themes/default/js/plugins/jquery-confirm.min.js'}
|
||||
{* {combine_script id='cat_modify' load='footer' path='admin/themes/default/js/cat_modify.js'} *}
|
||||
|
||||
{combine_script id='jquery.selectize' load='footer' path='themes/default/js/plugins/selectize.min.js'}
|
||||
{combine_css id='jquery.selectize' path="themes/default/js/plugins/selectize.{$themeconf.colorscheme}.css"}
|
||||
|
||||
{footer_script}
|
||||
const has_images_associated_outside = '{"delete album and all %d photos, even the %d associated to other albums"|@translate|escape:javascript}';
|
||||
const has_images_becomming_orphans = '{'delete album and the %d orphan photos'|@translate|escape:javascript}';
|
||||
const has_images_recursives = '{'delete only album, not photos'|@translate|escape:javascript}';
|
||||
|
||||
{* <!-- CATEGORIES --> *}
|
||||
var categoriesCache = new CategoriesCache({
|
||||
serverKey: '{$CACHE_KEYS.categories}',
|
||||
|
@ -98,6 +104,40 @@ jQuery(document).ready(function() {
|
|||
e.preventDefault();
|
||||
});
|
||||
|
||||
$(".deleteAlbum").on("click", function() {
|
||||
$.ajax({
|
||||
url: "ws.php?format=json&method=pwg.images.calculateOrphansOnAlbumDeletion",
|
||||
type: "GET",
|
||||
data: {
|
||||
category_id: {$CAT_ID},
|
||||
},
|
||||
success: function (raw_data) {
|
||||
let data = JSON.parse(raw_data).result[0]
|
||||
console.log(data);
|
||||
if (data.nb_images_recursive == 0) {
|
||||
$(".delete_popin ul").hide();
|
||||
} else {
|
||||
if (data.nb_images_associated_outside == 0) {
|
||||
$("#IMAGES_ASSOCIATED_OUTSIDE").hide();
|
||||
} else {
|
||||
$("#IMAGES_ASSOCIATED_OUTSIDE .innerText").html("");
|
||||
$("#IMAGES_ASSOCIATED_OUTSIDE .innerText").append(has_images_associated_outside.replace('%d', data.nb_images_recursive).replace('%d', data.nb_images_associated_outside));
|
||||
}
|
||||
if (data.nb_images_becoming_orphan == 0) {
|
||||
$("#IMAGES_BECOMING_ORPHAN").hide();
|
||||
} else {
|
||||
$("#IMAGES_BECOMING_ORPHAN .innerText").html("");
|
||||
$("#IMAGES_BECOMING_ORPHAN .innerText").append(has_images_becomming_orphans.replace('%d', data.nb_images_becoming_orphan));
|
||||
}
|
||||
|
||||
}
|
||||
},
|
||||
error: function(message) {
|
||||
console.log(message);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
jQuery(".deleteAlbum").click(function() {
|
||||
jQuery.colorbox({
|
||||
inline:true,
|
||||
|
@ -186,6 +226,10 @@ function cropImage() {
|
|||
.delete_popin p.popin-actions {
|
||||
margin-top:30px;
|
||||
}
|
||||
|
||||
#cboxContent {
|
||||
background: none;
|
||||
}
|
||||
{/html_style}
|
||||
|
||||
|
||||
|
@ -354,25 +398,15 @@ function cropImage() {
|
|||
{'Delete album "%s" and its %d sub-albums.'|translate:$CATEGORIES_NAV:$NB_SUBCATS}
|
||||
{/if}
|
||||
</p>
|
||||
|
||||
{if $NB_IMAGES_RECURSIVE > 0}
|
||||
<ul>
|
||||
{if $NB_IMAGES_ASSOCIATED_OUTSIDE > 0}
|
||||
<li><label class="font-checkbox"><span class="icon-dot-circled"></span><input type="radio" name="photo_deletion_mode" value="force_delete"> {'delete album and all %d photos, even the %d associated to other albums'|translate:$NB_IMAGES_RECURSIVE:$NB_IMAGES_ASSOCIATED_OUTSIDE}</label></li>
|
||||
{/if}
|
||||
{if $NB_IMAGES_BECOMING_ORPHAN > 0}
|
||||
<li><label class="font-checkbox"><span class="icon-dot-circled"></span><input type="radio" name="photo_deletion_mode" value="delete_orphans"> {'delete album and the %d orphan photos'|translate:$NB_IMAGES_BECOMING_ORPHAN}</label></li>
|
||||
{/if}
|
||||
<li><label class="font-checkbox"><span class="icon-dot-circled"></span><input type="radio" name="photo_deletion_mode" value="no_delete" checked="checked"> {'delete only album, not photos'|translate}</label></li>
|
||||
</ul>
|
||||
{/if}
|
||||
|
||||
<ul>
|
||||
<li id="IMAGES_ASSOCIATED_OUTSIDE"><label class="font-checkbox"><span class="icon-dot-circled"></span><input type="radio" name="photo_deletion_mode" value="force_delete"><span class="innerText"></span></label></li>
|
||||
<li id="IMAGES_BECOMING_ORPHAN"><label class="font-checkbox"><span class="icon-dot-circled"></span><input type="radio" name="photo_deletion_mode" value="delete_orphans"><span class="innerText"></span></label></li>
|
||||
<li id="IMAGES_RECURSIVE"><label class="font-checkbox"><span class="icon-dot-circled"></span><input type="radio" name="photo_deletion_mode" value="no_delete" checked="checked">{'delete only album, not photos'|translate}</label></li>
|
||||
</ul>
|
||||
<p class="popin-actions">
|
||||
<a id="deleteConfirm" class="buttonLike" type="submit" href="{$U_DELETE}"><i class="icon-trash"></i> {'Confirm deletion'|translate}</button>
|
||||
<a class="icon-cancel-circled close-delete_popin" href="#">{'Cancel'|translate}</a>
|
||||
</p>
|
||||
|
||||
{* $U_DELETE *}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
|
@ -555,4 +555,116 @@ SELECT
|
|||
fclose($f);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* API method
|
||||
* Return the number of orphan photos if an album is deleted
|
||||
*/
|
||||
|
||||
function ws_images_calculateOrphansOnAlbumDeletion($param, &$service)
|
||||
{
|
||||
global $conf;
|
||||
|
||||
$category_id = $param['category_id'][0];
|
||||
|
||||
$query = '
|
||||
SELECT DISTINCT
|
||||
category_id
|
||||
FROM
|
||||
'.IMAGE_CATEGORY_TABLE.'
|
||||
WHERE
|
||||
category_id = '.$category_id.'
|
||||
LIMIT 1';
|
||||
$result = pwg_query($query);
|
||||
$category['has_images'] = pwg_db_num_rows($result)>0 ? true : false;
|
||||
|
||||
// number of sub-categories
|
||||
$subcat_ids = get_subcat_ids(array($category_id));
|
||||
|
||||
$category['nb_subcats'] = count($subcat_ids) - 1;
|
||||
|
||||
// total number of images under this category (including sub-categories)
|
||||
$query = '
|
||||
SELECT DISTINCT
|
||||
(image_id)
|
||||
FROM
|
||||
'.IMAGE_CATEGORY_TABLE.'
|
||||
WHERE
|
||||
category_id IN ('.implode(',', $subcat_ids).')
|
||||
;';
|
||||
$image_ids_recursive = query2array($query, null, 'image_id');
|
||||
|
||||
$category['nb_images_recursive'] = count($image_ids_recursive);
|
||||
|
||||
// number of images that would become orphan on album deletion
|
||||
$category['nb_images_becoming_orphan'] = 0;
|
||||
$category['nb_images_associated_outside'] = 0;
|
||||
|
||||
if ($category['nb_images_recursive'] > 0)
|
||||
{
|
||||
// if we don't have "too many" photos, it's faster to compute the orphans with MySQL
|
||||
if ($category['nb_images_recursive'] < 1000)
|
||||
{
|
||||
$query = '
|
||||
SELECT DISTINCT
|
||||
(image_id)
|
||||
FROM
|
||||
'.IMAGE_CATEGORY_TABLE.'
|
||||
WHERE
|
||||
category_id
|
||||
NOT IN
|
||||
('.implode(',', $subcat_ids).')
|
||||
AND
|
||||
image_id
|
||||
IN
|
||||
('.implode(',', $image_ids_recursive).')
|
||||
;';
|
||||
|
||||
$image_ids_associated_outside = query2array($query, null, 'image_id');
|
||||
$category['nb_images_associated_outside'] = count($image_ids_associated_outside);
|
||||
|
||||
$image_ids_becoming_orphan = array_diff($image_ids_recursive, $image_ids_associated_outside);
|
||||
$category['nb_images_becoming_orphan'] = count($image_ids_becoming_orphan);
|
||||
}
|
||||
// else it's better to avoid sending a huge SQL request, we compute the orphan list with PHP
|
||||
else
|
||||
{
|
||||
$image_ids_recursive_keys = array_flip($image_ids_recursive);
|
||||
|
||||
$query = '
|
||||
SELECT
|
||||
image_id
|
||||
FROM
|
||||
'.IMAGE_CATEGORY_TABLE.'
|
||||
WHERE
|
||||
category_id
|
||||
NOT IN
|
||||
('.implode(',', $subcat_ids).')
|
||||
;';
|
||||
$image_ids_associated_outside = query2array($query, null, 'image_id');
|
||||
$image_ids_not_orphan = array();
|
||||
|
||||
foreach ($image_ids_associated_outside as $image_id)
|
||||
{
|
||||
if (isset($image_ids_recursive_keys[$image_id]))
|
||||
{
|
||||
$image_ids_not_orphan[] = $image_id;
|
||||
}
|
||||
}
|
||||
|
||||
$category['nb_images_associated_outside'] = count(array_unique($image_ids_not_orphan));
|
||||
$image_ids_becoming_orphan = array_diff($image_ids_recursive, $image_ids_not_orphan);
|
||||
$category['nb_images_becoming_orphan'] = count($image_ids_becoming_orphan);
|
||||
}
|
||||
}
|
||||
|
||||
$output[] = array(
|
||||
'nb_images_associated_outside' => $category['nb_images_associated_outside'],
|
||||
'nb_images_becoming_orphan' => $category['nb_images_becoming_orphan'],
|
||||
'nb_images_recursive' => $category['nb_images_recursive'],
|
||||
);
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
?>
|
12
ws.php
12
ws.php
|
@ -593,6 +593,18 @@ function ws_addDefaultMethods( $arr )
|
|||
array('admin_only'=>true, 'post_only'=>true)
|
||||
);
|
||||
|
||||
$service->addMethod(
|
||||
'pwg.images.calculateOrphansOnAlbumDeletion',
|
||||
'ws_images_calculateOrphansOnAlbumDeletion',
|
||||
array(
|
||||
'category_id' => array('type'=>WS_TYPE_ID,
|
||||
'flags'=>WS_PARAM_FORCE_ARRAY),
|
||||
),
|
||||
'Return the number of orphan photos if an album is deleted.',
|
||||
$ws_functions_root . 'pwg.php',
|
||||
array('admin_only'=>true)
|
||||
);
|
||||
|
||||
$service->addMethod(
|
||||
'pwg.categories.getAdminList',
|
||||
'ws_categories_getAdminList',
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue