This commit is contained in:
Huong Nguyen
2025-12-03 10:26:20 +07:00
6 changed files with 87 additions and 40 deletions
+3
View File
@@ -324,13 +324,16 @@ class api {
$settings->tool_mobile_disabledfeatures = get_config('tool_mobile', 'disabledfeatures');
$settings->tool_mobile_filetypeexclusionlist = get_config('tool_mobile', 'filetypeexclusionlist');
$custommenuitems = get_config('tool_mobile', 'custommenuitems');
$customusermenuitems = get_config('tool_mobile', 'customusermenuitems');
// If filtering of the primary custom menu is enabled, apply only the string filters.
if (!empty($CFG->navfilter && !empty($CFG->stringfilters))) {
// Apply filters that are enabled for Content and Headings.
$filtermanager = \filter_manager::instance();
$custommenuitems = $filtermanager->filter_string($custommenuitems, \context_system::instance());
$customusermenuitems = $filtermanager->filter_string($customusermenuitems, \context_system::instance());
}
$settings->tool_mobile_custommenuitems = $custommenuitems;
$settings->tool_mobile_customusermenuitems = $customusermenuitems;
$settings->tool_mobile_apppolicy = get_config('tool_mobile', 'apppolicy');
// This setting could be not set in some edge cases such as bad upgrade.
$mintimereq = get_config('tool_mobile', 'autologinmintimebetweenreq');
@@ -121,12 +121,25 @@ class subscription implements \renderable, \templatable {
$custommenuitems = explode("\n", $els);
// Get unique custom menu urls.
$custommenuitems = array_flip(
array_map(function($val) {
array_map(function ($val) {
return explode('|', $val)[1];
}, $custommenuitems)
);
}
$feature['status'] = count($custommenuitems);
$customusermenuitems = [];
$els = rtrim($ms->customusermenuitems, "\n");
if (!empty($els)) {
$customusermenuitems = explode("\n", $els);
// Get unique custom menu urls.
$customusermenuitems = array_flip(
array_map(function ($val) {
return explode('|', $val)[1];
}, $customusermenuitems)
);
}
$feature['status'] = count($custommenuitems) + count($customusermenuitems);
break;
// Check language strings.
case 'customlanguagestrings':
@@ -45,8 +45,8 @@ $string['configmobilecssurl'] = 'A CSS file to customise your mobile app interfa
$string['customlangstrings'] = 'Custom language strings';
$string['customlangstrings_desc'] = 'Words and phrases displayed in the app can be customised here. Enter each custom language string on a new line with format: string identifier, custom language string and language code, separated by pipe characters. For example:
<pre>
mm.user.student|Learner|en
mm.user.student|Aprendiz|es
core.user.student|Learner|en
core.user.student|Aprendiz|es
</pre>
For a complete list of string identifiers, see the documentation.';
$string['custommenuitems'] = 'Custom menu items';
@@ -56,6 +56,20 @@ Link-opening methods are: app (for linking to an activity supported by the app),
When items are missing a translation for a given language, they will use other languages as fallback unless "_only" is appended to the language code.
For example:
<pre>
App help|https://someurl.xyz/help|inappbrowser
My grades|https://someurl.xyz/local/mygrades/index.php|embedded|en
Mis calificaciones|https://someurl.xyz/local/mygrades/index.php|embedded|es
You will only see this in English|https://someurl.xyz/english|browser|en_only
</pre>';
$string['customusermenuitems'] = 'Custom user menu items';
$string['customusermenuitems_desc'] = 'Additional items can be added to the app\'s user menu by specifying them here. Enter each custom user menu item on a new line with format: item text, link URL, link-opening method and language code (optional, for displaying the item to users of the specified language only), separated by pipe characters.
Link-opening methods are: app (for linking to an activity supported by the app), inappbrowser (for opening a link in a browser without leaving the app), browser (for opening the link in the device default browser outside the app) and embedded (for displaying the link in an iframe in a new page in the app).
When items are missing a translation for a given language, they will use other languages as fallback unless "_only" is appended to the language code.
For example:
<pre>
App help|https://someurl.xyz/help|inappbrowser
+19 -3
View File
@@ -230,9 +230,25 @@ if ($hassiteconfig) {
new lang_string('disabledfeatures', 'tool_mobile'),
new lang_string('disabledfeatures_desc', 'tool_mobile'), array(), $options));
$temp->add(new admin_setting_configtextarea('tool_mobile/custommenuitems',
new lang_string('custommenuitems', 'tool_mobile'),
new lang_string('custommenuitems_desc', 'tool_mobile'), '', PARAM_RAW, '50', '10'));
$temp->add(new admin_setting_configtextarea(
'tool_mobile/custommenuitems',
new lang_string('custommenuitems', 'tool_mobile'),
new lang_string('custommenuitems_desc', 'tool_mobile'),
'',
PARAM_RAW,
'50',
'10',
));
$temp->add(new admin_setting_configtextarea(
'tool_mobile/customusermenuitems',
new lang_string('customusermenuitems', 'tool_mobile'),
new lang_string('customusermenuitems_desc', 'tool_mobile'),
'',
PARAM_RAW,
'50',
'10',
));
// File type exclusionlist.
$choices = [];
@@ -194,38 +194,39 @@ final class externallib_test extends \core_external\tests\externallib_testcase {
// Test default values.
$context = \context_system::instance();
$expected = array(
array('name' => 'fullname', 'value' => $SITE->fullname),
array('name' => 'shortname', 'value' => $SITE->shortname),
array('name' => 'summary', 'value' => $sitesummary),
array('name' => 'summaryformat', 'value' => $summaryformat),
array('name' => 'frontpage', 'value' => $CFG->frontpage),
array('name' => 'frontpageloggedin', 'value' => $CFG->frontpageloggedin),
array('name' => 'maxcategorydepth', 'value' => $CFG->maxcategorydepth),
array('name' => 'frontpagecourselimit', 'value' => $CFG->frontpagecourselimit),
array('name' => 'numsections', 'value' => course_get_format($SITE)->get_last_section_number()),
array('name' => 'newsitems', 'value' => $SITE->newsitems),
array('name' => 'commentsperpage', 'value' => $CFG->commentsperpage),
array('name' => 'sitepolicy', 'value' => $mysitepolicy),
array('name' => 'sitepolicyhandler', 'value' => ''),
array('name' => 'disableuserimages', 'value' => $CFG->disableuserimages),
array('name' => 'mygradesurl', 'value' => user_mygrades_url()->out(false)),
array('name' => 'tool_mobile_forcelogout', 'value' => 0),
array('name' => 'tool_mobile_customlangstrings', 'value' => ''),
array('name' => 'tool_mobile_disabledfeatures', 'value' => ''),
array('name' => 'tool_mobile_filetypeexclusionlist', 'value' => ''),
array('name' => 'tool_mobile_custommenuitems', 'value' => ''),
array('name' => 'tool_mobile_apppolicy', 'value' => ''),
array('name' => 'tool_mobile_autologinmintimebetweenreq', 'value' => 6 * MINSECS),
array('name' => 'tool_mobile_autologout', 'value' => get_config('tool_mobile', 'autologout')),
array('name' => 'tool_mobile_autologouttime', 'value' => get_config('tool_mobile', 'autologouttime')),
array('name' => 'calendartype', 'value' => $CFG->calendartype),
array('name' => 'calendar_site_timeformat', 'value' => $CFG->calendar_site_timeformat),
array('name' => 'calendar_startwday', 'value' => $CFG->calendar_startwday),
array('name' => 'calendar_adminseesall', 'value' => $CFG->calendar_adminseesall),
array('name' => 'calendar_lookahead', 'value' => $CFG->calendar_lookahead),
array('name' => 'calendar_maxevents', 'value' => $CFG->calendar_maxevents),
);
$expected = [
[ 'name' => 'fullname', 'value' => $SITE->fullname ],
[ 'name' => 'shortname', 'value' => $SITE->shortname ],
[ 'name' => 'summary', 'value' => $sitesummary ],
[ 'name' => 'summaryformat', 'value' => $summaryformat ],
[ 'name' => 'frontpage', 'value' => $CFG->frontpage ],
[ 'name' => 'frontpageloggedin', 'value' => $CFG->frontpageloggedin ],
[ 'name' => 'maxcategorydepth', 'value' => $CFG->maxcategorydepth ],
[ 'name' => 'frontpagecourselimit', 'value' => $CFG->frontpagecourselimit ],
[ 'name' => 'numsections', 'value' => course_get_format($SITE)->get_last_section_number() ],
[ 'name' => 'newsitems', 'value' => $SITE->newsitems ],
[ 'name' => 'commentsperpage', 'value' => $CFG->commentsperpage ],
[ 'name' => 'sitepolicy', 'value' => $mysitepolicy ],
[ 'name' => 'sitepolicyhandler', 'value' => '' ],
[ 'name' => 'disableuserimages', 'value' => $CFG->disableuserimages ],
[ 'name' => 'mygradesurl', 'value' => user_mygrades_url()->out(false) ],
[ 'name' => 'tool_mobile_forcelogout', 'value' => 0 ],
[ 'name' => 'tool_mobile_customlangstrings', 'value' => '' ],
[ 'name' => 'tool_mobile_disabledfeatures', 'value' => '' ],
[ 'name' => 'tool_mobile_filetypeexclusionlist', 'value' => '' ],
[ 'name' => 'tool_mobile_custommenuitems', 'value' => '' ],
[ 'name' => 'tool_mobile_customusermenuitems', 'value' => '' ],
[ 'name' => 'tool_mobile_apppolicy', 'value' => '' ],
[ 'name' => 'tool_mobile_autologinmintimebetweenreq', 'value' => 6 * MINSECS ],
[ 'name' => 'tool_mobile_autologout', 'value' => get_config('tool_mobile', 'autologout') ],
[ 'name' => 'tool_mobile_autologouttime', 'value' => get_config('tool_mobile', 'autologouttime') ],
[ 'name' => 'calendartype', 'value' => $CFG->calendartype ],
[ 'name' => 'calendar_site_timeformat', 'value' => $CFG->calendar_site_timeformat ],
[ 'name' => 'calendar_startwday', 'value' => $CFG->calendar_startwday ],
[ 'name' => 'calendar_adminseesall', 'value' => $CFG->calendar_adminseesall ],
[ 'name' => 'calendar_lookahead', 'value' => $CFG->calendar_lookahead ],
[ 'name' => 'calendar_maxevents', 'value' => $CFG->calendar_maxevents ],
];
$colornumbers = range(1, 10);
foreach ($colornumbers as $number) {
$expected[] = [
+1 -1
View File
@@ -23,7 +23,7 @@
*/
defined('MOODLE_INTERNAL') || die();
$plugin->version = 2025100600; // The current plugin version (Date: YYYYMMDDXX).
$plugin->version = 2025102200; // The current plugin version (Date: YYYYMMDDXX).
$plugin->requires = 2025092600; // Requires this Moodle version.
$plugin->component = 'tool_mobile'; // Full name of the plugin (used for diagnostics).
$plugin->dependencies = [