diff --git a/safedelete/controllers/SafeDeleteController.php b/safedelete/controllers/SafeDeleteController.php index 95b924a..0505d29 100644 --- a/safedelete/controllers/SafeDeleteController.php +++ b/safedelete/controllers/SafeDeleteController.php @@ -1,4 +1,5 @@ plugins->getPlugin('safeDelete')->getSettings(); $relations = craft()->safeDelete->getUsagesFor($ids, $type); - - if($relations === null || count($relations) === 0) { // safe to delete + + if ($relations === null || count($relations) === 0) { // safe to delete return $this->doAction($ids, $type); } else { - $html = craft()->templates->render('safeDelete/deleteOverlay', ['relations' => $relations, 'allowForceDelete' => (bool)$settings->allowForceDelete]); + $html = craft()->templates->render( + 'safeDelete/deleteOverlay', + ['relations' => $relations, 'allowForceDelete' => (bool)$settings->allowForceDelete] + ); - return $this->returnJson([ - 'html' => $html, - 'success'=> true, - ]); + return $this->returnJson( + [ + 'html' => $html, + 'success' => true, + ] + ); } } @@ -29,7 +35,7 @@ protected function doAction($ids, $type) { $message = ''; - switch($type) { + switch ($type) { case 'asset': craft()->assets->deleteFiles($ids); $message = Craft::t('Assets deleted.'); @@ -40,10 +46,12 @@ protected function doAction($ids, $type) break; } - return $this->returnJson([ - 'success'=> true, - 'message' => $message, - ]); + return $this->returnJson( + [ + 'success' => true, + 'message' => $message, + ] + ); } public function actionForceDelete() @@ -53,13 +61,25 @@ public function actionForceDelete() $settings = craft()->plugins->getPlugin('safeDelete')->getSettings(); - if($settings->allowForceDelete) { + if ($settings->allowForceDelete) { return $this->doAction($ids, $type); } - return $this->returnJson([ - 'success'=> false, - ]); + return $this->returnJson( + [ + 'success' => false, + ] + ); + } + + public function actionDeleteUnreferenced() + { + $ids = craft()->request->getPost('ids'); + $type = craft()->request->getPost('type'); + + $ids = craft()->safeDelete->filterReferencedIds($ids, $type); + + return $this->doAction($ids, $type); } } diff --git a/safedelete/elementactions/SafeDelete_BaseDeleteElementAction.php b/safedelete/elementactions/SafeDelete_BaseDeleteElementAction.php index a0ba0b0..6c2f334 100644 --- a/safedelete/elementactions/SafeDelete_BaseDeleteElementAction.php +++ b/safedelete/elementactions/SafeDelete_BaseDeleteElementAction.php @@ -47,13 +47,20 @@ public function getTriggerHtml() modal.hide(); }); - \$html.find('.submit').on('click', function() { + \$html.find('.submit[name=forceDelete]').on('click', function() { Craft.postActionRequest('safeDelete/forceDelete', {'ids': ids, type: '$deletionType'}, function(res) { Craft.elementIndex.updateElements(); modal.hide(); }); }); + \$html.find('.submit[name=deleteUnreferencedElements]').on('click', function() { + Craft.postActionRequest('safeDelete/deleteUnreferenced', {'ids': ids, type: '$deletionType'}, function(res) { + Craft.elementIndex.updateElements(); + modal.hide(); + }); + }); + \$html.find('.reload').on('click', function() { modal.hide(); doAction(ids); diff --git a/safedelete/services/SafeDeleteService.php b/safedelete/services/SafeDeleteService.php index 4b62469..861579d 100644 --- a/safedelete/services/SafeDeleteService.php +++ b/safedelete/services/SafeDeleteService.php @@ -24,6 +24,36 @@ public function getUsagesFor($ids, $type) return $relations; } + /** + * Returns an array only with ids which are + * not referneced and safe to delete. + * + * @param $ids + * @param $type + * @return array + */ + public function filterReferencedIds($ids, $type) + { + $arrIds = []; + $arrRet = []; + + $relations = craft()->safeDelete->getUsagesFor($ids, $type); + + foreach ($relations as $elements) { + foreach($elements as $element) { + $arrIds[] = $element['sourceElement']->id; + } + } + + foreach($ids as $id) { + if (!in_array($id, $arrIds)) { + $arrRet[] = $id; + } + } + + return $arrRet; + } + protected function getRelationsForElement($id) { $arrReturn = []; diff --git a/safedelete/templates/deleteOverlay.twig b/safedelete/templates/deleteOverlay.twig index 25c7d53..490de26 100644 --- a/safedelete/templates/deleteOverlay.twig +++ b/safedelete/templates/deleteOverlay.twig @@ -65,7 +65,7 @@ {% if allowForceDelete %}

- +

{{ 'WARNING! Deletion of referenced elements can lead to unexpected consequences and errors in the frontend.'|t }}

{% endif %}