Skip to content

Commit

Permalink
feature 884 added: ability to delete photos uploaded via web API method
Browse files Browse the repository at this point in the history
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
  • Loading branch information
plegall committed Oct 6, 2008
1 parent b0c5147 commit 9cfd704
Show file tree
Hide file tree
Showing 5 changed files with 175 additions and 1 deletion.
109 changes: 109 additions & 0 deletions admin/element_set_global.php
Expand Up @@ -39,6 +39,91 @@
// +-----------------------------------------------------------------------+
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 |
// +-----------------------------------------------------------------------+
Expand Down Expand Up @@ -236,6 +321,30 @@

$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 |
// +-----------------------------------------------------------------------+
Expand Down
41 changes: 40 additions & 1 deletion admin/include/functions.php
Expand Up @@ -127,14 +127,53 @@ function delete_categories($ids)
// - 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)
{
return;
}
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.'
Expand Down
16 changes: 16 additions & 0 deletions admin/template/goto/element_set_global.tpl
Expand Up @@ -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>
Expand Down
5 changes: 5 additions & 0 deletions language/en_UK/admin.lang.php
Expand Up @@ -639,4 +639,9 @@
$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';
?>
5 changes: 5 additions & 0 deletions language/fr_FR/admin.lang.php
Expand Up @@ -638,4 +638,9 @@
$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';
?>

0 comments on commit 9cfd704

Please sign in to comment.