mirror of
https://github.com/Piwigo/Piwigo.git
synced 2025-04-27 19:59:56 +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;
|
$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 path
|
||||||
$navigation = get_cat_display_name_cache(
|
$navigation = get_cat_display_name_cache(
|
||||||
$category['uppercats'],
|
$category['uppercats'],
|
||||||
|
@ -391,9 +329,9 @@ $template->assign(
|
||||||
array(
|
array(
|
||||||
'CATEGORY_FULLNAME' => trim(strip_tags($navigation)),
|
'CATEGORY_FULLNAME' => trim(strip_tags($navigation)),
|
||||||
'NB_SUBCATS' => $category['nb_subcats'],
|
'NB_SUBCATS' => $category['nb_subcats'],
|
||||||
'NB_IMAGES_RECURSIVE' => $category['nb_images_recursive'],
|
// 'NB_IMAGES_RECURSIVE' => $category['nb_images_recursive'],
|
||||||
'NB_IMAGES_BECOMING_ORPHAN' => $category['nb_images_becoming_orphan'],
|
// 'NB_IMAGES_BECOMING_ORPHAN' => $category['nb_images_becoming_orphan'],
|
||||||
'NB_IMAGES_ASSOCIATED_OUTSIDE' => $category['nb_images_associated_outside'],
|
// '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'}
|
{combine_script id='common' load='footer' path='admin/themes/default/js/common.js'}
|
||||||
{include file='include/colorbox.inc.tpl'}
|
{include file='include/colorbox.inc.tpl'}
|
||||||
{combine_script id='LocalStorageCache' load='footer' path='admin/themes/default/js/LocalStorageCache.js'}
|
{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_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"}
|
{combine_css id='jquery.selectize' path="themes/default/js/plugins/selectize.{$themeconf.colorscheme}.css"}
|
||||||
|
|
||||||
{footer_script}
|
{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 --> *}
|
{* <!-- CATEGORIES --> *}
|
||||||
var categoriesCache = new CategoriesCache({
|
var categoriesCache = new CategoriesCache({
|
||||||
serverKey: '{$CACHE_KEYS.categories}',
|
serverKey: '{$CACHE_KEYS.categories}',
|
||||||
|
@ -98,6 +104,40 @@ jQuery(document).ready(function() {
|
||||||
e.preventDefault();
|
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(".deleteAlbum").click(function() {
|
||||||
jQuery.colorbox({
|
jQuery.colorbox({
|
||||||
inline:true,
|
inline:true,
|
||||||
|
@ -186,6 +226,10 @@ function cropImage() {
|
||||||
.delete_popin p.popin-actions {
|
.delete_popin p.popin-actions {
|
||||||
margin-top:30px;
|
margin-top:30px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#cboxContent {
|
||||||
|
background: none;
|
||||||
|
}
|
||||||
{/html_style}
|
{/html_style}
|
||||||
|
|
||||||
|
|
||||||
|
@ -354,25 +398,15 @@ function cropImage() {
|
||||||
{'Delete album "%s" and its %d sub-albums.'|translate:$CATEGORIES_NAV:$NB_SUBCATS}
|
{'Delete album "%s" and its %d sub-albums.'|translate:$CATEGORIES_NAV:$NB_SUBCATS}
|
||||||
{/if}
|
{/if}
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
{if $NB_IMAGES_RECURSIVE > 0}
|
|
||||||
<ul>
|
<ul>
|
||||||
{if $NB_IMAGES_ASSOCIATED_OUTSIDE > 0}
|
<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><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>
|
<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>
|
||||||
{/if}
|
<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>
|
||||||
{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>
|
</ul>
|
||||||
{/if}
|
|
||||||
|
|
||||||
<p class="popin-actions">
|
<p class="popin-actions">
|
||||||
<a id="deleteConfirm" class="buttonLike" type="submit" href="{$U_DELETE}"><i class="icon-trash"></i> {'Confirm deletion'|translate}</button>
|
<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>
|
<a class="icon-cancel-circled close-delete_popin" href="#">{'Cancel'|translate}</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
{* $U_DELETE *}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -555,4 +555,116 @@ SELECT
|
||||||
fclose($f);
|
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)
|
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(
|
$service->addMethod(
|
||||||
'pwg.categories.getAdminList',
|
'pwg.categories.getAdminList',
|
||||||
'ws_categories_getAdminList',
|
'ws_categories_getAdminList',
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue