diff --git a/availability/condition/profile/classes/condition.php b/availability/condition/profile/classes/condition.php index 106f74cac63..92653666084 100644 --- a/availability/condition/profile/classes/condition.php +++ b/availability/condition/profile/classes/condition.php @@ -197,7 +197,12 @@ class condition extends \core_availability\condition { $this->customfield); } } else { - $translatedfieldname = get_user_field_name($this->standardfield); + $standardfields = self::get_standard_profile_fields(); + if (array_key_exists($this->standardfield, $standardfields)) { + $translatedfieldname = $standardfields[$this->standardfield]; + } else { + $translatedfieldname = get_string('missing', 'availability_profile', $this->standardfield); + } } $context = \context_course::instance($course->id); $a = new \stdClass(); @@ -321,6 +326,33 @@ class condition extends \core_availability\condition { return $fieldconditionmet; } + /** + * Return list of standard user profile fields used by the condition + * + * @return string[] + */ + public static function get_standard_profile_fields(): array { + return [ + 'firstname' => get_user_field_name('firstname'), + 'lastname' => get_user_field_name('lastname'), + 'email' => get_user_field_name('email'), + 'city' => get_user_field_name('city'), + 'country' => get_user_field_name('country'), + 'url' => get_user_field_name('url'), + 'icq' => get_user_field_name('icq'), + 'skype' => get_user_field_name('skype'), + 'aim' => get_user_field_name('aim'), + 'yahoo' => get_user_field_name('yahoo'), + 'msn' => get_user_field_name('msn'), + 'idnumber' => get_user_field_name('idnumber'), + 'institution' => get_user_field_name('institution'), + 'department' => get_user_field_name('department'), + 'phone1' => get_user_field_name('phone1'), + 'phone2' => get_user_field_name('phone2'), + 'address' => get_user_field_name('address') + ]; + } + /** * Gets data about custom profile fields. Cached statically in current * request. @@ -472,6 +504,11 @@ class condition extends \core_availability\condition { $valuefield = 'data'; $default = $customfield->defaultdata; } else { + $standardfields = self::get_standard_profile_fields(); + if (!array_key_exists($this->standardfield, $standardfields)) { + // If the field isn't found, nobody matches. + return []; + } $values = $DB->get_records_select('user', 'id ' . $sql, $params, '', 'id, '. $this->standardfield); $valuefield = $this->standardfield; @@ -595,6 +632,11 @@ class condition extends \core_availability\condition { $where = "(ud.data IS NOT NULL AND $condition)"; } } else { + $standardfields = self::get_standard_profile_fields(); + if (!array_key_exists($this->standardfield, $standardfields)) { + // If the field isn't found, nobody matches. + return ['SELECT id FROM {user} WHERE 0 = 1', []]; + } $tablesql = "JOIN {user} u ON u.id = userids.id"; list ($where, $mainparams) = $this->get_condition_sql( 'u.' . $this->standardfield); diff --git a/availability/condition/profile/classes/frontend.php b/availability/condition/profile/classes/frontend.php index 373c9a1984a..288ad9e69ee 100644 --- a/availability/condition/profile/classes/frontend.php +++ b/availability/condition/profile/classes/frontend.php @@ -42,26 +42,9 @@ class frontend extends \core_availability\frontend { protected function get_javascript_init_params($course, \cm_info $cm = null, \section_info $section = null) { + // Standard user fields. - $standardfields = array( - 'firstname' => get_user_field_name('firstname'), - 'lastname' => get_user_field_name('lastname'), - 'email' => get_user_field_name('email'), - 'city' => get_user_field_name('city'), - 'country' => get_user_field_name('country'), - 'url' => get_user_field_name('url'), - 'icq' => get_user_field_name('icq'), - 'skype' => get_user_field_name('skype'), - 'aim' => get_user_field_name('aim'), - 'yahoo' => get_user_field_name('yahoo'), - 'msn' => get_user_field_name('msn'), - 'idnumber' => get_user_field_name('idnumber'), - 'institution' => get_user_field_name('institution'), - 'department' => get_user_field_name('department'), - 'phone1' => get_user_field_name('phone1'), - 'phone2' => get_user_field_name('phone2'), - 'address' => get_user_field_name('address') - ); + $standardfields = condition::get_standard_profile_fields(); \core_collator::asort($standardfields); // Custom fields. diff --git a/availability/condition/profile/lang/en/availability_profile.php b/availability/condition/profile/lang/en/availability_profile.php index c78dace0c6a..f1535d63619 100644 --- a/availability/condition/profile/lang/en/availability_profile.php +++ b/availability/condition/profile/lang/en/availability_profile.php @@ -39,7 +39,7 @@ $string['requires_notendswith'] = 'Your {$a->field} does not en $string['requires_notisequalto'] = 'Your {$a->field} is not {$a->value}'; $string['requires_notstartswith'] = 'Your {$a->field} does not start with {$a->value}'; $string['requires_startswith'] = 'Your {$a->field} starts with {$a->value}'; -$string['missing'] = '(Missing custom field: {$a})'; +$string['missing'] = '(Missing field: {$a})'; $string['title'] = 'User profile'; $string['op_contains'] = 'contains'; $string['op_doesnotcontain'] = 'doesn\'t contain';