106 lines
3.7 KiB
PHP
106 lines
3.7 KiB
PHP
|
<?php
|
||
|
namespace nur\b\params;
|
||
|
|
||
|
use nur\A;
|
||
|
use nur\data\types\md_utils;
|
||
|
use nur\data\types\Metadata;
|
||
|
|
||
|
/**
|
||
|
* Trait _Tparametrable0: implémentation partagée entre {@link Tparametrable1}
|
||
|
* et {@link Tparametrable} qui doit toujours être écrasée dans les classes
|
||
|
* dérivées (i.e si les méthodes définies ici sont surchargées, elle ne seront
|
||
|
* pas disponibles dans les classes dérivées parce qu'écrasées par la directive
|
||
|
* `use Tparametrable`)
|
||
|
*/
|
||
|
trait _Tparametrable0 {
|
||
|
static function _get_parametrable_params_schema(): array {
|
||
|
return self::PARAMETRABLE_PARAMS_SCHEMA;
|
||
|
}
|
||
|
|
||
|
private static $parametrable_params_md;
|
||
|
private static function parametrable_params_md(): Metadata {
|
||
|
return md_utils::ensure_md(self::$parametrable_params_md
|
||
|
, self::_get_parametrable_params_schema());
|
||
|
}
|
||
|
|
||
|
static function get_parametrable_params_schema(): array {
|
||
|
return self::parametrable_params_md()->getSchema();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* initialiser dans $params les valeurs de $defaults si:
|
||
|
* - elles ne sont pas nulles (avec $ignoreNulls == true)
|
||
|
* - elles ne sont pas déjà définies dans $params
|
||
|
*/
|
||
|
static function set_parametrable_params_defaults(?array &$params, ?array $defaults, bool $ignoreNulls=true): void {
|
||
|
if ($defaults === null) return;
|
||
|
foreach ($defaults as $key => $value) {
|
||
|
if ($value !== null || !$ignoreNulls) {
|
||
|
A::replace_nx($params, $key, $value);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function setParametrableParams(?array $params): void {
|
||
|
$parametrables = $this->getParametrableParamsParametrables();
|
||
|
$md = self::parametrable_params_md();
|
||
|
$modifiedKeys = parametrable_utils::set_params($parametrables, $this, $params, $md);
|
||
|
$this->afterSetParametrableParams($modifiedKeys, $md);
|
||
|
}
|
||
|
|
||
|
protected static function was_parametrable_param_modified(array $modifiedKeys, string ...$keys): bool {
|
||
|
foreach ($modifiedKeys as $key) {
|
||
|
if (in_array($key, $keys)) return true;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
function initParametrableParams(?array $params, bool $setParametrableParams=true): void {
|
||
|
$parametrables = $this->getParametrableParamsParametrables();
|
||
|
parametrable_utils::set_defaults($parametrables, $this, self::parametrable_params_md());
|
||
|
if ($setParametrableParams) $this->setParametrableParams($params);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* splitter $params en deux tableaux: les paramètres définis et les autres.
|
||
|
* ceci n'est utile que si l'on veut traiter à part ces valeurs.
|
||
|
*/
|
||
|
static function split_parametrable_params(?array $params=null): array {
|
||
|
if ($params === null) return [null, []];
|
||
|
$md = self::parametrable_params_md();
|
||
|
$others = $md->getOthers($params);
|
||
|
$params = $md->getValues($params);
|
||
|
return [$params, $others];
|
||
|
}
|
||
|
|
||
|
protected function splitParametrableParams(?array $params): array {
|
||
|
return self::split_parametrable_params($params);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* implémentation par défaut à utiliser dans une méthode __call()
|
||
|
*
|
||
|
* la constante _AUTO_SETTERS doit être définie.
|
||
|
*
|
||
|
* retourner true si la méthode a été appelée, false si elle n'est pas gérée
|
||
|
* par cette méthode
|
||
|
*
|
||
|
* utiliser de cette manière:
|
||
|
* function __call(string $name, array $args) {
|
||
|
* if ($this->parametrable__call($name, $args, $result)) return $result;
|
||
|
* ....
|
||
|
* throw IllegalAccessException::not_implemented($name);
|
||
|
* }
|
||
|
*/
|
||
|
function parametrable__call(string $name, array $args, &$result): bool {
|
||
|
$md = self::parametrable_params_md();
|
||
|
$auto_getters = self::_AUTO_GETTERS;
|
||
|
$auto_setters = self::_AUTO_SETTERS;
|
||
|
if (parametrable_utils::should_call($name, $auto_getters, $auto_setters, $md)) {
|
||
|
$result = parametrable_utils::call($this, $name, $args, $auto_getters, $auto_setters, $md);
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
}
|