4af410237832aad5482938673b477c1222aef07c
[moodle.git] / user / edit.php
1 <?php // $Id$
3     require_once('../config.php');
4     require_once($CFG->libdir.'/gdlib.php');
5     require_once($CFG->dirroot.'/user/edit_form.php');
6     require_once($CFG->dirroot.'/user/editlib.php');
7     require_once($CFG->dirroot.'/user/profile/lib.php');
9     httpsrequired();
11     $userid = optional_param('id', $USER->id, PARAM_INT);    // user id
12     $course = optional_param('course', SITEID, PARAM_INT);   // course id (defaults to Site)
13     $cancelemailchange = optional_param('cancelemailchange', false, PARAM_INT);   // course id (defaults to Site)
15     if (!$course = $DB->get_record('course', array('id'=>$course))) {
16         print_error('invalidcourseid');
17     }
19     if ($course->id != SITEID) {
20         require_login($course);
21     } else if (!isloggedin()) {
22         if (empty($SESSION->wantsurl)) {
23             $SESSION->wantsurl = $CFG->httpswwwroot.'/user/edit.php';
24         }
25         redirect($CFG->httpswwwroot.'/login/index.php');
26     }
28     // Guest can not edit
29     if (isguestuser()) {
30         print_error('guestnoeditprofile');
31     }
33     // The user profile we are editing
34     if (!$user = $DB->get_record('user', array('id'=>$userid))) {
35         print_error('invaliduserid');
36     }
38     // Guest can not be edited
39     if (isguestuser($user)) {
40         print_error('guestnoeditprofile');
41     }
43     // User interests separated by commas
44     if (!empty($CFG->usetags)) {
45         require_once($CFG->dirroot.'/tag/lib.php');
46         $user->interests = tag_get_tags_csv('user', $user->id, TAG_RETURN_TEXT);
47     }
49     // remote users cannot be edited
50     if (is_mnet_remote_user($user)) {
51         redirect($CFG->wwwroot . "/user/view.php?course={$course->id}");
52     }
54     if ($course->id == SITEID) {
55         $coursecontext = get_context_instance(CONTEXT_SYSTEM);   // SYSTEM context
56     } else {
57         $coursecontext = get_context_instance(CONTEXT_COURSE, $course->id);   // Course context
58     }
59     $systemcontext   = get_context_instance(CONTEXT_SYSTEM);
60     $personalcontext = get_context_instance(CONTEXT_USER, $user->id);
62     // check access control
63     if ($user->id == $USER->id) {
64         //editing own profile - require_login() MUST NOT be used here, it would result in infinite loop!
65         if (!has_capability('moodle/user:editownprofile', $systemcontext)) {
66             print_error('cannotedityourprofile');
67         }
69     } else {
70         // teachers, parents, etc.
71         require_capability('moodle/user:editprofile', $personalcontext);
72         // no editing of guest user account
73         if (isguestuser($user->id)) {
74             print_error('guestnoeditprofileother');
75         }
76         // no editing of primary admin!
77         if (is_primary_admin($user->id)) {
78             print_error('adminprimarynoedit');
79         }
80     }
82     if ($user->deleted) {
83         print_header();
84         print_heading(get_string('userdeleted'));
85         print_footer($course);
86         die;
87     }
89     // Process email change cancellation
90     if ($cancelemailchange) {
91         cancel_email_update($user->id);
92     }
94     //load user preferences
95     useredit_load_preferences($user);
97     //Load custom profile fields data
98     profile_load_data($user);
101     //create form
102     $userform = new user_edit_form();
103     $userform->set_data($user);
105     $email_changed = false;
107     if ($usernew = $userform->get_data()) {
109         add_to_log($course->id, 'user', 'update', "view.php?id=$user->id&course=$course->id", '');
111         $email_changed_html = '';
113         if ($CFG->emailchangeconfirmation) {
114             // Handle change of email carefully for non-trusted users
115             if ($user->email != $usernew->email && !has_capability('moodle/user:update', $systemcontext)) {
116                 $a = new stdClass();
117                 $a->newemail = $usernew->preference_newemail = $usernew->email;
118                 $usernew->preference_newemailkey = random_string(20);
119                 $usernew->preference_newemailattemptsleft = 3;
120                 $a->oldemail = $usernew->email = $user->email;
122                 $email_changed_html = print_box(get_string('auth_changingemailaddress', 'auth', $a), 'generalbox', 'notice', true);
123                 $email_changed_html .= print_continue("$CFG->wwwroot/user/view.php?id=$user->id&amp;course=$course->id", true);
124                 $email_changed = true;
125             }
126         }
128         $authplugin = get_auth_plugin($user->auth);
130         $usernew->timemodified = time();
132         if (!$DB->update_record('user', $usernew)) {
133             print_error('cannotupdateprofile');
134         }
136         // pass a true $userold here
137         if (! $authplugin->user_update($user, $userform->get_data())) {
138             // auth update failed, rollback for moodle
139             $DB->update_record('user', $user);
140             print_error('cannotupdateprofile');
141         }
143         //update preferences
144         useredit_update_user_preference($usernew);
146         //update interests
147         if (!empty($CFG->usetags)) {
148             useredit_update_interests($usernew, $usernew->interests);
149         }
151         //update user picture
152         if (!empty($CFG->gdversion) and empty($CFG->disableuserimages)) {
153             useredit_update_picture($usernew, $userform);
154         }
156         // update mail bounces
157         useredit_update_bounces($user, $usernew);
159         /// update forum track preference
160         useredit_update_trackforums($user, $usernew);
162         // save custom profile fields data
163         profile_save_data($usernew);
165         // If email was changed, send confirmation email now
166         if ($email_changed && $CFG->emailchangeconfirmation) {
167             $temp_user = fullclone($user);
168             $temp_user->email = $usernew->preference_newemail;
170             $a = new stdClass();
171             $a->url = $CFG->wwwroot . '/user/emailupdate.php?key=' . $usernew->preference_newemailkey . '&id=' . $user->id;
172             $a->site = $SITE->fullname;
173             $a->fullname = fullname($user, true);
175             $emailupdatemessage = get_string('auth_emailupdatemessage', 'auth', $a);
176             $emailupdatetitle = get_string('auth_emailupdatetitle', 'auth', $a);
178             if(!$mail_results = email_to_user($temp_user, get_admin(), $emailupdatetitle, $emailupdatemessage)) {
179                 die("could not send email!");
180             }
181         }
183         // reload from db
184         $usernew = $DB->get_record('user', array('id'=>$user->id));
185         events_trigger('user_updated', $usernew);
187         if ($USER->id == $user->id) {
188             // Override old $USER session variable if needed
189             foreach ((array)$usernew as $variable => $value) {
190                 $USER->$variable = $value;
191             }
192         }
194         if (!$email_changed || !$CFG->emailchangeconfirmation) {
195             redirect("$CFG->wwwroot/user/view.php?id=$user->id&course=$course->id");
196         }
197     }
200 /// Display page header
201     $streditmyprofile = get_string('editmyprofile');
202     $strparticipants  = get_string('participants');
203     $userfullname     = fullname($user, true);
205     $navlinks = array();
206     if (has_capability('moodle/course:viewparticipants', $coursecontext) || has_capability('moodle/site:viewparticipants', $systemcontext)) {
207         $navlinks[] = array('name' => $strparticipants, 'link' => "index.php?id=$course->id", 'type' => 'misc');
208     }
209     $navlinks[] = array('name' => $userfullname,
210                         'link' => "view.php?id=$user->id&amp;course=$course->id",
211                         'type' => 'misc');
212     $navlinks[] = array('name' => $streditmyprofile, 'link' => null, 'type' => 'misc');
213     $navigation = build_navigation($navlinks);
214     print_header("$course->shortname: $streditmyprofile", $course->fullname, $navigation, "");
216     /// Print tabs at the top
217     $showroles = 1;
218     $currenttab = 'editprofile';
219     require('tabs.php');
221     if ($email_changed) {
222         echo $email_changed_html;
223     } else {
224     /// Finally display THE form
225         $userform->display();
226     }
228 /// and proper footer
229     print_footer($course);
231 ?>