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/>.
/**
* Responsible for building field definitions and retrieving them as needed.
*
* @package block_dash
* @copyright 2019 bdecent gmbh <https://bdecent.de>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace block_dash\local\data_grid\field;
use block_dash\local\dash_framework\structure\field_interface;
use block_dash\local\data_grid\field\attribute\field_attribute_interface;
/**
* Responsible for building field definitions and retrieving them as needed.
*
* @package block_dash
*/
class field_definition_factory implements field_definition_factory_interface {
/**
* Cache registered field definitions so they are only retrieved once.
*
* @var array
*/
private static $fielddefintionregistry;
/**
* @var field_definition_interface[]
*/
private static $fielddefinitions;
/**
* Register and return data registry.
*
* @return array
*/
protected static function get_field_definition_registry() {
if (is_null(self::$fielddefintionregistry)) {
self::$fielddefintionregistry = [];
if ($pluginsfunction = get_plugins_with_function('register_field_definitions')) {
foreach ($pluginsfunction as $plugintype => $plugins) {
foreach ($plugins as $pluginfunction) {
foreach ($pluginfunction() as $fielddefinition) {
self::$fielddefintionregistry[$fielddefinition['name']] = $fielddefinition;
}
}
}
}
}
return self::$fielddefintionregistry;
}
/**
* Returns all registered field definitions.
*
* @return field_definition_interface[]
* @throws \coding_exception
*/
public static function get_all_field_definitions() {
if (is_null(self::$fielddefinitions)) {
self::$fielddefinitions = [];
foreach (self::get_field_definition_registry() as $info) {
if (!isset($info['name'])) {
throw new \coding_exception('Standard SQL fields need a name defined.');
}
self::$fielddefinitions[$info['name']] = self::build_field_definition($info['name'], $info);
}
}
return self::$fielddefinitions;
}
/**
* Check if field definition exists.
*
* @param string $name
* @return bool
*/
public static function exists($name) {
return isset(self::get_field_definition_registry()[$name]);
}
/**
* Get field definition info.
*
* @param string $name
* @return array|null
*/
public static function get_field_definition_info($name) {
if (self::exists($name)) {
return self::get_field_definition_registry()[$name];
}
return null;
}
/**
* Build field definition.
*
* @param string $name
* @param array $info
* @return field_definition_interface
* @throws \coding_exception
*/
public static function build_field_definition($name, array $info) {
global $CFG;
if (!self::exists($name)) {
return null;
}
$fielddefinitioninfo = self::get_field_definition_info($name);
if (isset($fielddefinitioninfo['factory']) && $fielddefinitioninfo['factory'] != self::class) {
return $fielddefinitioninfo['factory']::build_field_definition($name, $info);
}
// Check for db driver specific select statements.
if (isset($fielddefinitioninfo['select_' . $CFG->dbtype])) {
$select = $fielddefinitioninfo['select_' . $CFG->dbtype];
} else {
// Otherwise default to agnostic select (not db specific).
if (!isset($fielddefinitioninfo['select'])) {
throw new \coding_exception('Standard SQL fields need a select defined: ' . $name);
}
$select = $fielddefinitioninfo['select'];
}
if (!isset($fielddefinitioninfo['title'])) {
throw new \coding_exception('Standard SQL fields need a title defined: ' . $name);
}
$newfielddefinition = new sql_field_definition(
$select,
$fielddefinitioninfo['name'],
$fielddefinitioninfo['title'],
isset($fielddefinitioninfo['visibility']) ? $fielddefinitioninfo['visibility'] :
field_definition_interface::VISIBILITY_VISIBLE,
isset($fielddefinitioninfo['options']) ? $fielddefinitioninfo['options'] : []);
if (isset($fielddefinitioninfo['tables'])) {
$newfielddefinition->set_option('tables', $fielddefinitioninfo['tables']);
}
// Support adding attributes from configuration array.
if (isset($fielddefinitioninfo['attributes'])) {
foreach ($fielddefinitioninfo['attributes'] as $attribute) {
/** @var field_attribute_interface $newattribute */
$newattribute = new $attribute['type']();
if (isset($attribute['options'])) {
$newattribute->set_options($attribute['options']);
}
$newfielddefinition->add_attribute($newattribute);
}
}
return $newfielddefinition;
}
/**
* Get field definitions by names. Maintain order.
*
* @param string[] $names Field definition names to retrieve.
* @return field_definition_interface[]
* @throws \coding_exception
*/
public static function get_field_definitions(array $names) {
$fielddefinitions = [];
$all = self::get_all_field_definitions();
foreach ($all as $fielddefinition) {
if (in_array($fielddefinition->get_name(), $names)) {
$fielddefinitions[array_search($fielddefinition->get_name(), $names)] = clone $fielddefinition;
}
}
ksort($fielddefinitions);
return $fielddefinitions;
}
/**
* Get field definition by name.
*
* @param string $name Field definition name to retrieve.
* @return field_definition_interface
* @throws \coding_exception
*/
public static function get_field_definition($name) {
foreach (self::get_all_field_definitions() as $fielddefinition) {
if ($fielddefinition->get_name() == $name) {
return clone $fielddefinition;
}
}
return null;
}
/**
* Get options for form select field.
*
* @param field_interface[] $fields
* @return array
* @throws \coding_exception
*/
public static function get_field_definition_options($fields) {
$options = [];
foreach ($fields as $field) {
$title = $field->get_table()->get_table_name() . ': ' . $field->get_title();
$options[$field->get_alias()] = $title;
}
return $options;
}
}