mirror of
https://github.com/moodle/moodle.git
synced 2025-07-28 01:41:03 +02:00
Allows display_size to use a fixed unit for easy comparison of multiple results, and fixed decimal places for the same reason. Improves behaviour by using consistent decimal places and a consistent space before the unit (the previous one only has a space before 'bytes', not before 'KB'). Of existing uses, all the ones that displayed a 'maxbytes' type configuration setting (which are likely to have an 'exact' size and would be better shown as 512 KB rather than 512.0 KB) have been changed to use 0 decimal places, to preserve previous behaviour. All the uses which were showing an actual file or memory size have been left as default (1 decimal place).
198 lines
6.6 KiB
PHP
198 lines
6.6 KiB
PHP
<?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/>.
|
|
|
|
/**
|
|
* File size admin setting.
|
|
*
|
|
* @package core_admin
|
|
* @copyright 2019 Shamim Rezaie <shamim@moodle.com>
|
|
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
|
*/
|
|
|
|
namespace core_admin\local\settings;
|
|
|
|
defined('MOODLE_INTERNAL') || die();
|
|
|
|
require_once($CFG->libdir . '/adminlib.php');
|
|
|
|
/**
|
|
* An admin setting to support entering and displaying of file sizes in Bytes, KB, MB or GB.
|
|
*
|
|
* @copyright 2019 Shamim Rezaie <shamim@moodle.com>
|
|
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
|
*/
|
|
class filesize extends \admin_setting {
|
|
|
|
/** @var int The byte unit. Number of bytes in a byte */
|
|
const UNIT_B = 1;
|
|
|
|
/** @var int The kilobyte unit (number of bytes in a kilobyte) */
|
|
const UNIT_KB = 1024;
|
|
|
|
/** @var int The megabyte unit (number of bytes in a megabyte) */
|
|
const UNIT_MB = 1048576;
|
|
|
|
/** @var int The gigabyte unit (number of bytes in a gigabyte) */
|
|
const UNIT_GB = 1073741824;
|
|
|
|
/** @var int default size unit */
|
|
protected $defaultunit;
|
|
|
|
/**
|
|
* Constructor
|
|
*
|
|
* @param string $name unique ascii name, either 'mysetting' for settings that in config,
|
|
* or 'myplugin/mysetting' for ones in config_plugins.
|
|
* @param string $visiblename localised name
|
|
* @param string $description localised long description
|
|
* @param int|null $defaultvalue Value of the settings in bytes
|
|
* @param int|null $defaultunit GB, MB, etc. (in bytes)
|
|
*/
|
|
public function __construct(string $name, string $visiblename, string $description,
|
|
int $defaultvalue = null, int $defaultunit = null) {
|
|
|
|
$defaultsetting = self::parse_bytes($defaultvalue);
|
|
|
|
if ($defaultunit && array_key_exists($defaultunit, self::get_units())) {
|
|
$this->defaultunit = $defaultunit;
|
|
} else {
|
|
$this->defaultunit = self::UNIT_MB;
|
|
}
|
|
parent::__construct($name, $visiblename, $description, $defaultsetting);
|
|
}
|
|
|
|
/**
|
|
* Returns selectable units.
|
|
*
|
|
* @return array
|
|
*/
|
|
protected static function get_units(): array {
|
|
return [
|
|
self::UNIT_GB => get_string('sizegb'),
|
|
self::UNIT_MB => get_string('sizemb'),
|
|
self::UNIT_KB => get_string('sizekb'),
|
|
self::UNIT_B => get_string('sizeb'),
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Converts bytes to some more user friendly string.
|
|
*
|
|
* @param int $bytes The number of bytes we want to convert from
|
|
* @return string
|
|
*/
|
|
protected static function get_size_text(int $bytes): string {
|
|
if (empty($bytes)) {
|
|
return get_string('none');
|
|
}
|
|
return display_size($bytes, 0);
|
|
}
|
|
|
|
/**
|
|
* Finds suitable units for given file size.
|
|
*
|
|
* @param int $bytes The number of bytes
|
|
* @return array Parsed file size in the format of ['v' => value, 'u' => unit]
|
|
*/
|
|
protected static function parse_bytes(int $bytes): array {
|
|
foreach (self::get_units() as $unit => $unused) {
|
|
if ($bytes % $unit === 0) {
|
|
return ['v' => (int)($bytes / $unit), 'u' => $unit];
|
|
}
|
|
}
|
|
return ['v' => (int)$bytes, 'u' => self::UNIT_B];
|
|
}
|
|
|
|
/**
|
|
* Get the selected file size as array.
|
|
*
|
|
* @return array|null An array containing 'v' => xx, 'u' => xx, or null if not set
|
|
*/
|
|
public function get_setting(): ?array {
|
|
$bytes = $this->config_read($this->name);
|
|
if (is_null($bytes)) {
|
|
return null;
|
|
}
|
|
$bytes = intval($bytes);
|
|
|
|
return self::parse_bytes($bytes);
|
|
}
|
|
|
|
/**
|
|
* Store the file size as bytes.
|
|
*
|
|
* @param array $data Must be form 'h' => xx, 'm' => xx
|
|
* @return string The error string if any
|
|
*/
|
|
public function write_setting($data): string {
|
|
if (!is_array($data)) {
|
|
return '';
|
|
}
|
|
|
|
if (!is_numeric($data['v']) || $data['v'] < 0) {
|
|
return get_string('errorsetting', 'admin');
|
|
}
|
|
|
|
// Calculate size in bytes, ensuring we don't overflow PHP_INT_MAX.
|
|
$bytes = $data['v'] * $data['u'];
|
|
$result = (is_int($bytes) && $this->config_write($this->name, $bytes));
|
|
|
|
return ($result ? '' : get_string('errorsetting', 'admin'));
|
|
}
|
|
|
|
/**
|
|
* Returns file size text+select fields.
|
|
*
|
|
* @param array $data The current setting value. Must be form 'v' => xx, 'u' => xx.
|
|
* @param string $query Admin search query to be highlighted.
|
|
* @return string File size text+select fields and wrapping div(s).
|
|
*/
|
|
public function output_html($data, $query = ''): string {
|
|
global $OUTPUT;
|
|
|
|
$default = $this->get_defaultsetting();
|
|
if (is_number($default)) {
|
|
$defaultinfo = self::get_size_text($default);
|
|
} else if (is_array($default)) {
|
|
$defaultinfo = self::get_size_text($default['v'] * $default['u']);
|
|
} else {
|
|
$defaultinfo = null;
|
|
}
|
|
|
|
$inputid = $this->get_id() . 'v';
|
|
$units = self::get_units();
|
|
$defaultunit = $this->defaultunit;
|
|
|
|
$context = (object) [
|
|
'id' => $this->get_id(),
|
|
'name' => $this->get_full_name(),
|
|
'value' => $data['v'],
|
|
'readonly' => $this->is_readonly(),
|
|
'options' => array_map(function($unit, $title) use ($data, $defaultunit) {
|
|
return [
|
|
'value' => $unit,
|
|
'name' => $title,
|
|
'selected' => ($data['v'] == 0 && $unit == $defaultunit) || $unit == $data['u']
|
|
];
|
|
}, array_keys($units), $units)
|
|
];
|
|
|
|
$element = $OUTPUT->render_from_template('core_admin/setting_configfilesize', $context);
|
|
|
|
return format_admin_setting($this, $this->visiblename, $element, $this->description, $inputid, '', $defaultinfo, $query);
|
|
}
|
|
}
|