Skip to content

Commit cab9b4e

Browse files
fulldecentmdjnelson
authored andcommitted
Add events for adding and deleting certificates (#675)
1 parent e9d22ff commit cab9b4e

File tree

7 files changed

+202
-7
lines changed

7 files changed

+202
-7
lines changed

classes/certificate.php

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -535,7 +535,21 @@ public static function issue_certificate($certificateid, $userid) {
535535
$issue->timecreated = time();
536536

537537
// Insert the record into the database.
538-
return $DB->insert_record('customcert_issues', $issue);
538+
$issueid = $DB->insert_record('customcert_issues', $issue);
539+
540+
// Get course module context for event.
541+
$cm = get_coursemodule_from_instance('customcert', $certificateid, 0, false, MUST_EXIST);
542+
$context = \context_module::instance($cm->id);
543+
544+
// Trigger event.
545+
$event = \mod_customcert\event\certificate_issued::create([
546+
'objectid' => $issueid,
547+
'context' => $context,
548+
'relateduserid' => $userid
549+
]);
550+
$event->trigger();
551+
552+
return $issueid;
539553
}
540554

541555
/**
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
<?php
2+
// This file is part of Moodle - http://moodle.org/
3+
//
4+
// Moodle is free software: you can redistribute it and/or modify
5+
// it under the terms of the GNU General Public License as published by
6+
// the Free Software Foundation, either version 3 of the License, or
7+
// (at your option) any later version.
8+
//
9+
// Moodle is distributed in the hope that it will be useful,
10+
// but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
// GNU General Public License for more details.
13+
//
14+
// You should have received a copy of the GNU General Public License
15+
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
16+
17+
/**
18+
* Event triggered when a certificate issue is deleted.
19+
*
20+
* @package mod_customcert
21+
* @copyright 2025 William Entriken <@fulldecent>
22+
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23+
*/
24+
25+
namespace mod_customcert\event;
26+
27+
/**
28+
* Event triggered when a certificate issue is deleted.
29+
*
30+
* @package mod_customcert
31+
* @copyright 2025 William Entriken <@fulldecent>
32+
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
33+
*/
34+
class certificate_deleted extends \core\event\base {
35+
36+
/**
37+
* Initialises the event.
38+
*
39+
*/
40+
protected function init() {
41+
$this->data['crud'] = 'd'; // A 'delete' operation.
42+
$this->data['edulevel'] = self::LEVEL_OTHER; // Not teaching, participation, etc.
43+
$this->data['objecttable'] = 'customcert_issues'; // The DB table this event pertains to.
44+
}
45+
46+
/**
47+
* Returns the localized name of the event.
48+
*
49+
* @return string
50+
*/
51+
public static function get_name() {
52+
return get_string('eventcertificatedeleted', 'mod_customcert');
53+
}
54+
55+
/**
56+
* Returns a description of the event for logging/debugging.
57+
*
58+
* @return string
59+
*/
60+
public function get_description() {
61+
return "The certificate issue with id '{$this->objectid}' was deleted, from user with id '{$this->relateduserid}'.";
62+
}
63+
64+
/**
65+
* Returns a relevant URL for viewing more information about the event.
66+
*
67+
* @return \moodle_url
68+
*/
69+
public function get_url() {
70+
return new \moodle_url('/mod/customcert/view.php', ['id' => $this->contextinstanceid]);
71+
}
72+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
<?php
2+
// This file is part of Moodle - http://moodle.org/
3+
//
4+
// Moodle is free software: you can redistribute it and/or modify
5+
// it under the terms of the GNU General Public License as published by
6+
// the Free Software Foundation, either version 3 of the License, or
7+
// (at your option) any later version.
8+
//
9+
// Moodle is distributed in the hope that it will be useful,
10+
// but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
// GNU General Public License for more details.
13+
//
14+
// You should have received a copy of the GNU General Public License
15+
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
16+
17+
/**
18+
* Event class for when a custom certificate is issued to a user.
19+
*
20+
* @package mod_customcert
21+
* @copyright 2025 William Entriken <@fulldecent>
22+
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23+
*/
24+
25+
namespace mod_customcert\event;
26+
27+
/**
28+
* Event class for when a custom certificate is issued to a user.
29+
*
30+
* @package mod_customcert
31+
* @copyright 2025 William Entriken <@fulldecent>
32+
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
33+
*/
34+
class certificate_issued extends \core\event\base {
35+
36+
/**
37+
* Initialises the event.
38+
*/
39+
protected function init() {
40+
$this->data['crud'] = 'c'; // A 'create' operation.
41+
$this->data['edulevel'] = self::LEVEL_OTHER; // Not teaching, participation, etc.
42+
$this->data['objecttable'] = 'customcert_issues'; // The DB table this event pertains to.
43+
}
44+
45+
/**
46+
* Returns the localized event name.
47+
*
48+
* @return string The name of the event.
49+
*/
50+
public static function get_name() {
51+
return get_string('eventcertificateissued', 'mod_customcert');
52+
}
53+
54+
/**
55+
* Returns a description of what happened.
56+
*
57+
* @return string A detailed description of the event.
58+
*/
59+
public function get_description() {
60+
return "The user with id '{$this->userid}' was issued a custom certificate with issue id '{$this->objectid}'.";
61+
}
62+
63+
/**
64+
* Returns the URL relevant to the event.
65+
*
66+
* @return \moodle_url A URL to view the certificate or related activity.
67+
*/
68+
public function get_url() {
69+
return new \moodle_url('/mod/customcert/view.php', ['id' => $this->contextinstanceid]);
70+
}
71+
}

classes/external.php

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,20 @@ public static function delete_issue($certificateid, $issueid) {
219219
require_capability('mod/customcert:manage', $context);
220220

221221
// Delete the issue.
222-
return $DB->delete_records('customcert_issues', ['id' => $issue->id]);
222+
// Delete the issue.
223+
$deleted = $DB->delete_records('customcert_issues', ['id' => $issue->id]);
224+
225+
// Trigger event if deletion succeeded.
226+
if ($deleted) {
227+
$event = \mod_customcert\event\certificate_deleted::create([
228+
'objectid' => $issue->id,
229+
'context' => $context,
230+
'relateduserid' => $issue->userid,
231+
]);
232+
$event->trigger();
233+
}
234+
235+
return $deleted;
223236
}
224237

225238
/**

lang/en/customcert.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,8 @@
116116
$string['eventtemplatecreated'] = 'Custom certificate template created';
117117
$string['eventtemplatedeleted'] = 'Custom certificate template deleted';
118118
$string['eventtemplateupdated'] = 'Custom certificate template updated';
119+
$string['eventcertificateupdated'] = 'Certificate updated';
120+
$string['eventcertificatedeleted'] = 'Certificate deleted';
119121
$string['exampledatawarning'] = 'Some of these values may just be an example to ensure positioning of the elements is possible.';
120122
$string['font'] = 'Font';
121123
$string['font_help'] = 'The font used when generating this element.';

lib.php

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,21 @@ function customcert_delete_instance($id) {
8787
return false;
8888
}
8989

90-
// Delete the customcert instance.
91-
if (!$DB->delete_records('customcert', ['id' => $id])) {
90+
$context = context_module::instance($cm->id);
91+
92+
// Trigger certificate_deleted events for each issue.
93+
$issues = $DB->get_records('customcert_issues', ['customcertid' => $id]);
94+
foreach ($issues as $issue) {
95+
$event = \mod_customcert\event\certificate_deleted::create([
96+
'objectid' => $issue->id,
97+
'context' => $context,
98+
'relateduserid' => $issue->userid,
99+
]);
100+
$event->trigger();
101+
}
102+
103+
// Delete the customcert issues.
104+
if (!$DB->delete_records('customcert_issues', ['customcertid' => $id])) {
92105
return false;
93106
}
94107

@@ -98,13 +111,12 @@ function customcert_delete_instance($id) {
98111
$template->delete();
99112
}
100113

101-
// Delete the customcert issues.
102-
if (!$DB->delete_records('customcert_issues', ['customcertid' => $id])) {
114+
// Delete the customcert instance.
115+
if (!$DB->delete_records('customcert', ['id' => $id])) {
103116
return false;
104117
}
105118

106119
// Delete any files associated with the customcert.
107-
$context = context_module::instance($cm->id);
108120
$fs = get_file_storage();
109121
$fs->delete_area_files($context->id);
110122

view.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,19 @@
8787
}
8888

8989
// Delete the issue.
90+
$issue = $DB->get_record('customcert_issues', ['id' => $deleteissue, 'customcertid' => $customcert->id], '*', MUST_EXIST);
9091
$DB->delete_records('customcert_issues', ['id' => $deleteissue, 'customcertid' => $customcert->id]);
9192

93+
// Trigger event.
94+
$cm = get_coursemodule_from_instance('customcert', $customcert->id, 0, false, MUST_EXIST);
95+
$context = \context_module::instance($cm->id);
96+
$event = \mod_customcert\event\certificate_deleted::create([
97+
'objectid' => $issue->id,
98+
'context' => $context,
99+
'relateduserid' => $issue->userid,
100+
]);
101+
$event->trigger();
102+
92103
// Redirect back to the manage templates page.
93104
redirect(new moodle_url('/mod/customcert/view.php', ['id' => $id]));
94105
}

0 commit comments

Comments
 (0)