From d8372b54b9f97ac1549212f80d09228a71e84804 Mon Sep 17 00:00:00 2001 From: Rajesh Taneja Date: Tue, 11 Jun 2013 10:58:52 +0800 Subject: [PATCH] MDL-16982 Administration: Moved bulk action outside loop and using profile api to save data --- admin/auth_config.php | 7 ++-- auth/ldap/auth.php | 7 ++-- lib/moodlelib.php | 79 ++++++++----------------------------------- 3 files changed, 23 insertions(+), 70 deletions(-) diff --git a/admin/auth_config.php b/admin/auth_config.php index f87870d5152..50bcfc97db8 100644 --- a/admin/auth_config.php +++ b/admin/auth_config.php @@ -117,6 +117,9 @@ function print_auth_lock_options($auth, $user_fields, $helptext, $retrieveopts, $user_fields = array_merge($user_fields, $customfields); } + if (!empty($customfields)) { + $customfieldname = $DB->get_records('user_info_field', null, '', 'shortname, name'); + } foreach ($user_fields as $field) { // Define some vars we'll work with. if (!isset($pluginconfig->{"field_map_$field"})) { @@ -143,7 +146,7 @@ function print_auth_lock_options($auth, $user_fields, $helptext, $retrieveopts, } elseif (!empty($customfields) && in_array($field, $customfields)) { // If custom field then pick name from database. $fieldshortname = str_replace('profile_field_', '', $fieldname); - $fieldname = $DB->get_field('user_info_field', 'name', array('shortname' => $fieldshortname)); + $fieldname = $customfieldname[$fieldshortname]->name; } else { $fieldname = get_string($fieldname); } @@ -180,4 +183,4 @@ function print_auth_lock_options($auth, $user_fields, $helptext, $retrieveopts, } echo ''; } -} \ No newline at end of file +} diff --git a/auth/ldap/auth.php b/auth/ldap/auth.php index 6b26a36a47a..314e5bed9b8 100644 --- a/auth/ldap/auth.php +++ b/auth/ldap/auth.php @@ -1163,12 +1163,13 @@ class auth_plugin_ldap extends auth_plugin_base { $profilefield = ''; // Only process if the moodle field ($key) has changed and we // are set to update LDAP with it + $customprofilefield = 'profile_field_' . $key; if (isset($olduser->$key) and isset($newuser->$key) and ($olduser->$key !== $newuser->$key)) { $profilefield = $key; - } else if (isset($olduser->{'profile_field_' . $key}) && isset($newuser->{'profile_field_' . $key}) - && $olduser->{'profile_field_' . $key} !== $newuser->{'profile_field_' . $key}) { - $profilefield = 'profile_field_' . $key; + } else if (isset($olduser->$customprofilefield) && isset($newuser->$customprofilefield) + && $olduser->$customprofilefield !== $newuser->$customprofilefield) { + $profilefield = $customprofilefield; } if (!empty($profilefield) && !empty($this->config->{'field_updateremote_' . $key})) { diff --git a/lib/moodlelib.php b/lib/moodlelib.php index dae404f5e03..0f8d0375ce7 100644 --- a/lib/moodlelib.php +++ b/lib/moodlelib.php @@ -3839,31 +3839,18 @@ function get_user_fieldnames() { */ function create_user_record($username, $password, $auth = 'manual') { global $CFG, $DB; - + require_once($CFG->dirroot."/user/profile/lib.php"); //just in case check text case $username = trim(textlib::strtolower($username)); $authplugin = get_auth_plugin($auth); - + $customfields = $authplugin->get_custom_user_profile_fields(); $newuser = new stdClass(); - $customfield = new stdClass(); if ($newinfo = $authplugin->get_userinfo($username)) { $newinfo = truncate_userinfo($newinfo); foreach ($newinfo as $key => $value){ - if (in_array($key, $authplugin->userfields)) { + if (in_array($key, $authplugin->userfields) || (in_array($key, $customfields))) { $newuser->$key = $value; - } else { - $customfields = $authplugin->get_custom_user_profile_fields(); - if (!empty($customfields) && in_array($key, $customfields)) { - $shortname = str_replace('profile_field_', '', $key); - $infofield = $DB->get_record('user_info_field', array('shortname' => $shortname)); - $data = $infofield->defaultdata; - if(strcmp($data, $value) !== 0) { - $customfield->$key = new stdClass(); - $customfield->$key->fieldid = $infofield->id; - $customfield->$key->data = $value; - } - } } } } @@ -3895,10 +3882,8 @@ function create_user_record($username, $password, $auth = 'manual') { $newuser->id = $DB->insert_record('user', $newuser); - foreach ($customfield as $key) { - $key->userid = $newuser->id; - $key->id = $DB->insert_record('user_info_data', $key); - } + // Save user profile data. + profile_save_data($newuser); $user = get_complete_user_data('id', $newuser->id); if (!empty($CFG->{'auth_'.$newuser->auth.'_forcechangepassword'})){ @@ -3923,7 +3908,7 @@ function create_user_record($username, $password, $auth = 'manual') { */ function update_user_record($username) { global $DB, $CFG; - + require_once($CFG->dirroot."/user/profile/lib.php"); $username = trim(textlib::strtolower($username)); /// just in case check text case $oldinfo = $DB->get_record('user', array('username'=>$username, 'mnethostid'=>$CFG->mnet_localhost_id), '*', MUST_EXIST); @@ -3954,50 +3939,10 @@ function update_user_record($username) { // in a value for the selected field _if LDAP is giving // nothing_ for this field. Thus it makes sense to let this value // stand in until LDAP is giving a value for this field. - if (!empty($value) && ($lockval === 'unlockedifempty')) { - if (in_array($key, $userauth->userfields)) { - if ((string)$oldinfo->$key !== (string)$value) { - $newuser[$key] = (string)$value; - } - } else if ($iscustom) { - $shortname = str_replace('profile_field_', '', $key); - $infofield = $DB->get_record('user_info_field', array('shortname' => $shortname)); - $data = $DB->get_field('user_info_data', 'data', array('userid' => $oldinfo->id, 'fieldid' => $infofield->id)); - // If there is no value in the user_info_data then use default value for comparison. - if ($data === false) { - $originalvalue = $infofield->defaultdata; - } else { - $originalvalue = $data; - } - // If passed value is different then original value then update/insert. - if (strcmp($originalvalue, $value) !== 0) { - $valid = true; - // Check to make sure that the value is a valid. - if (strcmp($info_field->datatype, 'menu') == 0) { - $validValues = explode("\n", $info_field->param1); - if (!in_array($value, $validValues)) { - $valid = false; - } - } else if(strcmp($info_field->datatype, 'checkbox') == 0) { - if ($value != 1 && $value != 0) { - $valid = false; - } - } - - // Insert/update if value is valid. - if ($valid) { - if ($data === false) { - $row = new stdClass(); - $row->userid = $oldinfo->id; - $row->fieldid = $infofield->id; - $row->data = $value; - $row->id = $DB->insert_record('user_info_data', $row); - } else { - $DB->set_field('user_info_data', 'data', $value, - array('userid' => $oldinfo->id, 'fieldid' => $infofield->id)); - } - } - } + if (!(empty($value) && $lockval === 'unlockedifempty')) { + if ($iscustom || (in_array($key, $userauth->userfields) && + ((string)$oldinfo->$key !== (string)$value))) { + $newuser[$key] = (string)$value; } } } @@ -4006,6 +3951,10 @@ function update_user_record($username) { $newuser['id'] = $oldinfo->id; $newuser['timemodified'] = time(); $DB->update_record('user', $newuser); + + // Save user profile data. + profile_save_data((object) $newuser); + // fetch full user record for the event, the complete user data contains too much info // and we want to be consistent with other places that trigger this event events_trigger('user_updated', $DB->get_record('user', array('id'=>$oldinfo->id)));