Autoría | Ultima modificación | Ver Log |
<?php// This file is part of Moodle - http://moodle.org///// Moodle is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.//// Moodle is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.//// You should have received a copy of the GNU General Public License// along with Moodle. If not, see <http://www.gnu.org/licenses/>.namespace core_adminpresets\local\setting;use admin_setting;use moodle_exception;use stdClass;/*** Admin tool presets plugin to load some settings.** @package core_adminpresets* @copyright 2021 Pimenko <support@pimenko.com><pimenko.com>* @author Jordan Kesraoui | Sylvain Revenu | Pimenko based on David Monllaó <david.monllao@urv.cat> code* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later*/class adminpresets_setting {/*** @var admin_setting*/protected $settingdata;/*** @var delegation*/protected $delegation;/*** The setting DB value** @var mixed*/protected $value;/*** Stores the visible value of the setting DB value** @var string*/protected $visiblevalue;/*** For multiple value settings, used to look for the other values** @var string*/protected $attributes = false;/*** To store the setting attributes** @var array*/protected $attributesvalues;/** @var array To store the behaviors. */protected array $behaviors = [];/*** Stores the setting data and the selected value** @param admin_setting $settingdata admin_setting subclass* @param mixed $dbsettingvalue Actual value*/public function __construct(admin_setting $settingdata, $dbsettingvalue) {$this->settingdata = $settingdata;$this->delegation = new delegation();if ($this->settingdata->plugin == '') {$this->settingdata->plugin = 'none';}// Applies specific children behaviors.$this->set_behaviors();$this->apply_behaviors();// Cleaning value.$this->set_value($dbsettingvalue);}/*** Each class can overwrite this method to specify extra processes*/protected function set_behaviors() {}/*** Applies the children class specific behaviors** See delegation class for the available extra behaviors*/protected function apply_behaviors() {if (!empty($this->behaviors)) {foreach ($this->behaviors as $behavior => $arguments) {// The arguments of the behavior depends on the caller.$methodname = 'extra_' . $behavior;$this->delegation->{$methodname}($arguments);}}}/*** Gets the setting value.** @return mixed The setting value*/public function get_value() {return $this->value;}/*** Sets the setting value cleaning it** Child classes should overwrite method to clean more acurately** @param mixed $value Setting value* @return mixed Returns false if wrong param value*/protected function set_value($value) {$this->value = $value;$this->set_visiblevalue();}public function get_visiblevalue() {return $this->visiblevalue;}/*** Sets the visible name for the setting selected value** In most cases the child classes will overwrite*/protected function set_visiblevalue() {$this->visiblevalue = $this->value;}public function get_attributes() {return $this->attributes;}public function get_attributes_values() {return $this->attributesvalues;}public function get_settingdata() {return $this->settingdata;}public function set_attribute_value($name, $value) {$this->attributesvalues[$name] = $value;}/*** Saves the setting attributes values** @return array|false Array of inserted ids (in config_log) or false if nothing was inserted*/public function save_attributes_values() {// Plugin name or null.$plugin = $this->settingdata->plugin;if ($plugin == 'none' || $plugin == '') {$plugin = null;}if (!$this->attributesvalues) {return false;}// To store inserted ids.$ids = [];foreach ($this->attributesvalues as $name => $value) {// Getting actual setting.$actualsetting = get_config($plugin, $name);// If it's the actual setting get off.if ($value == $actualsetting) {return false;}if ($id = $this->save_value($name, $value)) {$ids[] = $id;}}return $ids;}/*** Stores the setting into database, logs the change and returns the config_log inserted id** @param bool $name Setting name to store.* @param mixed $value Setting value to store.* @return int|false config_log inserted id or false whenever the new value is the same as old value.*/public function save_value($name = false, $value = null) {// Object values if no arguments.if ($value === null) {$value = $this->value;}if (!$name) {$name = $this->settingdata->name;}// Plugin name or null.$plugin = $this->settingdata->plugin;if ($plugin == 'none' || $plugin == '') {$plugin = null;}// Getting the actual value.$actualvalue = get_config($plugin, $name);// If it's the same it's not necessary.if ($actualvalue == $value) {return false;}set_config($name, $value, $plugin);return $this->to_log($plugin, $name, $value, $actualvalue);}/*** Copy of config_write method of the admin_setting class** @param string $plugin* @param string $name* @param mixed $value* @param mixed $actualvalue* @return integer The stored config_log id*/protected function to_log($plugin, $name, $value, $actualvalue) {global $DB, $USER;// Log the change (pasted from admin_setting class).$log = new stdClass();$log->userid = during_initial_install() ? 0 : $USER->id; // 0 as user id during install.$log->timemodified = time();$log->plugin = $plugin;$log->name = $name;$log->value = $value;$log->oldvalue = $actualvalue;// Getting the inserted config_log id.if (!$id = $DB->insert_record('config_log', $log)) {throw new moodle_exception('errorinserting', 'core_adminpresets');}return $id;}}