From ec2f411d279a241c870cc26861fbcfa4ce18c89b Mon Sep 17 00:00:00 2001 From: Adrian Sarmas Date: Mon, 12 Oct 2026 02:25:16 +0300 Subject: [PATCH] Add Moodle 5.3 support, declare 4.0 - 5.3 support Moodle 5.3 deprecates the global external_* class names, which now emit debugging when used. The external functions use the core_external classes instead, and a shared journal_external_api_base file aliases the global classes into core_external on Moodle 4.0 and 4.1, where the namespace does not exist yet. Remove the FEATURE_GROUPMEMBERSONLY case, deprecated in 5.3 and unused by core since 2.8. Add MOODLE_503_STABLE to the CI matrix with PostgreSQL 17 and MariaDB 11.4, which 5.3 requires, and use mariadb-admin for the MariaDB health check. --- .github/workflows/main.yml | 18 ++++++-- classes/external/get_entry.php | 36 ++------------- .../external/journal_external_api_base.php | 44 +++++++++++++++++++ classes/external/save_feedback.php | 29 ++---------- classes/external/set_text.php | 33 ++------------ classes/external/view_journal.php | 24 +--------- lib.php | 2 - version.php | 6 +-- 8 files changed, 73 insertions(+), 119 deletions(-) create mode 100644 classes/external/journal_external_api_base.php diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index b975700..653ac0b 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -8,7 +8,7 @@ jobs: services: postgres: - image: postgres:16 + image: postgres:${{ matrix.moodle-branch == 'MOODLE_503_STABLE' && '17' || '16' }} env: POSTGRES_USER: 'postgres' POSTGRES_HOST_AUTH_METHOD: 'trust' @@ -16,7 +16,7 @@ jobs: - 5432:5432 options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 3 mariadb: - image: mariadb:10.11 + image: mariadb:${{ matrix.moodle-branch == 'MOODLE_503_STABLE' && '11.4' || '10.11' }} env: MYSQL_USER: 'root' MYSQL_ALLOW_EMPTY_PASSWORD: "true" @@ -25,12 +25,24 @@ jobs: ports: - 3306:3306 - options: --health-cmd="mysqladmin ping" --health-interval 10s --health-timeout 5s --health-retries 3 + options: --health-cmd="mariadb-admin ping" --health-interval 10s --health-timeout 5s --health-retries 3 strategy: fail-fast: false matrix: include: + - php: 8.4 + moodle-branch: MOODLE_503_STABLE + database: pgsql + - php: 8.4 + moodle-branch: MOODLE_503_STABLE + database: mariadb + - php: 8.3 + moodle-branch: MOODLE_503_STABLE + database: pgsql + - php: 8.3 + moodle-branch: MOODLE_503_STABLE + database: mariadb - php: 8.4 moodle-branch: MOODLE_502_STABLE database: pgsql diff --git a/classes/external/get_entry.php b/classes/external/get_entry.php index 59fc416..c91d2d3 100644 --- a/classes/external/get_entry.php +++ b/classes/external/get_entry.php @@ -16,42 +16,12 @@ namespace mod_journal\external; -defined('MOODLE_INTERNAL') || die(); - use context_module; -use external_function_parameters; -use external_single_structure; -use external_value; +use core_external\external_function_parameters; +use core_external\external_single_structure; +use core_external\external_value; use invalid_parameter_exception; -global $CFG; - -// Dynamic Class Logic. -// Ensures compatibility between Moodle 3.9 (global classes) and 4.0+ (core_external namespace). -if (!class_exists('mod_journal\external\journal_external_api_base')) { - if (class_exists('core_external\external_api')) { - // Moodle 4.0 and higher. - class_alias('core_external\external_api', 'mod_journal\external\journal_external_api_base'); - - // Ensure global class aliases exist for the helper types used in this file. - // This is necessary because "use external_function_parameters;" expects the global class, - // which might not be aliased automatically in strict PHPUnit isolation. - if (!class_exists('external_function_parameters')) { - class_alias('core_external\external_function_parameters', 'external_function_parameters'); - } - if (!class_exists('external_value')) { - class_alias('core_external\external_value', 'external_value'); - } - if (!class_exists('external_single_structure')) { - class_alias('core_external\external_single_structure', 'external_single_structure'); - } - } else { - // Moodle 3.9 - 3.11. - require_once($CFG->libdir . '/externallib.php'); - class_alias('external_api', 'mod_journal\external\journal_external_api_base'); - } -} - /** * External function to get a journal entry. * diff --git a/classes/external/journal_external_api_base.php b/classes/external/journal_external_api_base.php new file mode 100644 index 0000000..2697da0 --- /dev/null +++ b/classes/external/journal_external_api_base.php @@ -0,0 +1,44 @@ +. + +/** + * Base class of the mod_journal external functions. + * + * The external API lives in the core_external namespace since Moodle 4.2 and the global class names + * are deprecated since Moodle 5.3. Moodle 4.0 and 4.1 only have the global classes, so they are + * aliased into core_external there, letting the external functions use the namespaced names everywhere. + * + * @package mod_journal + * @copyright 2026 Adrian Sarmas adrian.emanuel.sarmas@gmail.com + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace mod_journal\external; + +defined('MOODLE_INTERNAL') || die(); + +global $CFG; + +if (!class_exists('core_external\external_api')) { + // Moodle 4.0 and 4.1. + require_once($CFG->libdir . '/externallib.php'); + class_alias('external_api', 'core_external\external_api'); + class_alias('external_function_parameters', 'core_external\external_function_parameters'); + class_alias('external_single_structure', 'core_external\external_single_structure'); + class_alias('external_value', 'core_external\external_value'); +} + +class_alias('core_external\external_api', 'mod_journal\external\journal_external_api_base'); diff --git a/classes/external/save_feedback.php b/classes/external/save_feedback.php index c03ca3c..441d59a 100644 --- a/classes/external/save_feedback.php +++ b/classes/external/save_feedback.php @@ -16,35 +16,12 @@ namespace mod_journal\external; -defined('MOODLE_INTERNAL') || die(); - -require_once($CFG->libdir . '/externallib.php'); - - use context_module; -use external_function_parameters; -use external_single_structure; -use external_value; +use core_external\external_function_parameters; +use core_external\external_single_structure; +use core_external\external_value; use invalid_parameter_exception; -global $CFG; - -// Dynamic Class Logic for compatibility. -if (!class_exists('mod_journal\external\journal_external_api_base')) { - if (class_exists('core_external\external_api')) { - class_alias('core_external\external_api', 'mod_journal\external\journal_external_api_base'); - if (!class_exists('external_function_parameters')) { - class_alias('core_external\external_function_parameters', 'external_function_parameters'); - } - if (!class_exists('external_value')) { - class_alias('core_external\external_value', 'external_value'); - } - } else { - require_once($CFG->libdir . '/externallib.php'); - class_alias('external_api', 'mod_journal\external\journal_external_api_base'); - } -} - /** * External function to save feedback and grade for a journal entry. * diff --git a/classes/external/set_text.php b/classes/external/set_text.php index 89d8d20..60b0cc1 100644 --- a/classes/external/set_text.php +++ b/classes/external/set_text.php @@ -16,45 +16,18 @@ namespace mod_journal\external; -defined('MOODLE_INTERNAL') || die(); - -require_once($CFG->libdir . '/externallib.php'); - use coding_exception; use context_module; use dml_exception; -use external_function_parameters; -use external_value; -use external_single_structure; +use core_external\external_function_parameters; +use core_external\external_value; +use core_external\external_single_structure; use invalid_parameter_exception; use mod_journal\event\entry_created; use mod_journal\event\entry_updated; use required_capability_exception; use stdClass; -global $CFG; - -// Dynamic Class Logic. -// Ensures compatibility between Moodle 3.9 (global classes) and 4.0+ (core_external namespace). -if (!class_exists('mod_journal\external\journal_external_api_base')) { - if (class_exists('core_external\external_api')) { - // Moodle 4.0 and higher. - class_alias('core_external\external_api', 'mod_journal\external\journal_external_api_base'); - - // Ensure global class aliases exist for the helper types used in this file. - if (!class_exists('external_function_parameters')) { - class_alias('core_external\external_function_parameters', 'external_function_parameters'); - } - if (!class_exists('external_value')) { - class_alias('core_external\external_value', 'external_value'); - } - } else { - // Moodle 3.9 - 3.11. - require_once($CFG->libdir . '/externallib.php'); - class_alias('external_api', 'mod_journal\external\journal_external_api_base'); - } -} - /** * External function to set a journal's text * diff --git a/classes/external/view_journal.php b/classes/external/view_journal.php index 714a1eb..5e38f02 100644 --- a/classes/external/view_journal.php +++ b/classes/external/view_journal.php @@ -16,31 +16,11 @@ namespace mod_journal\external; -defined('MOODLE_INTERNAL') || die(); - use context_module; -use external_function_parameters; -use external_value; +use core_external\external_function_parameters; +use core_external\external_value; use invalid_parameter_exception; -global $CFG; - -// Dynamic Class Logic. -if (!class_exists('mod_journal\external\journal_external_api_base')) { - if (class_exists('core_external\external_api')) { - class_alias('core_external\external_api', 'mod_journal\external\journal_external_api_base'); - if (!class_exists('external_function_parameters')) { - class_alias('core_external\external_function_parameters', 'external_function_parameters'); - } - if (!class_exists('external_value')) { - class_alias('core_external\external_value', 'external_value'); - } - } else { - require_once($CFG->libdir . '/externallib.php'); - class_alias('external_api', 'mod_journal\external\journal_external_api_base'); - } -} - /** * External function to trigger journal view event. * diff --git a/lib.php b/lib.php index 2857071..c65dcb6 100644 --- a/lib.php +++ b/lib.php @@ -162,8 +162,6 @@ function journal_supports($feature) { return true; case FEATURE_GROUPINGS: return true; - case FEATURE_GROUPMEMBERSONLY: - return true; case FEATURE_COMPLETION_TRACKS_VIEWS: return true; case FEATURE_COMPLETION_HAS_RULES: diff --git a/version.php b/version.php index 938c3e6..70e1a8e 100644 --- a/version.php +++ b/version.php @@ -25,8 +25,8 @@ defined('MOODLE_INTERNAL') || die(); $plugin->component = 'mod_journal'; -$plugin->version = 2026082101; +$plugin->version = 2026101200; $plugin->requires = 2022041900; /* Moodle 4.0 */ -$plugin->supported = [400, 502]; /* Moodle 4.0 - 5.2 */ -$plugin->release = '5.2.2 (Build: 2026082101)'; +$plugin->supported = [400, 503]; /* Moodle 4.0 - 5.3 */ +$plugin->release = '5.3.0 (Build: 2026101200)'; $plugin->maturity = MATURITY_STABLE;