feature 884 added: ability to delete photos uploaded via web API method

pwg.images.add, ie without storage_category_id. pLoader uses this method and
photos cannot be removed in any other way.


git-svn-id: http://piwigo.org/svn/trunk@2678 68402e56-0260-453c-a942-63ccdbb3a9ee
This commit is contained in:
plegall 2008-10-06 23:08:11 +00:00
commit 9cfd70474f
5 changed files with 175 additions and 1 deletions

View file

@ -39,6 +39,91 @@ include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
// +-----------------------------------------------------------------------+
check_status(ACCESS_ADMINISTRATOR);
// +-----------------------------------------------------------------------+
// | deletion form submission |
// +-----------------------------------------------------------------------+
if (isset($_POST['delete']))
{
if (isset($_POST['confirm_deletion']) and 1 == $_POST['confirm_deletion'])
{
$collection = array();
switch ($_POST['target_deletion'])
{
case 'all' :
{
$collection = $page['cat_elements_id'];
break;
}
case 'selection' :
{
if (!isset($_POST['selection']) or count($_POST['selection']) == 0)
{
array_push($page['errors'], l10n('Select at least one picture'));
}
else
{
$collection = $_POST['selection'];
}
break;
}
}
// filter selection on photos that have no storage_category_id (ie that
// were added via pLoader)
if (count($collection) > 0)
{
$query = '
SELECT
id
FROM '.IMAGES_TABLE.'
WHERE id IN ('.implode(',', $collection).')
AND storage_category_id IS NULL
;';
$deletables = array_from_query($query, 'id');
if (count($deletables) > 0)
{
// what will be the categories to update? (to avoid orphan on
// representative_picture_id)
$query = '
SELECT
category_id
FROM '.IMAGE_CATEGORY_TABLE.'
WHERE image_id IN ('.implode(',', $deletables).')
;';
$categories_to_update = array_from_query($query, 'category_id');
$physical_deletion = true;
delete_elements($deletables, $physical_deletion);
update_category($categories_to_update);
array_push(
$page['infos'],
sprintf(
l10n_dec(
'%d photo was deleted',
'%d photos were deleted',
count($deletables)
),
count($deletables)
)
);
}
else
{
array_push($page['errors'], l10n('No photo can be deleted'));
}
}
}
else
{
array_push($page['errors'], l10n('You need to confirm deletion'));
}
}
// +-----------------------------------------------------------------------+
// | global mode form submission |
// +-----------------------------------------------------------------------+
@ -236,6 +321,30 @@ $template->assign(
$template->assign('IN_CADDIE', 'caddie' == $_GET['cat'] ? true : false );
// +-----------------------------------------------------------------------+
// | deletion form |
// +-----------------------------------------------------------------------+
// we can only remove photos that have no storage_category_id, in other
// word, it currently (Butterfly) means that the photo was added with
// pLoader
if (count($page['cat_elements_id']) > 0)
{
$query = '
SELECT
COUNT(*)
FROM '.IMAGES_TABLE.'
WHERE id IN ('.implode(',', $page['cat_elements_id']).')
AND storage_category_id IS NULL
;';
list($counter) = mysql_fetch_row(pwg_query($query));
if ($counter > 0)
{
$template->assign('show_delete_form', true);
}
}
// +-----------------------------------------------------------------------+
// | global mode form |
// +-----------------------------------------------------------------------+

View file

@ -127,7 +127,7 @@ DELETE FROM '.OLD_PERMALINKS_TABLE.'
// - all the comments related to elements
// - all the links between categories and elements
// - all the favorites associated to elements
function delete_elements($ids)
function delete_elements($ids, $physical_deletion=false)
{
if (count($ids) == 0)
{
@ -135,6 +135,45 @@ function delete_elements($ids)
}
trigger_action('begin_delete_elements', $ids);
if ($physical_deletion)
{
include_once(PHPWG_ROOT_PATH.'include/functions_picture.inc.php');
// we can currently delete physically only photo with no
// storage_category_id (added via pLoader)
//
// we assume that the element is a photo, with no representative
$query = '
SELECT
id,
path,
tn_ext,
has_high
FROM '.IMAGES_TABLE.'
WHERE id IN ('.implode(',', $ids).')
AND storage_category_id IS NULL
;';
$result = pwg_query($query);
while ($row = mysql_fetch_assoc($result))
{
$file_path = $row['path'];
$thumbnail_path = get_thumbnail_path($row);
$high_path = null;
if (isset($row['has_high']) and get_boolean($row['has_high']))
{
$high_path = get_high_path($row);
}
foreach (array($file_path, $thumbnail_path, $high_path) as $path)
{
if (isset($path) and !unlink($path))
{
die('"'.$path.'" cannot be removed');
}
}
}
}
// destruction of the comments on the image
$query = '
DELETE FROM '.COMMENTS_TABLE.'

View file

@ -65,6 +65,22 @@
</fieldset>
{if $show_delete_form}
<fieldset>
<legend>{'Deletions'|@translate}</legend>
<p style="font-style:italic">{'Note: Only deletes photos added with pLoader'|@translate}</p>
<p>
{'target'|@translate}
<label><input type="radio" name="target_deletion" value="all" /> {'all'|@translate}</label>
<label><input type="radio" name="target_deletion" value="selection" checked="checked" /> {'selection'|@translate}</label>
</p>
<p>
<label><input type="checkbox" name="confirm_deletion" value="1" /> {'confirm'|@translate}</label>
<input class="submit" type="submit" value="{'Delete selected photos'|@translate}" name="delete" {$TAG_INPUT_ENABLED}/>
</p>
</fieldset>
{/if}
<fieldset>
<legend>{'Form'|@translate}</legend>

View file

@ -639,4 +639,9 @@ $lang['ranks'] = 'ranks';
$lang['Drag to re-order'] = 'Drag to re-order';
$lang['Unable to retrieve server informations since allow_url_fopen is disabled.'] = 'Unable to retrieve server informations since allow_url_fopen is disabled.';
$lang['Quick Local Synchronization'] = 'Quick Local Synchronization';
$lang['No photo can be deleted'] = 'No photo can be deleted';
$lang['Note: Only deletes photos added with pLoader'] = 'Note: Only deletes photos added with pLoader';
$lang['Delete selected photos'] = 'Delete selected photos';
$lang['%d photo was deleted'] = '%d photo was deleted';
$lang['%d photos were deleted'] = '%d photos were deleted';
?>

View file

@ -638,4 +638,9 @@ $lang['ranks'] = 'rangs';
$lang['Drag to re-order'] = 'Cliquer-glisser pour ré-organiser';
$lang['Unable to retrieve server informations since allow_url_fopen is disabled.'] = 'Impossible de se connecter au server car la fonction allow_url_fopen est désactivée.';
$lang['Quick Local Synchronization'] = 'Synchronisation Rapide';
$lang['No photo can be deleted'] = 'Aucune photo ne peut être supprimée';
$lang['Note: Only deletes photos added with pLoader'] = 'Note: seules les photos ajoutées via pLoader peuvent être supprimées';
$lang['Delete selected photos'] = 'Supprimer les photos';
$lang['%d photo was deleted'] = '%d photo a été supprimée';
$lang['%d photos were deleted'] = '%d photos ont été supprimées';
?>