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;
 | |
|   }
 | |
| }
 |