diff --git a/classes/profilecohort.php b/classes/profilecohort.php index a8b519a..b5af158 100644 --- a/classes/profilecohort.php +++ b/classes/profilecohort.php @@ -300,7 +300,13 @@ public function update_all_cohorts_from_rules() { $fieldsql = []; foreach ($fieldids as $fieldid) { - $fieldsql[] = "(SELECT data FROM {user_info_data} WHERE fieldid = {$fieldid} AND userid = u.id) AS field_{$fieldid}"; + if (isset(static::$defaultfields[$fieldid])) { + $defaultfieldname = static::$defaultfields[$fieldid]; + $fieldsql[] = "(SELECT u.{$defaultfieldname}) AS field_{$fieldid}"; + } else { + $fieldsql[] = "(SELECT data FROM {user_info_data} + WHERE fieldid = {$fieldid} AND userid = u.id) AS field_{$fieldid}"; + } } if ($fieldsql) { $fieldsql = implode(', ', $fieldsql).', '; diff --git a/classes/profilefields.php b/classes/profilefields.php index 6737f55..5ff91c4 100644 --- a/classes/profilefields.php +++ b/classes/profilefields.php @@ -52,6 +52,16 @@ abstract class profilefields { /** @var string[] list of available actions */ protected static $actions = ['view', 'add']; + /** @var string[] list of Moodle default profile fields */ + protected static $defaultfields = [ + 1000001 => 'email', + 1000002 => 'institution', + 1000003 => 'department', + 1000004 => 'address', + 1000005 => 'city', + 1000006 => 'country' + ]; + /** * profilefields constructor. */ @@ -107,8 +117,17 @@ public function process_form() { if ($this->action == 'add') { // Add a new, empty, rule to the end of the list, if requested. if ($addid = optional_param('add', null, PARAM_INT)) { - $field = $DB->get_record('user_info_field', array('id' => $addid), 'id AS fieldid, name, datatype, param1', - MUST_EXIST); + if (isset(static::$defaultfields[$addid])) { + $field = new \stdClass; + $field->fieldid = (string) $addid; + $field->name = static::$defaultfields[$addid]; + $field->datatype = 'text'; + $field->param1 = ''; + } else { + $field = $DB->get_record('user_info_field', array('id' => $addid), 'id AS fieldid, name, datatype, param1', + MUST_EXIST); + } + if ($rule = field_base::make_instance($field)) { $rules[] = $rule; } @@ -364,10 +383,28 @@ protected static function load_profile_fields($rules, $userid) { foreach ($rules as $rule) { $fieldids[] = $rule->fieldid; } - list($fsql, $params) = $DB->get_in_or_equal($fieldids, SQL_PARAMS_NAMED); - $params['userid'] = $userid; - $select = "fieldid $fsql AND userid = :userid"; - return $DB->get_records_select_menu('user_info_data', $select, $params, '', 'fieldid, data'); + + $fields = []; + $defaultfieldids = array_values(array_intersect($fieldids, array_keys(static::$defaultfields))); + $customfieldids = array_values(array_diff($fieldids, $defaultfieldids)); + + if (!empty($customfieldids)) { + list($fsql, $params) = $DB->get_in_or_equal($customfieldids, SQL_PARAMS_NAMED); + $params['userid'] = $userid; + $select = "fieldid $fsql AND userid = :userid"; + $fields = $DB->get_records_select_menu('user_info_data', $select, $params, '', 'fieldid, data'); + } + + if (!empty($defaultfieldids)) { + $userobj = $DB->get_record('user', array('id' => $userid)); + + foreach ($defaultfieldids as $defaultfieldid) { + $fieldname = static::$defaultfields[$defaultfieldid]; + $fields[$defaultfieldid] = $userobj->$fieldname; + } + } + + return $fields; } // ------------------------------------------ @@ -393,6 +430,18 @@ protected static function load_possible_fields() { global $DB; $ret = []; $fields = $DB->get_records('user_info_field', [], 'name', 'id, name, datatype'); + + $defaultfieldsprepared = []; + foreach (static::$defaultfields as $defaultfieldid => $defaultfieldname) { + $defaultfield = new \stdClass; + $defaultfield->id = $defaultfieldid; + $defaultfield->name = $defaultfieldname; + $defaultfield->datatype = 'text'; + + $defaultfieldsprepared[] = $defaultfield; + } + $fields = array_merge($fields, $defaultfieldsprepared); + foreach ($fields as $field) { if (field_base::make_instance($field, IGNORE_MISSING)) { $ret[$field->id] = $field->name; @@ -440,11 +489,18 @@ protected static function load_rules() { $rules = []; $tablename = static::$tablename; - $sql = "SELECT m.*, f.name, f.datatype, f.param1 + $sql = "SELECT m.*, f.name, f.datatype, f.param1 FROM {{$tablename}} m - JOIN {user_info_field} f ON f.id = m.fieldid + LEFT JOIN {user_info_field} f ON f.id = m.fieldid ORDER BY m.sortorder"; + foreach ($DB->get_recordset_sql($sql) as $ruledata) { + if (isset(static::$defaultfields[$ruledata->fieldid])) { + $ruledata->name = static::$defaultfields[$ruledata->fieldid]; + $ruledata->datatype = 'text'; + $ruledata->param1 = ''; + } + if ($rule = field_base::make_instance($ruledata, IGNORE_MISSING)) { $rules[] = $rule; }