From 6b64d3b39b7911056f17672e7eb1ddfe0fbdd164 Mon Sep 17 00:00:00 2001 From: ikawhero Date: Fri, 5 Jan 2007 02:12:33 +0000 Subject: [PATCH] Customisable user profile fields --- user/profile/field/menu/field.class.php | 52 +++++ user/profile/field/text/field.class.php | 22 +++ user/profile/lib.php | 243 ++++++++++++++++++++++++ 3 files changed, 317 insertions(+) create mode 100644 user/profile/field/menu/field.class.php create mode 100644 user/profile/field/text/field.class.php create mode 100644 user/profile/lib.php diff --git a/user/profile/field/menu/field.class.php b/user/profile/field/menu/field.class.php new file mode 100644 index 0000000000..02a177cb8c --- /dev/null +++ b/user/profile/field/menu/field.class.php @@ -0,0 +1,52 @@ +field->param1)) === false) { + $options = array(); + } + $this->options = $options; + } + + function display_field_add(&$form) { + /// Create the form field + $form->addElement('select', $this->fieldname, $this->field->name, $this->options); + $form->setType($this->fieldname, PARAM_INT); + } + + /// Override base class method + function display_field_default(&$form) { + /// Default data is either what user has already set othewise the default value for the field othewise nothing + if (!($default = get_field('user_info_data', 'data', 'userid', $this->userid, 'fieldid', $this->field->id))) { + $default = (empty($this->field->defaultdata)) ? '' : $this->field->defaultdata; + } + if (($defaultkey = array_search($default, $this->options)) === NULL) { + $defaultkey = 0; + } + $form->setDefault($this->fieldname, $defaultkey); + } + + function set_data_type() { + $this->datatype = 'menu'; + } + + function validate_data($data) { + if ($data >= count($this->options)) { + return get_string('invaliddata'); + } else { + return ''; + } + } + + function save_data_preprocess($data) { + if (!isset($this->options[$data])) { /// validate_data should already have caught this + return ''; + } else { + return $this->options[$data]; + } + } +} + +?> diff --git a/user/profile/field/text/field.class.php b/user/profile/field/text/field.class.php new file mode 100644 index 0000000000..fa2f534065 --- /dev/null +++ b/user/profile/field/text/field.class.php @@ -0,0 +1,22 @@ +field->param1)) ? '30' : $this->field->param1; + + /// Param 2 for text type is the maxlength of the field + $maxlength = (empty($this->field->param2)) ? '254' : $this->field->param2; + + /// Create the form field + $form->addElement('text', $this->fieldname, $this->field->name, 'maxlength="'.$maxlength.'" size="'.$size.'" '); + $form->setType($this->fieldname, PARAM_MULTILANG); + } + + function set_data_type() { + $this->datatype = 'text'; + } +} + +?> diff --git a/user/profile/lib.php b/user/profile/lib.php new file mode 100644 index 0000000000..811c5c8a84 --- /dev/null +++ b/user/profile/lib.php @@ -0,0 +1,243 @@ +datatype = 'unknown'; + } + + /** + * Adds the profile field to the moodle form class + * @param form instance of the moodleform class + */ + function display_field_add(&$form) { + /// Add the element to the form class + /// By default we add a static field + $form->addElement('static', $this->fieldname, $this->field->name, ''); + } + + /** + * Validate the form field from profile page + * @return string contains error message otherwise NULL + **/ + function validate_profile_field ($data) { + return NULL; + } + + + /***** The following methods may be overwritten by child classes *****/ + + /** + * Print out the form field in the profile page + * @param form instance of the moodleform class + * $return boolean + */ + function display_field (&$form) { + if (empty($this->field)) { + return false; + } + + /// Check that this field is visible to current user + if (!$this->_is_visible()) { + return false; + } + + $this->display_field_add($form); + $this->display_field_lock($form); + $this->display_field_default($form); + $this->display_field_required($form); + + return true; + } + + + /// Constructor function + function profile_field_base($fieldid=0, $userid=0, $dataid=0) { + global $USER; + + /// If userid is empty, assume the current user + if (empty($userid)) $userid = $USER->id; + + /// If dataid is not set we can set it from fieldid and userid + if (empty($dataid) and !empty($fieldid) and !empty($userid)) { + if (($dataid = get_field('user_info_data', 'id', 'fieldid', $fieldid, 'userid', $userid)) === false) { + $dataid = 0; + } + } + + /// If the fieldid is set then we can automatically set the datatype + if (!empty($fieldid)) { + $field = get_record('user_info_field', 'id', $fieldid); + $datatype = $field->datatype; + } else { + $datatype = 'unknown'; + $field = null; + } + + $this->fieldid = $fieldid; + $this->userid = $userid; + $this->dataid = $dataid; + $this->datatype = $datatype; + $this->field = $field; + $this->fieldname = $this->datatype.'_'.$this->field->id; /// hack to avoid using integers as the field name + + /// Post setup processing + $this->init(); + } + + /** + * A hook for child classes to perform any post-setup processes + */ + function init() { + /// do nothing - overwrite if necessary + } + + + /// Prints out the form for creating a new profile field + function edit_new_field () { + + } + + /// Removes a profile field and all data associated with it + function edit_remove_field () { + + } + + /** + * Validates the data coming from form + * @param mixed data from the form + * @return string error message + */ + function validate_data ($data) { + return ''; + } + + /** + * Saves the data coming from form + * @param mixed data coming from the form + * @return mixed returns data id if success of db insert/update, false on fail, 0 if not permitted + */ + function save_data ($data) { + if ($this->_is_visible() and !$this->_is_locked()) { /// check that we have permission + + $data = $this->save_data_preprocess($data); + + unset($datarecord); + $datarecord->userid = $this->userid; + $datarecord->fieldid = $this->fieldid; + $datarecord->data = $data; + + if ($this->dataid == 0) { /// inserting a new record + if ($ret = insert_record('user_info_data', $datarecord)) { + $this->dataid = $ret; + } + } else { + $datarecord->id = $this->dataid; + if (update_record('user_info_data', $datarecord)) { + $ret = $this->dataid; + } else { + $ret = false; + } + } + + } else { + $ret = 0; + } + + return $ret; + } + + /** + * Hook for child classess to process the data before it gets saved in database + * @param mixed + * @return mixed + */ + function save_data_preprocess($data) { + return $data; + } + + function display_field_lock (&$form) { + $form->disabledIf($this->fieldname, $this->_is_locked(), true); + } + + function display_field_default(&$form) { + if (!($default = get_field('user_info_data', 'data', 'userid', $this->userid, 'fieldid', $this->field->id))) { + $default = (empty($this->field->defaultdata)) ? '' : $this->field->defaultdata; + } + $form->setDefault($this->fieldname, $default); + } + + function display_field_required(&$form) { + if ($this->_is_required()) { + $form->addRule($this->fieldname, get_string('required'), 'required', null, 'client'); + } + } + + /***** The following methods should never be overwritten *****/ + + /** + * Check if the current field is visible to the current user + * @return boolean + */ + function _is_visible() { + global $USER; + /* Can we see this field? Choices are: + 1 - VISIBLE ALL; + 2 - VISIBLE PRIVATE - either we are viewing our own profile or we have required capability; + 3 - VISIBLE NONE - we have the required capability + */ + return ( ($this->field->visible === PROFILE_VISIBLE_ALL) + or ( ($this->field->visible === PROFILE_VISIBLE_PRIVATE) + and ($this->userid == $USER->id) ) + or has_capability('moodle/user:update', get_context_instance(CONTEXT_SYSTEM, SITEID)) ); + } + + /** + * Check if the current field is locked to the current user + * @return boolean + */ + function _is_locked() { + return ( ($this->field->locked == PROFILE_LOCKED_YES) + and !has_capability('moodle/user:update', get_context_instance(CONTEXT_SYSTEM, SITEID))); + } + + /** + * Check if the current field is required + * @return boolean + */ + function _is_required() { + return ($this->field->required == PROFILE_REQUIRED_YES); + } + + +} /// End of class definition + +?> -- 2.39.5