342 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			342 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| namespace nur\b\values;
 | |
| 
 | |
| use ArrayAccess;
 | |
| use nur\A;
 | |
| use nur\base;
 | |
| use nur\data\types\md_utils;
 | |
| use nur\data\types\Metadata;
 | |
| use nur\md;
 | |
| use nur\oprop;
 | |
| use nur\session;
 | |
| use nur\str;
 | |
| use nur\valx;
 | |
| 
 | |
| /**
 | |
|  * Class Mparams: mixin pour toutes les classes qui accèdent à des paramètres
 | |
|  *
 | |
|  * XXX vérifier si les méthodes ont toujours lieu d'être
 | |
|  */
 | |
| class Mparams {
 | |
|   static final function fix_param2($value) {
 | |
|     if (is_array($value)) {
 | |
|       $vs = [];
 | |
|       foreach ($value as $v) {
 | |
|         $v = base::vn(str::trim($v));
 | |
|         if (base::nz($v)) $vs[] = $v;
 | |
|       }
 | |
|       if ($vs) $value = $vs;
 | |
|       else $value = false;
 | |
|     } else {
 | |
|       $value = base::vn(str::trim($value));
 | |
|     }
 | |
|     return $value;
 | |
|   }
 | |
| 
 | |
|   static final function fix_param($value) {
 | |
|     if (is_array($value)) {
 | |
|       $vs = [];
 | |
|       foreach ($value as $v) {
 | |
|         $v = base::vn(str::trim($v));
 | |
|         if (base::nz($v)) $vs[] = $v;
 | |
|       }
 | |
|       if ($vs) $value = $vs;
 | |
|       else $value = null;
 | |
|     } else {
 | |
|       $value = base::vn(str::trim($value));
 | |
|     }
 | |
|     return $value;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Obtenir un paramètre de formulaire.
 | |
|    *
 | |
|    * La valeur est transformée en chaine, trimmée, et si elle est vide,
 | |
|    * remplacée par null. En définitive, la valeur finale est false s'il n'y
 | |
|    * avait pas de valeur, null si la valeur était vide.
 | |
|    *
 | |
|    * Si la valeur est un tableau, les valeurs du tableau sont transformées en
 | |
|    * chaine, trimmées et supprimées si elle sont vides. si le tableau se
 | |
|    * retrouve sans élément, il est remplacé par false.
 | |
|    */
 | |
| 
 | |
|   static final function get_param2($name, $default=false) {
 | |
|     if (!static::has($name)) return $default;
 | |
|     $value = static::get($name);
 | |
|     return self::fix_param2($value);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Obtenir un paramètre de formulaire.
 | |
|    *
 | |
|    * La différence avec get_param2() est qu'on ne distingue pas paramètre vide
 | |
|    * ou inexistant: le résultat est toujours null dans ce cas. De même, si la
 | |
|    * valeur est un tableau et que toutes les éléments sont vides, la valeur
 | |
|    * finale est null.
 | |
|    *
 | |
|    * Utiliser cette variante quand on ne se préoccupe pas de faire la
 | |
|    * différence entre paramètre vide et paramètre non fourni.
 | |
|    */
 | |
|   static final function get_param($name, $default=null) {
 | |
|     $value = static::get($name, $default);
 | |
|     return self::fix_param($value);
 | |
|   }
 | |
| 
 | |
|   const PARAM2_NAME_SCHEMA = [
 | |
|     "name" => [null, null, "nom du paramètre"],
 | |
|     "default" => [null, false, "valeur par défaut du paramètre"],
 | |
|   ];
 | |
| 
 | |
|   private static $param2_name_md;
 | |
|   private static function param2_name_md(): Metadata {
 | |
|     return md_utils::ensure_md(self::$param2_name_md, self::PARAM2_NAME_SCHEMA);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Obtenir des paramètres de formulaire, selon les règles de get_param2()
 | |
|    *
 | |
|    * chaque élément de $names peut être une chaine $name ou un array avec la
 | |
|    * structure [$name, $default=null]
 | |
|    */
 | |
|   static final function get_params2(...$names): array {
 | |
|     $params = [];
 | |
|     foreach ($names as $nd) {
 | |
|       [$name, $default] = md::get_values($nd, self::PARAM2_NAME_SCHEMA);
 | |
|       $params[$name] = self::get_param2($name, $default);
 | |
|     }
 | |
|     return $params;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Initialiser un objet avec des paramètres de formulaire.
 | |
|    *
 | |
|    * Les règles sont les mêmes que pour get_params2(), mais au lieu de retourner
 | |
|    * le résultat, initialiser les clés (si c'est un tableau) ou les propriétés
 | |
|    * (si c'est un objet) du même nom dans l'objet destination.
 | |
|    */
 | |
|   static final function set_params2(&$obj, ...$names): void {
 | |
|     $params = self::get_params2(...$names);
 | |
|     valx::set_values($obj, $params);
 | |
|   }
 | |
| 
 | |
|   ##
 | |
| 
 | |
|   /**
 | |
|    * Obtenir les paramètres avec get_params2() et corriger les valeurs avec
 | |
|    * A::verifix_values()
 | |
|    */
 | |
|   static final function get_verifixed_params2($verifixers): array {
 | |
|     $names = array_keys($verifixers);
 | |
|     $params = self::get_params2(...$names);
 | |
|     A::verifix_values($params, $verifixers);
 | |
|     return $params;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Obtenir les paramètres avec get_params2(), corriger les valeurs avec
 | |
|    * A::verifix_values(), puis initialiser l'objet comme avec set_params2()
 | |
|    */
 | |
|   static final function set_verifixed_params2(&$obj, $verifixers): void {
 | |
|     $names = array_keys($verifixers);
 | |
|     $params = self::get_params2(...$names);
 | |
|     A::verifix_values($params, $verifixers);
 | |
|     valx::set_values($obj, $params);
 | |
|   }
 | |
| 
 | |
|   ##
 | |
| 
 | |
|   const PARAM_NAME_SCHEMA = [
 | |
|     "name" => [null, null, "nom du paramètre"],
 | |
|     "default" => [null, null, "valeur par défaut du paramètre"],
 | |
|   ];
 | |
| 
 | |
|   private static $param_name_md;
 | |
|   private static function param_name_md(): Metadata {
 | |
|     return md_utils::ensure_md(self::$param_name_md, self::PARAM_NAME_SCHEMA);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Obtenir des paramètres de formulaire, selon les règles de get_param()
 | |
|    */
 | |
|   static final function get_params(...$names): array {
 | |
|     $param_name_md = self::param_name_md();
 | |
|     $params = [];
 | |
|     foreach ($names as $nd) {
 | |
|       $param_name_md->ensureSchema($nd);
 | |
|       ["name" => $name, "default" => $default] = $param_name_md->getValues($nd);
 | |
|       $params[$name] = self::get_param($name, $default);
 | |
|     }
 | |
|     return $params;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Initialiser un objet avec des paramètres de formulaire.
 | |
|    *
 | |
|    * Les règles sont les mêmes que pour get_params(), mais au lieu de retourner
 | |
|    * le résultat, initialiser les clés (si c'est un tableau) ou les propriétés
 | |
|    * (si c'est un objet) du même nom dans l'objet destination.
 | |
|    */
 | |
|   static final function set_params(&$obj, ...$names): void {
 | |
|     $params = self::get_params(...$names);
 | |
|     valx::set_values($obj, $params);
 | |
|   }
 | |
| 
 | |
|   ##
 | |
| 
 | |
|   /**
 | |
|    * Obtenir les paramètres avec get_params() et corriger les valeurs avec
 | |
|    * A::verifix_values()
 | |
|    */
 | |
|   static final function get_verifixed_params($verifixers): array {
 | |
|     $names = array_keys($verifixers);
 | |
|     $params = self::get_params(...$names);
 | |
|     A::verifix_values($params, $verifixers);
 | |
|     return $params;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Obtenir les paramètres avec get_params(), corriger les valeurs avec
 | |
|    * A::verifix_values(), puis initialiser l'objet comme avec set_params()
 | |
|    */
 | |
|   static final function set_verifixed_params(&$obj, $verifixers): void {
 | |
|     $names = array_keys($verifixers);
 | |
|     $params = self::get_params(...$names);
 | |
|     A::verifix_values($params, $verifixers);
 | |
|     valx::set_values($obj, $params);
 | |
|   }
 | |
| 
 | |
|   ##
 | |
| 
 | |
|   /**
 | |
|    * Obtenir le paramètre spécifié.
 | |
|    *
 | |
|    * Si le paramètre n'est pas fourni, prendre la variable de session du même
 | |
|    * nom si elle existe. Si la valeur est non nulle, mettre à jour la session
 | |
|    * avec la valeur du paramètre.
 | |
|    */
 | |
|   static final function sget($name, $default=null, $session_key=null, $trim=false) {
 | |
|     if ($session_key === null) $session_key = $name;
 | |
|     if (static::has($name)) {
 | |
|       $value = static::get($name, $default, $trim);
 | |
|       if ($trim && base::f($value)) $value = null;
 | |
|     } else {
 | |
|       $value = session::get($session_key, $default);
 | |
|     }
 | |
|     if (base::nz($value)) session::set($session_key, $value);
 | |
|     return $value;
 | |
|   }
 | |
| 
 | |
|   ##
 | |
| 
 | |
|   /**
 | |
|    * comme get_param2() avec les spécificités de sget()
 | |
|    *
 | |
|    * - si le paramètre n'est pas fourni, prendre la variable de session du même
 | |
|    *   nom si elle existe.
 | |
|    * - si le paramètre est null, supprimer la variable de session
 | |
|    * - sinon mettre à jour la session avec la valeur du paramètre.
 | |
|    */
 | |
|   static final function sget_param2($name, $default=false, $session_key=null) {
 | |
|     if ($session_key === null) $session_key = $name;
 | |
|     $value = self::get_param2($name, false);
 | |
|     if ($value === false) $value = session::get($session_key, $default);
 | |
|     if ($value === null) session::del($session_key);
 | |
|     elseif ($value !== false) session::set($session_key, $value);
 | |
|     return $value;
 | |
|   }
 | |
| 
 | |
|   const SPARAM2_NAME_SCHEMA = [
 | |
|     "name" => [null, null, "nom du paramètre"],
 | |
|     "default" => [null, false, "valeur par défaut du paramètre"],
 | |
|     "session_key" => [null, null, "nom de la clé dans la session"],
 | |
|   ];
 | |
| 
 | |
|   /**
 | |
|    * Obtenir des paramètres de formulaire, selon les règles de sget_param2()
 | |
|    *
 | |
|    * chaque élément de $names peut avoir la structure
 | |
|    * [$name, $default=false, $session_key=null]
 | |
|    */
 | |
|   static final function sget_params2(...$names): array {
 | |
|     $params = [];
 | |
|     foreach ($names as $nds) {
 | |
|       [$name, $default, $session_key] = md::get_values($nds, self::SPARAM2_NAME_SCHEMA);
 | |
|       $params[$name] = self::sget_param2($name, $default, $session_key);
 | |
|     }
 | |
|     return $params;
 | |
|   }
 | |
| 
 | |
|   /** comme set_params2() avec les spécificités de sget() */
 | |
|   static final function sset_params2(&$obj, ...$names): void {
 | |
|     $params = self::sget_params2(...$names);
 | |
|     valx::set_values($obj, $params);
 | |
|   }
 | |
| 
 | |
|   ##
 | |
| 
 | |
|   /**
 | |
|    * comme get_param() avec les spécificités de sget()
 | |
|    *
 | |
|    * Si le paramètre est vide ou inexistant, prendre la variable de session du
 | |
|    * même nom si elle existe. Si la valeur est non nulle, mettre à jour la
 | |
|    * session avec la valeur du paramètre.
 | |
|    */
 | |
|   static final function sget_param($name, $default=null, $session_key=null) {
 | |
|     if ($session_key === null) $session_key = $name;
 | |
|     $value = self::get_param($name, null);
 | |
|     if ($value === null) $value = session::get($session_key, $default);
 | |
|     if (base::nz($value)) session::set($session_key, $value);
 | |
|     return $value;
 | |
|   }
 | |
| 
 | |
|   const SPARAM_NAME_SCHEMA = [
 | |
|     "name" => [null, null, "nom du paramètre"],
 | |
|     "default" => [null, null, "valeur par défaut du paramètre"],
 | |
|     "session_key" => [null, null, "nom de la clé dans la session"],
 | |
|   ];
 | |
| 
 | |
|   /**
 | |
|    * Obtenir des paramètres de formulaire, selon les règles de sget_param()
 | |
|    *
 | |
|    * chaque élément de $names peut avoir la structure
 | |
|    * [$name, $default=null, $session_key=null]
 | |
|    */
 | |
|   static final function sget_params(...$names): array {
 | |
|     $params = [];
 | |
|     foreach ($names as $nds) {
 | |
|       [$name, $default, $session_key] = md::get_values($nds, self::SPARAM_NAME_SCHEMA);
 | |
|       $params[$name] = self::sget_param($name, $default, $session_key);
 | |
|     }
 | |
|     return $params;
 | |
|   }
 | |
| 
 | |
|   /** comme set_params() avec les spécificités de sget() */
 | |
|   static final function sset_params(&$obj, ...$names): void {
 | |
|     $params = self::sget_params(...$names);
 | |
|     valx::set_values($obj, $params);
 | |
|   }
 | |
| 
 | |
|   ##
 | |
| 
 | |
|   /** Supprimer les clés spécifiées dans l'objet destination ET dans la session */
 | |
|   static final function sclear(&$obj, ...$names): void {
 | |
|     if (is_array($obj) || $obj === null) {
 | |
|       if ($obj === null) $obj = [];
 | |
|       foreach ($names as $name) {
 | |
|         $obj[$name] = null;
 | |
|         session::del($name);
 | |
|       }
 | |
|     } elseif ($obj instanceof ArrayAccess) {
 | |
|       foreach ($names as $name) {
 | |
|         $obj[$name] = null;
 | |
|         session::del($name);
 | |
|       }
 | |
|     } else {
 | |
|       foreach ($names as $name) {
 | |
|         oprop::set($obj, $name, null);
 | |
|         session::del($name);
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| }
 |