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/>./*** Integer comparison filter to allow a comparison such as "> 42".** @package core* @category table* @copyright 2020 Andrew Nicols <andrew@nicols.co.uk>* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later*/declare(strict_types=1);namespace core_table\local\filter;use InvalidArgumentException;use TypeError;/*** Class representing an integer filter.** @package core* @copyright 2020 Andrew Nicols <andrew@nicols.co.uk>* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later*/class numeric_comparison_filter extends filter {/*** Get the authoritative direction.** @param string $direction The supplied direction* @return string The authoritative direction*/protected function get_direction(string $direction): string {$validdirections = ['=' => '==','==' => '==','===' => '===','>' => '>','=>' => '=>','<' => '<','<=' => '<=',];if (!array_key_exists($direction, $validdirections)) {throw new InvalidArgumentException("Invalid direction specified '{$direction}'.");}return $validdirections[$direction];}/*** Add a value to the filter.** @param string $value A json-encoded array containing a direction, and comparison value* @return self*/public function add_filter_value($value): parent {if (!is_string($value)) {$type = gettype($value);if ($type === 'object') {$type = get_class($value);}throw new TypeError("The value supplied was of type '{$type}'. A string representing a json-encoded value was expected.");}$data = json_decode($value);if ($data === null) {throw new InvalidArgumentException("A json-encoded object containing both a direction, and comparison value was expected.");}if (!is_object($data)) {$type = gettype($value);throw new InvalidArgumentException("The value supplied was a json encoded '{$type}'. " ."An object containing both a direction, and comparison value was expected.");}if (!property_exists($data, 'direction')) {throw new InvalidArgumentException("A 'direction' must be provided.");}$direction = $this->get_direction($data->direction);if (!property_exists($data, 'value')) {throw new InvalidArgumentException("A 'value' must be provided.");}$value = $data->value;if (!is_numeric($value)) {$type = gettype($value);if ($type === 'object') {$type = get_class($value);}throw new TypeError("The value supplied was of type '{$type}'. A numeric value was expected.");}$fullvalue = (object) ['direction' => $direction,'value' => $value,];if (array_search($fullvalue, $this->filtervalues) !== false) {// Remove duplicates.return $this;}$this->filtervalues[] = $fullvalue;return $this;}}