. /** * Menu profile field. * * @package profilefield_menu * @copyright 2007 onwards Shane Elliot {@link http://pukunui.com} * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ /** * Class profile_field_menu * * @copyright 2007 onwards Shane Elliot {@link http://pukunui.com} * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class profile_field_menu extends profile_field_base { /** @var array $options */ public $options; /** @var int $datakey */ public $datakey; /** * Constructor method. * * Pulls out the options for the menu from the database and sets the the corresponding key for the data if it exists. * * @param int $fieldid * @param int $userid */ public function __construct($fieldid = 0, $userid = 0) { // First call parent constructor. parent::__construct($fieldid, $userid); // Param 1 for menu type is the options. if (isset($this->field->param1)) { $options = explode("\n", $this->field->param1); } else { $options = array(); } $this->options = array(); if (!empty($this->field->required)) { $this->options[''] = get_string('choose').'...'; } foreach ($options as $key => $option) { $this->options[$option] = format_string($option); // Multilang formatting with filters. } // Set the data key. if ($this->data !== null) { $key = $this->data; if (isset($this->options[$key]) || ($key = array_search($key, $this->options)) !== false) { $this->data = $key; $this->datakey = $key; } } } /** * Old syntax of class constructor for backward compatibility. */ public function profile_field_menu($fieldid=0, $userid=0) { self::__construct($fieldid, $userid); } /** * Create the code snippet for this field instance * Overwrites the base class method * @param moodleform $mform Moodle form instance */ public function edit_field_add($mform) { $mform->addElement('select', $this->inputname, format_string($this->field->name), $this->options); } /** * Set the default value for this field instance * Overwrites the base class method. * @param moodleform $mform Moodle form instance */ public function edit_field_set_default($mform) { $key = $this->field->defaultdata; if (isset($this->options[$key]) || ($key = array_search($key, $this->options)) !== false){ $defaultkey = $key; } else { $defaultkey = ''; } $mform->setDefault($this->inputname, $defaultkey); } /** * The data from the form returns the key. * * This should be converted to the respective option string to be saved in database * Overwrites base class accessor method. * * @param mixed $data The key returned from the select input in the form * @param stdClass $datarecord The object that will be used to save the record * @return mixed Data or null */ public function edit_save_data_preprocess($data, $datarecord) { return isset($this->options[$data]) ? $data : null; } /** * When passing the user object to the form class for the edit profile page * we should load the key for the saved data * * Overwrites the base class method. * * @param stdClass $user User object. */ public function edit_load_user_data($user) { $user->{$this->inputname} = $this->datakey; } /** * HardFreeze the field if locked. * @param moodleform $mform instance of the moodleform class */ public function edit_field_set_locked($mform) { if (!$mform->elementExists($this->inputname)) { return; } if ($this->is_locked() and !has_capability('moodle/user:update', context_system::instance())) { $mform->hardFreeze($this->inputname); $mform->setConstant($this->inputname, format_string($this->datakey)); } } /** * Convert external data (csv file) from value to key for processing later by edit_save_data_preprocess * * @param string $value one of the values in menu options. * @return int options key for the menu */ public function convert_external_data($value) { if (isset($this->options[$value])) { $retval = $value; } else { $retval = array_search($value, $this->options); } // If value is not found in options then return null, so that it can be handled // later by edit_save_data_preprocess. if ($retval === false) { $retval = null; } return $retval; } }