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/>.
declare(strict_types=1);
namespace core_reportbuilder\local\filters;
use MoodleQuickForm;
use core_reportbuilder\local\report\filter;
use core_reportbuilder\local\models\filter as filter_model;
/**
* Base class for all report filters
*
* Filters provide a form for collecting user input, and then return appropriate SQL fragments based on these values
*
* @package core_reportbuilder
* @copyright 2021 Paul Holden <paulh@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
abstract class base {
/** @var filter $filter */
protected $filter;
/** @var string $name */
protected $name;
/**
* Do not allow the constructor to be called directly or overridden
*
* @param filter $filter
*/
private function __construct(filter $filter) {
$this->filter = $filter;
$this->name = $filter->get_unique_identifier();
}
/**
* Creates an instance of a filter type, based on supplied report filter instance
*
* The report filter instance is used by reports/entities to define what should be filtered against, e.g. a SQL fragment
*
* @param filter $filter The report filter instance
* @return static
*/
final public static function create(filter $filter): self {
$filterclass = $filter->get_filter_class();
return new $filterclass($filter);
}
/**
* Returns the filter header
*
* @return string
*/
final public function get_header(): string {
return $this->filter->get_header();
}
/**
* Returns the filter's entity name
*
* @return string
*/
final public function get_entity_name(): string {
return $this->filter->get_entity_name();
}
/**
* Returns the filter persistent
*
* Note that filters for system reports don't store a persistent and will return null.
*
* @return filter_model|null
*/
final public function get_filter_persistent(): ?filter_model {
return $this->filter->get_persistent();
}
/**
* Adds filter-specific form elements
*
* @param MoodleQuickForm $mform
*/
abstract public function setup_form(MoodleQuickForm $mform): void;
/**
* Returns the filter clauses to be used with SQL where
*
* Ideally the field SQL should be included only once in the returned expression, however if that is unavoidable then
* use the {@see filter::get_field_sql_and_params} helper to ensure uniqueness of any parameters included within
*
* @param array $values
* @return array [$sql, [...$params]]
*/
abstract public function get_sql_filter(array $values): array;
/**
* Given an array of current filter values for the report, determine whether the filter would apply to the report (i.e. user
* has configured it from it's initial "Any value" state). A filter would typically be considered applied if it returns SQL
* filter clauses, but child classes may override this method if they use different logic
*
* @param array $values
* @return bool
*/
public function applies_to_values(array $values): bool {
[$filtersql] = $this->get_sql_filter($values);
return $filtersql !== '';
}
/**
* Return sample filter values, that when applied to a report would activate the filter - that is, cause the filter to return
* SQL snippet. Should be overridden in child classes, to ensure compatibility with stress tests of reports
*
* @return array
*/
public function get_sample_values(): array {
return [];
}
}