Proyectos de Subversion Moodle

Rev

Rev 1 | Mostrar el archivo completo | | | Autoría | Ultima modificación | Ver Log |

Rev 1 Rev 1441
Línea 16... Línea 16...
16
 
16
 
Línea 17... Línea 17...
17
declare(strict_types=1);
17
declare(strict_types=1);
Línea 18... Línea 18...
18
 
18
 
19
namespace core_reportbuilder\local\filters;
19
namespace core_reportbuilder\local\filters;
20
 
-
 
21
use DateTimeImmutable;
20
 
-
 
21
use core\{clock, di};
Línea 22... Línea 22...
22
use lang_string;
22
use core\lang_string;
23
use MoodleQuickForm;
23
use core_reportbuilder\local\helpers\database;
24
use core_reportbuilder\local\helpers\database;
24
use MoodleQuickForm;
25
 
25
 
Línea 68... Línea 68...
68
    public const DATE_BEFORE = 9;
68
    public const DATE_BEFORE = 9;
Línea 69... Línea 69...
69
 
69
 
70
    /** @var int Date after [X relative date unit(s)] */
70
    /** @var int Date after [X relative date unit(s)] */
Línea -... Línea 71...
-
 
71
    public const DATE_AFTER = 10;
-
 
72
 
-
 
73
    /** @var int Relative date unit for a minute */
71
    public const DATE_AFTER = 10;
74
    public const DATE_UNIT_MINUTE = 5;
72
 
75
 
Línea 73... Línea 76...
73
    /** @var int Relative date unit for an hour */
76
    /** @var int Relative date unit for an hour */
74
    public const DATE_UNIT_HOUR = 0;
77
    public const DATE_UNIT_HOUR = 0;
Línea 109... Línea 112...
109
    }
112
    }
Línea 110... Línea 113...
110
 
113
 
111
    /**
114
    /**
112
     * Setup form
115
     * Setup form
-
 
116
     *
-
 
117
     * Note that we cannot support float inputs in this filter currently, because decimals are not supported when calculating
-
 
118
     * relative timeframes according to {@link https://www.php.net/manual/en/datetime.formats.php}
113
     *
119
     *
114
     * @param MoodleQuickForm $mform
120
     * @param MoodleQuickForm $mform
115
     */
121
     */
116
    public function setup_form(MoodleQuickForm $mform): void {
122
    public function setup_form(MoodleQuickForm $mform): void {
117
        // Operator selector.
123
        // Operator selector.
Línea 132... Línea 138...
132
        $mform->hideIf("{$this->name}_value", "{$this->name}_operator", 'in', array_merge($typesnounit, [self::DATE_CURRENT]));
138
        $mform->hideIf("{$this->name}_value", "{$this->name}_operator", 'in', array_merge($typesnounit, [self::DATE_CURRENT]));
Línea 133... Línea 139...
133
 
139
 
134
        // Unit selector for last and next operators.
140
        // Unit selector for last and next operators.
135
        $unitlabel = get_string('filterfieldunit', 'core_reportbuilder', $this->get_header());
141
        $unitlabel = get_string('filterfieldunit', 'core_reportbuilder', $this->get_header());
-
 
142
        $units = [
136
        $units = [
143
            self::DATE_UNIT_MINUTE => get_string('filterdateminutes', 'core_reportbuilder'),
137
            self::DATE_UNIT_HOUR => get_string('filterdatehours', 'core_reportbuilder'),
144
            self::DATE_UNIT_HOUR => get_string('filterdatehours', 'core_reportbuilder'),
138
            self::DATE_UNIT_DAY => get_string('filterdatedays', 'core_reportbuilder'),
145
            self::DATE_UNIT_DAY => get_string('filterdatedays', 'core_reportbuilder'),
139
            self::DATE_UNIT_WEEK => get_string('filterdateweeks', 'core_reportbuilder'),
146
            self::DATE_UNIT_WEEK => get_string('filterdateweeks', 'core_reportbuilder'),
140
            self::DATE_UNIT_MONTH => get_string('filterdatemonths', 'core_reportbuilder'),
147
            self::DATE_UNIT_MONTH => get_string('filterdatemonths', 'core_reportbuilder'),
Línea 149... Línea 156...
149
        // Add operator/value/unit group.
156
        // Add operator/value/unit group.
150
        $mform->addGroup($elements, "{$this->name}_group", $this->get_header(), '', false)
157
        $mform->addGroup($elements, "{$this->name}_group", $this->get_header(), '', false)
151
            ->setHiddenLabel(true);
158
            ->setHiddenLabel(true);
Línea 152... Línea 159...
152
 
159
 
153
        // Date selectors for range operator.
160
        // Date selectors for range operator.
154
        $mform->addElement('date_selector', "{$this->name}_from", get_string('filterdatefrom', 'core_reportbuilder'),
161
        $mform->addElement('date_selector', "{$this->name}_from",
155
            ['optional' => true]);
162
            get_string('filterfieldfrom', 'core_reportbuilder', $this->get_header()), ['optional' => true]);
156
        $mform->setType("{$this->name}_from", PARAM_INT);
163
        $mform->setType("{$this->name}_from", PARAM_INT);
157
        $mform->setDefault("{$this->name}_from", 0);
164
        $mform->setDefault("{$this->name}_from", 0);
Línea 158... Línea 165...
158
        $mform->hideIf("{$this->name}_from", "{$this->name}_operator", 'neq', self::DATE_RANGE);
165
        $mform->hideIf("{$this->name}_from", "{$this->name}_operator", 'neq', self::DATE_RANGE);
159
 
166
 
160
        $mform->addElement('date_selector', "{$this->name}_to", get_string('filterdateto', 'core_reportbuilder'),
167
        $mform->addElement('date_selector', "{$this->name}_to",
161
            ['optional' => true]);
168
            get_string('filterfieldto', 'core_reportbuilder', $this->get_header()), ['optional' => true]);
162
        $mform->setType("{$this->name}_to", PARAM_INT);
169
        $mform->setType("{$this->name}_to", PARAM_INT);
163
        $mform->setDefault("{$this->name}_to", 0);
170
        $mform->setDefault("{$this->name}_to", 0);
Línea 241... Línea 248...
241
 
248
 
242
                break;
249
                break;
243
            case self::DATE_PAST:
250
            case self::DATE_PAST:
244
                $param = database::generate_param_name();
251
                $param = database::generate_param_name();
245
                $sql = "{$fieldsql} < :{$param}";
252
                $sql = "{$fieldsql} < :{$param}";
246
                $params[$param] = time();
253
                $params[$param] = di::get(clock::class)->time();
247
                break;
254
                break;
248
            case self::DATE_FUTURE:
255
            case self::DATE_FUTURE:
249
                $param = database::generate_param_name();
256
                $param = database::generate_param_name();
250
                $sql = "{$fieldsql} > :{$param}";
257
                $sql = "{$fieldsql} > :{$param}";
251
                $params[$param] = time();
258
                $params[$param] = di::get(clock::class)->time();
252
                break;
259
                break;
253
            default:
260
            default:
254
                // Invalid or inactive filter.
261
                // Invalid or inactive filter.
255
                return ['', []];
262
                return ['', []];
Línea 266... Línea 273...
266
     * @param int $dateunit One of the ::DATE_UNIT_* constants
273
     * @param int $dateunit One of the ::DATE_UNIT_* constants
267
     * @return int[] Timestamps representing the start/end of timeframe
274
     * @return int[] Timestamps representing the start/end of timeframe
268
     */
275
     */
269
    private static function get_relative_timeframe(int $operator, int $dateunitvalue, int $dateunit): array {
276
    private static function get_relative_timeframe(int $operator, int $dateunitvalue, int $dateunit): array {
270
        // Initialise start/end time to now.
277
        // Initialise start/end time to now.
271
        $datestart = $dateend = new DateTimeImmutable();
278
        $datestart = $dateend = di::get(clock::class)->now();
Línea 272... Línea 279...
272
 
279
 
-
 
280
        switch ($dateunit) {
-
 
281
            case self::DATE_UNIT_MINUTE:
-
 
282
                if ($operator === self::DATE_CURRENT) {
-
 
283
                    $hour = (int) $datestart->format('G');
-
 
284
                    $minute = (int) $datestart->format('i');
-
 
285
                    $datestart = $datestart->setTime($hour, $minute);
-
 
286
                    $dateend = $dateend->setTime($hour, $minute, 59);
-
 
287
                } else if ($operator === self::DATE_LAST) {
-
 
288
                    $datestart = $datestart->modify("-{$dateunitvalue} minute");
-
 
289
                } else if ($operator === self::DATE_NEXT) {
-
 
290
                    $dateend = $dateend->modify("+{$dateunitvalue} minute");
-
 
291
                }
273
        switch ($dateunit) {
292
                break;
274
            case self::DATE_UNIT_HOUR:
293
            case self::DATE_UNIT_HOUR:
275
                if ($operator === self::DATE_CURRENT) {
294
                if ($operator === self::DATE_CURRENT) {
276
                    $hour = (int) $datestart->format('G');
295
                    $hour = (int) $datestart->format('G');
277
                    $datestart = $datestart->setTime($hour, 0);
296
                    $datestart = $datestart->setTime($hour, 0);