AutorÃa | Ultima modificación | Ver Log |
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
namespace tool_usertours\local\filter;
use context;
use tool_usertours\tour;
/**
* Access date filter. Used to determine if USER should see a tour based on a particular access date.
*
* @package tool_usertours
* @copyright 2019 Tom Dickman <tomdickman@catalyst-au.net>
* @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 [
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,
[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;
}
}