From e552c467adc84e8e3ff48a27f2e342aeee1ce1ed Mon Sep 17 00:00:00 2001 From: petermAprende <68866421+petermAprende@users.noreply.github.com> Date: Tue, 29 Sep 2020 20:07:23 -0400 Subject: [PATCH] New {UserFirstaccess} FilterCode (#115) * New tag (user->firstaccess) + datetime tags now take strftime * Added info to README --- .filter.php.swp | Bin 0 -> 16384 bytes README.md | 14 ++++++++ filter.php | 83 ++++++++++++++++++++++++++++++++++++++++-------- 3 files changed, 83 insertions(+), 14 deletions(-) create mode 100644 .filter.php.swp diff --git a/.filter.php.swp b/.filter.php.swp new file mode 100644 index 0000000000000000000000000000000000000000..d84e11883586e0374ca5f0ebe0de314fa9247063 GIT binary patch literal 16384 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 html tag containing the user's profile picture. X indicates the size and can be **sm** (small), **md** (medium) or **lg** (large). If the user does not have profile picture or is logged out, the default faceless profile photo will be used instead. * {usercount} : Count total number of registered users on the site. Does not included deleted users, primary admin or guest. +* {userfirstaccess} : Date that the user first accessd the site * {usersactive} : Count total number of registered users on the site. Does not included deleted users, disabled users, primary admin or guest. * {usersonline} : Total number of users who were online in the last 5 minutes. * {siteyear} : 4-digit current year. @@ -227,6 +228,19 @@ The {langx fr-CA}{/langx} filter will convert this into the following HTML Contenu +Date strftime Arguments + +The 4 datetime codes can optionally take a strftime string to define the format. This string must be enclosed with double quotes. + +* {userfirstaccess} +* {coursestartdate} +* {courseenddate} +* {coursecompletiondate} + +Example: + + {userfirstaccess "%m/%d/%Y, %H:%M:%S"} + ## FilterCodes in a custom menu Here are a couple of examples of how to create really useful custom menus using FilterCodes. Just copy and paste the code into the **Custom menu items** field (Site administration > Appearance > Theme settings) diff --git a/filter.php b/filter.php index f5ef948..20d3ee4 100644 --- a/filter.php +++ b/filter.php @@ -598,6 +598,28 @@ function ($matches) { } } + // Tag: {userfirstaccess} or {userfirstaccess "strftime"} + if (stripos($text, '{userfirstaccess') !== false) { + if (isloggedin() && !isguestuser()) { + $user = $DB->get_record('user', array('id' => $USER->id), 'firstaccess', MUST_EXIST); + $newtext = preg_replace_callback('/{userfirstaccess(\s+"(.*)")?}/i', + function($matches) use ($user) { + if(sizeof($matches) == 1 && $matches[0] == "{userfirstaccess}"){ + return userdate($user->firstaccess, get_string('strftimedatefullshort')); + }else if(sizeof($matches) == 3){ + return userdate($user->firstaccess, $matches[2]); + } + }, $text); + if ($newtext !== false) { + $text = $newtext; + $changed = true; + } + unset($user); + } else { + $replace['/\{userfirstaccess(\s+"(.*)")?\}/i'] = get_string('none'); + } + } + // Tag: {usercount}. if (stripos($text, '{usercount}') !== false) { // Count total number of current users on the site. @@ -765,45 +787,78 @@ function ($matches) { $replace['/\{courseimage\}/i'] = ''; } - // Tag: {coursestartdate}. The course start date. - if (stripos($text, '{coursestartdate}') !== false) { + // Tag: {coursestartdate} or {coursestartdate "strftime"}. The course start date. + if (stripos($text, '{coursestartdate') !== false) { if (empty($PAGE->course->startdate)) { $PAGE->course->startdate = $DB->get_field_select('course', 'startdate', 'id = :id', ['id' => $course->id]); } if ($PAGE->course->startdate > 0) { - $replace['/\{coursestartdate\}/i'] = userdate($PAGE->course->startdate, get_string('strftimedatefullshort')); + $newtext = preg_replace_callback('/{coursestartdate(\s+"(.*)")?}/i', + function($matches) use ($PAGE) { + if(sizeof($matches) == 1 && $matches[0] == "{coursestartdate}"){ + return userdate($PAGE->course->startdate, get_string('strftimedatefullshort')); + }else if(sizeof($matches) == 3){ + return userdate($PAGE->course->startdate, $matches[2]); + } + }, $text); + if ($newtext !== false) { + $text = $newtext; + $changed = true; + } } else { - $replace['/\{coursestartdate\}/i'] = get_string('none'); + $replace['/\{coursestartdate(\s+"(.*)")?\}/i'] = get_string('none'); } } - // Tag: {courseenddate}. The course end date. - if (stripos($text, '{courseenddate}') !== false) { + // Tag: {courseenddate} or {coursesenddate "strftime"}. The course end date. + if (stripos($text, '{courseenddate') !== false) { if (empty($PAGE->course->enddate)) { $PAGE->course->enddate = $DB->get_field_select('course', 'enddate', 'id = :id', ['id' => $course->id]); } if ($PAGE->course->enddate > 0) { - $replace['/\{courseenddate\}/i'] = userdate($PAGE->course->enddate, get_string('strftimedatefullshort')); + $newtext = preg_replace_callback('/{courseenddate(\s+"(.*)")?}/i', + function($matches) use ($PAGE) { + if(sizeof($matches) == 1 && $matches[0] == "{courseenddate}"){ + return userdate($PAGE->course->enddate, get_string('strftimedatefullshort')); + }else if(sizeof($matches) == 3){ + return userdate($PAGE->course->enddate, $matches[2]); + } + }, $text); + if ($newtext !== false) { + $text = $newtext; + $changed = true; + } } else { - $replace['/\{courseenddate\}/i'] = get_string('none'); + $replace['/\{courseenddate(\s+"(.*)")?\}/i'] = get_string('none'); } } - // Tag: {coursecompletiondate}. The course completion date. - if (stripos($text, '{coursecompletiondate}') !== false) { + + // Tag: {coursecompletiondate} or {coursecompletiondate "strftime"}. The course completion date. + if (stripos($text, '{coursecompletiondate') !== false) { if ($PAGE->course && isset($CFG->enablecompletion) && $CFG->enablecompletion == COMPLETION_ENABLED && $PAGE->course->enablecompletion) { $ccompletion = new completion_completion(['userid' => $USER->id, 'course' => $PAGE->course->id]); if ($ccompletion->timecompleted) { - $replace['/\{coursecompletiondate\}/i'] = userdate($ccompletion->timecompleted, - get_string('strftimedatefullshort')); + $newtext = preg_replace_callback('/{coursecompletiondate(\s+"(.*)")?}/i', + function($matches) use ($ccompletion) { + if(sizeof($matches) == 1 && $matches[0] == "{coursecompletiondate}"){ + return userdate($ccompletion->timecompleted, get_string('strftimedatefullshort')); + }else if(sizeof($matches) == 3){ + return userdate($ccompletion->timecompleted, $matches[2]); + } + }, $text); + if ($newtext !== false) { + $text = $newtext; + $changed = true; + } } else { - $replace['/\{coursecompletiondate\}/i'] = get_string('notcompleted', 'completion'); + $replace['/\{coursecompletiondate(\s+"(.*)")?\}/i'] = get_string('notcompleted', 'completion'); } } else { - $replace['/\{coursecompletiondate\}/i'] = get_string('completionnotenabled', 'completion'); + $replace['/\{coursecompletiondate(\s+"(.*)")?\}/i'] = get_string('completionnotenabled', 'completion'); } }