. /** * Access Date filter. * * @package tool_usertours * @copyright 2019 Tom Dickman * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ namespace tool_usertours\local\filter; defined('MOODLE_INTERNAL') || die(); use context; use tool_usertours\tour; /** * Access date filter. Used to determine if USER should see a tour based on a particular access date. * * @copyright 2019 Tom Dickman * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class accessdate extends base { /** * Access date filtering constant for setting base date as account creation date. */ const FILTER_ACCOUNT_CREATION = 'tool_usertours_accountcreation'; /** * Access date filtering constant for setting base date as account first login date. */ const FILTER_FIRST_LOGIN = 'tool_usertours_firstlogin'; /** * Access date filtering constant for setting base date as account last login date. */ const FILTER_LAST_LOGIN = 'tool_usertours_lastlogin'; /** * Default this filter to not be enabled. */ const FILTER_ENABLED_DEFAULT = 0; /** * The name of the filter. * * @return string */ public static function get_filter_name() { return 'accessdate'; } /** * Retrieve the list of available filter options. * * @return array An array whose keys are the valid options * And whose values are the values to display * @throws \coding_exception */ public static function get_filter_options() { return array( self::FILTER_ACCOUNT_CREATION => get_string('filter_date_account_creation', 'tool_usertours'), self::FILTER_FIRST_LOGIN => get_string('filter_date_first_login', 'tool_usertours'), self::FILTER_LAST_LOGIN => get_string('filter_date_last_login', 'tool_usertours'), ); } /** * Add the form elements for the filter to the supplied form. * * @param \MoodleQuickForm $mform The form to add filter settings to. * * @throws \coding_exception */ public static function add_filter_to_form(\MoodleQuickForm &$mform) { $filtername = static::get_filter_name(); $key = "filter_{$filtername}"; $range = "{$key}_range"; $enabled = "{$key}_enabled"; $mform->addElement('advcheckbox', $enabled, get_string($key, 'tool_usertours'), get_string('filter_accessdate_enabled', 'tool_usertours'), null, array(0, 1)); $mform->addHelpButton($enabled, $enabled, 'tool_usertours'); $mform->addElement('select', $key, ' ', self::get_filter_options()); $mform->setDefault($key, self::FILTER_ACCOUNT_CREATION); $mform->hideIf($key, $enabled, 'notchecked'); $mform->addElement('duration', $range, null, [ 'optional' => false, 'defaultunit' => DAYSECS, ]); $mform->setDefault($range, 90 * DAYSECS); $mform->hideIf($range, $enabled, 'notchecked'); } /** * Prepare the filter values for the form. * * @param tour $tour The tour to prepare values from * @param stdClass $data The data value * @return stdClass */ public static function prepare_filter_values_for_form(tour $tour, \stdClass $data) { $filtername = static::get_filter_name(); $key = "filter_{$filtername}"; $range = "{$key}_range"; $enabled = "{$key}_enabled"; $values = $tour->get_filter_values($filtername); // Prepare the advanced checkbox value and prepare filter values based on previously set values. if (!empty($values)) { $data->$enabled = $values->$enabled ? $values->$enabled : self::FILTER_ENABLED_DEFAULT; if ($data->$enabled) { if (isset($values->$key)) { $data->$key = $values->$key; } if (isset($values->$range)) { $data->$range = $values->$range; } } } else { $data->$enabled = self::FILTER_ENABLED_DEFAULT; } return $data; } /** * Save the filter values from the form to the tour. * * @param tour $tour The tour to save values to * @param \stdClass $data The data submitted in the form */ public static function save_filter_values_from_form(tour $tour, \stdClass $data) { $filtername = static::get_filter_name(); $key = "filter_{$filtername}"; $range = "{$key}_range"; $enabled = "{$key}_enabled"; $savedata = []; $savedata[$key] = $data->$key; $savedata[$range] = $data->$range; $savedata[$enabled] = $data->$enabled; $tour->set_filter_values($filtername, $savedata); } /** * Check whether the filter matches the specified tour and/or context. * * @param tour $tour The tour to check * @param context $context The context to check * @return boolean */ public static function filter_matches(tour $tour, context $context) { global $USER; $filtername = static::get_filter_name(); $key = "filter_{$filtername}"; $range = "{$key}_range"; $enabled = "{$key}_enabled"; // Default behaviour is to match filter. $result = true; $values = (array) $tour->get_filter_values(self::get_filter_name()); // If the access date filter is not enabled, end here. if (empty($values[$enabled])) { return $result; } if (!empty($values[$key])) { switch ($values[$key]) { case (self::FILTER_ACCOUNT_CREATION): $filterbasedate = (int) $USER->timecreated; break; case (self::FILTER_FIRST_LOGIN): $filterbasedate = (int) $USER->firstaccess; break; case (self::FILTER_LAST_LOGIN): $filterbasedate = (int) $USER->lastlogin; break; default: // Use account creation as default. $filterbasedate = (int) $USER->timecreated; break; } // If the base date has no value because a user hasn't accessed Moodle yet, default to account creation. if (empty($filterbasedate)) { $filterbasedate = (int) $USER->timecreated; } if (!empty($values[$range])) { $filterrange = (int) $values[$range]; } else { $filterrange = 90 * DAYSECS; } // If we're outside the set range from the set base date, filter out tour. if ((time() > ($filterbasedate + $filterrange))) { $result = false; } } return $result; } }