MDL-57486 tool_recyclebin: Delete items when context already deleted.
authorDan Marsden <dan@danmarsden.com>
Tue, 22 May 2018 06:39:52 +0000 (18:39 +1200)
committerDan Marsden <dan@danmarsden.com>
Tue, 29 May 2018 02:24:50 +0000 (14:24 +1200)
admin/tool/recyclebin/classes/category_bin.php
admin/tool/recyclebin/classes/course_bin.php

index 26d8b53..e9795f5 100644 (file)
@@ -288,13 +288,22 @@ class category_bin extends base_bin {
         global $DB;
 
         // Grab the course category context.
-        $context = \context_coursecat::instance($this->_categoryid);
-
-        // Delete the files.
-        $fs = get_file_storage();
-        $files = $fs->get_area_files($context->id, 'tool_recyclebin', TOOL_RECYCLEBIN_COURSECAT_BIN_FILEAREA, $item->id);
-        foreach ($files as $file) {
-            $file->delete();
+        $context = \context_coursecat::instance($this->_categoryid, IGNORE_MISSING);
+        if (!empty($context)) {
+            // Delete the files.
+            $fs = get_file_storage();
+            $fs->delete_area_files($context->id, 'tool_recyclebin', TOOL_RECYCLEBIN_COURSECAT_BIN_FILEAREA, $item->id);
+        } else {
+            // Course category has been deleted. Find records using $item->id as this is unique for coursecat recylebin.
+            $files = $DB->get_recordset('files', array('component' => 'tool_recyclebin',
+                                                           'filearea' => TOOL_RECYCLEBIN_COURSECAT_BIN_FILEAREA,
+                                                           'itemid' => $item->id));
+            $fs = get_file_storage();
+            foreach ($files as $filer) {
+                $file = $fs->get_file_instance($filer);
+                $file->delete();
+            }
+            $file->close();
         }
 
         // Delete the record.
@@ -302,6 +311,11 @@ class category_bin extends base_bin {
             'id' => $item->id
         ));
 
+        // The coursecat might have been deleted, check we have a context before triggering event.
+        if (!$context) {
+            return;
+        }
+
         // Fire event.
         $event = \tool_recyclebin\event\category_bin_item_deleted::create(array(
             'objectid' => $item->id,
index e935d69..3b0896c 100644 (file)
@@ -274,13 +274,23 @@ class course_bin extends base_bin {
         global $DB;
 
         // Grab the course context.
-        $context = \context_course::instance($this->_courseid);
-
-        // Delete the files.
-        $fs = get_file_storage();
-        $files = $fs->get_area_files($context->id, 'tool_recyclebin', TOOL_RECYCLEBIN_COURSE_BIN_FILEAREA, $item->id);
-        foreach ($files as $file) {
-            $file->delete();
+        $context = \context_course::instance($this->_courseid, IGNORE_MISSING);
+
+        if (!empty($context)) {
+            // Delete the files.
+            $fs = get_file_storage();
+            $fs->delete_area_files($context->id, 'tool_recyclebin', TOOL_RECYCLEBIN_COURSE_BIN_FILEAREA, $item->id);
+        } else {
+            // Course context has been deleted. Find records using $item->id as this is unique for course bin recyclebin.
+            $files = $DB->get_recordset('files', array('component' => 'tool_recyclebin',
+                                                           'filearea' => TOOL_RECYCLEBIN_COURSE_BIN_FILEAREA,
+                                                           'itemid' => $item->id));
+            $fs = get_file_storage();
+            foreach ($files as $filer) {
+                $file = $fs->get_file_instance($filer);
+                $file->delete();
+            }
+            $files->close();
         }
 
         // Delete the record.