Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
<?php
2
// This file is part of Moodle - http://moodle.org/
3
//
4
// Moodle is free software: you can redistribute it and/or modify
5
// it under the terms of the GNU General Public License as published by
6
// the Free Software Foundation, either version 3 of the License, or
7
// (at your option) any later version.
8
//
9
// Moodle is distributed in the hope that it will be useful,
10
// but WITHOUT ANY WARRANTY; without even the implied warranty of
11
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
// GNU General Public License for more details.
13
//
14
// You should have received a copy of the GNU General Public License
15
// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
16
 
17
/**
18
 * This file contains the datetime profile field definition class.
19
 *
20
 * @package profilefield_datetime
21
 * @copyright 2010 Mark Nelson <markn@moodle.com>
22
 * @license http://www.gnu.org/copyleft/gpl.html GNU Public License
23
 */
24
 
25
/**
26
 * Define datetime fields.
27
 *
28
 * @copyright 2010 Mark Nelson <markn@moodle.com>
29
 * @license http://www.gnu.org/copyleft/gpl.html GNU Public License
30
 */
31
class profile_define_datetime extends profile_define_base {
32
 
33
    /**
34
     * Define the setting for a datetime custom field.
35
     *
36
     * @param moodleform $form the user form
37
     */
38
    public function define_form_specific($form) {
39
        // Get the current calendar in use - see MDL-18375.
40
        $calendartype = \core_calendar\type_factory::get_calendar_instance();
41
 
42
        // Create variables to store start and end.
43
        list($year, $month, $day) = explode('_', date('Y_m_d'));
44
        $currentdate = $calendartype->convert_from_gregorian($year, $month, $day);
45
        $currentyear = $currentdate['year'];
46
 
47
        $arryears = $calendartype->get_years();
48
 
49
        // Add elements.
50
        $form->addElement('select', 'param1', get_string('startyear', 'profilefield_datetime'), $arryears);
51
        $form->setType('param1', PARAM_INT);
52
        $form->setDefault('param1', $currentyear);
53
 
54
        $form->addElement('select', 'param2', get_string('endyear', 'profilefield_datetime'), $arryears);
55
        $form->setType('param2', PARAM_INT);
56
        $form->setDefault('param2', $currentyear);
57
 
58
        $form->addElement('checkbox', 'param3', get_string('wanttime', 'profilefield_datetime'));
59
        $form->setType('param3', PARAM_INT);
60
 
61
        $form->addElement('hidden', 'startday', '1');
62
        $form->setType('startday', PARAM_INT);
63
        $form->addElement('hidden', 'startmonth', '1');
64
        $form->setType('startmonth', PARAM_INT);
65
        $form->addElement('hidden', 'startyear', '1');
66
        $form->setType('startyear', PARAM_INT);
67
        $form->addElement('hidden', 'endday', '1');
68
        $form->setType('endday', PARAM_INT);
69
        $form->addElement('hidden', 'endmonth', '1');
70
        $form->setType('endmonth', PARAM_INT);
71
        $form->addElement('hidden', 'endyear', '1');
72
        $form->setType('endyear', PARAM_INT);
73
        $form->addElement('hidden', 'defaultdata', '0');
74
        $form->setType('defaultdata', PARAM_INT);
75
    }
76
 
77
    /**
78
     * Validate the data from the profile field form.
79
     *
80
     * @param stdClass $data from the add/edit profile field form
81
     * @param array $files
82
     * @return array associative array of error messages
83
     */
84
    public function define_validate_specific($data, $files) {
85
        $errors = array();
86
 
87
        // Make sure the start year is not greater than the end year.
88
        if ($data->param1 > $data->param2) {
89
            $errors['param1'] = get_string('startyearafterend', 'profilefield_datetime');
90
        }
91
 
92
        return $errors;
93
    }
94
 
95
    /**
96
     * Alter form based on submitted or existing data.
97
     *
98
     * @param moodleform $mform
99
     */
100
    public function define_after_data(&$mform) {
101
        global $DB;
102
 
103
        // If we are adding a new profile field then the dates have already been set
104
        // by setDefault to the correct dates in the used calendar system. We only want
105
        // to execute the rest of the code when we have the years in the DB saved in
106
        // Gregorian that need converting to the date for this user.
107
        $id = optional_param('id', 0, PARAM_INT);
108
        if ($id === 0) {
109
            return;
110
        }
111
 
112
        // Get the field data from the DB.
113
        $field = $DB->get_record('user_info_field', array('id' => $id), 'param1, param2', MUST_EXIST);
114
 
115
        // Get the current calendar in use - see MDL-18375.
116
        $calendartype = \core_calendar\type_factory::get_calendar_instance();
117
 
118
        // An array to store form values.
119
        $values = array();
120
 
121
        // The start and end year will be set as a Gregorian year in the DB. We want
122
        // convert these to the equivalent year in the current calendar type being used.
123
        $startdate = $calendartype->convert_from_gregorian($field->param1, 1, 1);
124
        $values['startday'] = $startdate['day'];
125
        $values['startmonth'] = $startdate['month'];
126
        $values['startyear'] = $startdate['year'];
127
        $values['param1'] = $startdate['year'];
128
 
129
        $stopdate = $calendartype->convert_from_gregorian($field->param2, 1, 1);
130
        $values['endday'] = $stopdate['day'];
131
        $values['endmonth'] = $stopdate['month'];
132
        $values['endyear'] = $stopdate['year'];
133
        $values['param2'] = $stopdate['year'];
134
 
135
        // Set the values.
136
        foreach ($values as $key => $value) {
137
            $param = $mform->getElement($key);
138
            $param->setValue($value);
139
        }
140
    }
141
 
142
    /**
143
     * Preprocess data from the profile field form before
144
     * it is saved.
145
     *
146
     * @param stdClass $data from the add/edit profile field form
147
     * @return stdClass processed data object
148
     */
149
    public function define_save_preprocess($data) {
150
        // Get the current calendar in use - see MDL-18375.
151
        $calendartype = \core_calendar\type_factory::get_calendar_instance();
152
 
153
        // Check if the start year was changed, if it was then convert from the start of that year.
154
        if ($data->param1 != $data->startyear) {
155
            $startdate = $calendartype->convert_to_gregorian($data->param1, 1, 1);
156
        } else {
157
            $startdate = $calendartype->convert_to_gregorian($data->param1, $data->startmonth, $data->startday);
158
        }
159
 
160
        // Check if the end year was changed, if it was then convert from the start of that year.
161
        if ($data->param2 != $data->endyear) {
162
            $stopdate = $calendartype->convert_to_gregorian($data->param2, 1, 1);
163
        } else {
164
            $stopdate = $calendartype->convert_to_gregorian($data->param2, $data->endmonth, $data->endday);
165
        }
166
 
167
        $data->param1 = $startdate['year'];
168
        $data->param2 = $stopdate['year'];
169
 
170
        if (empty($data->param3)) {
171
            $data->param3 = null;
172
        }
173
 
174
        // No valid value in the default data column needed.
175
        $data->defaultdata = '0';
176
 
177
        return $data;
178
    }
179
}