Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 3.11.x will end 14 Nov 2022 (12 months plus 6 months extension).
  • Bug fixes for security issues in 3.11.x will end 13 Nov 2023 (18 months plus 12 months extension).
  • PHP version: minimum PHP 7.3.0 Note: minimum PHP version has increased since Moodle 3.10. PHP 7.4.x is supported too.

Differences Between: [Versions 310 and 311] [Versions 311 and 400] [Versions 311 and 401] [Versions 311 and 402] [Versions 311 and 403] [Versions 39 and 311]

   1  <?php
   2  // This file is part of Moodle - http://moodle.org/
   3  //
   4  // Moodle is free software: you can redistribute it and/or modify
   5  // it under the terms of the GNU General Public License as published by
   6  // the Free Software Foundation, either version 3 of the License, or
   7  // (at your option) any later version.
   8  //
   9  // Moodle is distributed in the hope that it will be useful,
  10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12  // GNU General Public License for more details.
  13  //
  14  // You should have received a copy of the GNU General Public License
  15  // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
  16  
  17  /**
  18   * Manage user profile fields.
  19   * @package core_user
  20   * @copyright  2007 onwards Shane Elliot {@link http://pukunui.com}
  21   * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  22   */
  23  
  24  require('../../config.php');
  25  require_once($CFG->libdir.'/adminlib.php');
  26  require_once($CFG->dirroot.'/user/profile/lib.php');
  27  require_once($CFG->dirroot.'/user/profile/definelib.php');
  28  
  29  admin_externalpage_setup('profilefields');
  30  
  31  $action   = optional_param('action', '', PARAM_ALPHA);
  32  
  33  $redirect = $CFG->wwwroot.'/user/profile/index.php';
  34  
  35  $strdefaultcategory = get_string('profiledefaultcategory', 'admin');
  36  $strcreatefield     = get_string('profilecreatefield', 'admin');
  37  
  38  
  39  // Do we have any actions to perform before printing the header.
  40  
  41  switch ($action) {
  42      case 'movecategory':
  43          $id  = required_param('id', PARAM_INT);
  44          $dir = required_param('dir', PARAM_ALPHA);
  45  
  46          if (confirm_sesskey()) {
  47              profile_move_category($id, $dir);
  48          }
  49          redirect($redirect);
  50          break;
  51      case 'movefield':
  52          $id  = required_param('id', PARAM_INT);
  53          $dir = required_param('dir', PARAM_ALPHA);
  54  
  55          if (confirm_sesskey()) {
  56              profile_move_field($id, $dir);
  57          }
  58          redirect($redirect);
  59          break;
  60      case 'deletecategory':
  61          $id      = required_param('id', PARAM_INT);
  62          if (confirm_sesskey()) {
  63              profile_delete_category($id);
  64          }
  65          redirect($redirect, get_string('deleted'));
  66          break;
  67      case 'deletefield':
  68          $id      = required_param('id', PARAM_INT);
  69          $confirm = optional_param('confirm', 0, PARAM_BOOL);
  70  
  71          // If no userdata for profile than don't show confirmation.
  72          $datacount = $DB->count_records('user_info_data', array('fieldid' => $id));
  73          if (((data_submitted() and $confirm) or ($datacount === 0)) and confirm_sesskey()) {
  74              profile_delete_field($id);
  75              redirect($redirect, get_string('deleted'));
  76          }
  77  
  78          // Ask for confirmation, as there is user data available for field.
  79          $fieldname = $DB->get_field('user_info_field', 'name', array('id' => $id));
  80          $optionsyes = array ('id' => $id, 'confirm' => 1, 'action' => 'deletefield', 'sesskey' => sesskey());
  81          $strheading = get_string('profiledeletefield', 'admin', format_string($fieldname));
  82          $PAGE->navbar->add($strheading);
  83          echo $OUTPUT->header();
  84          echo $OUTPUT->heading($strheading);
  85          $formcontinue = new single_button(new moodle_url($redirect, $optionsyes), get_string('yes'), 'post');
  86          $formcancel = new single_button(new moodle_url($redirect), get_string('no'), 'get');
  87          echo $OUTPUT->confirm(get_string('profileconfirmfielddeletion', 'admin', $datacount), $formcontinue, $formcancel);
  88          echo $OUTPUT->footer();
  89          die;
  90          break;
  91      default:
  92          // Normal form.
  93  }
  94  
  95  // Show all categories.
  96  $categories = $DB->get_records('user_info_category', null, 'sortorder ASC');
  97  
  98  // Check that we have at least one category defined.
  99  if (empty($categories)) {
 100      $defaultcategory = new stdClass();
 101      $defaultcategory->name = $strdefaultcategory;
 102      $defaultcategory->sortorder = 1;
 103      $DB->insert_record('user_info_category', $defaultcategory);
 104      redirect($redirect);
 105  }
 106  
 107  // Print the header.
 108  echo $OUTPUT->header();
 109  echo $OUTPUT->heading(get_string('profilefields', 'admin'));
 110  
 111  $outputcategories = [];
 112  $options = profile_list_datatypes();
 113  
 114  foreach ($categories as $category) {
 115      // Category fields.
 116      $outputfields = [];
 117      if ($fields = $DB->get_records('user_info_field', array('categoryid' => $category->id), 'sortorder ASC')) {
 118          foreach ($fields as $field) {
 119              $fieldname = format_string($field->name);
 120              $component = 'profilefield_' . $field->datatype;
 121              $classname = "\\$component\\helper";
 122              if (class_exists($classname) && method_exists($classname, 'get_fieldname')) {
 123                  $fieldname = $classname::get_fieldname($field->name);
 124              }
 125              $outputfields[] = [
 126                  'id' => $field->id,
 127                  'shortname' => $field->shortname,
 128                  'datatype' => $field->datatype,
 129                  'name' => $fieldname,
 130                  'isfirst' => !count($outputfields),
 131                  'islast' => count($outputfields) == count($fields) - 1,
 132              ];
 133          }
 134      }
 135  
 136      // Add new field menu.
 137      $menu = new \action_menu();
 138      $menu->set_alignment(\action_menu::BL, \action_menu::BL);
 139      $menu->set_menu_trigger($strcreatefield);
 140      foreach ($options as $type => $fieldname) {
 141          $action = new \action_menu_link_secondary(new \moodle_url('#'), null, $fieldname,
 142              ['data-action' => 'createfield', 'data-categoryid' => $category->id, 'data-datatype' => $type,
 143                  'data-datatypename' => $fieldname]);
 144          $menu->add($action);
 145      }
 146      $menu->attributes['class'] .= ' float-left mr-1';
 147  
 148      // Add category information to the template.
 149      $outputcategories[] = [
 150          'id' => $category->id,
 151          'name' => format_string($category->name),
 152          'fields' => $outputfields,
 153          'hasfields' => count($outputfields),
 154          'isfirst' => !count($outputcategories),
 155          'islast' => count($outputcategories) == count($categories) - 1,
 156          'candelete' => count($categories) > 1,
 157          'addfieldmenu' => $menu->export_for_template($OUTPUT),
 158      ];
 159  }
 160  
 161  echo $OUTPUT->render_from_template('core_user/edit_profile_fields', [
 162      'categories' => $outputcategories,
 163      'sesskey' => sesskey(),
 164      'baseurl' => (new moodle_url('/user/profile/index.php'))->out(false)
 165  ]);
 166  
 167  echo $OUTPUT->footer();