122 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| namespace nur\m\base;
 | |
| 
 | |
| use nur\A;
 | |
| use nur\date;
 | |
| use nur\func;
 | |
| use nur\m\IRowIncarnation;
 | |
| use nur\m\sql_date;
 | |
| 
 | |
| abstract class AbstractRowIncarnation implements IRowIncarnation {
 | |
|   static function fix_date_binding(&$value) {
 | |
|     if (date::is_datetime($value)) {
 | |
|       $value = sql_date::from_datetime($value);
 | |
|     } elseif (date::is_date($value)) {
 | |
|       $value = sql_date::from_date($value);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   static function fix_date_col(&$value) {
 | |
|     if (sql_date::is_date($value)) {
 | |
|       $value = sql_date::to_date($value);
 | |
|     } elseif (sql_date::is_datetime($value)) {
 | |
|       $value = sql_date::to_datetime($value);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * faut-il corriger les valeurs des champs avant de les fournir à la base de
 | |
|    * données
 | |
|    */
 | |
|   protected function FIX_BINDINGS(): bool {
 | |
|     return static::FIX_BINDINGS;
 | |
|   } const FIX_BINDINGS = true;
 | |
| 
 | |
|   /** faut-il force la casse des noms des champs en minuscule? */
 | |
|   protected function FORCE_LOWERCASE(): bool {
 | |
|     return static::FORCE_LOWERCASE;
 | |
|   } const FORCE_LOWERCASE = true;
 | |
| 
 | |
|   /**
 | |
|    * faut-il corriger les valeurs des champs qui viennent de la base de données?
 | |
|    */
 | |
|   protected function FIX_ROWS(): bool {
 | |
|     return static::FIX_ROWS;
 | |
|   } const FIX_ROWS = true;
 | |
| 
 | |
|   /** retourner la classe des lignes */
 | |
|   protected function ROW_CLASS(): ?string {
 | |
|     return static::ROW_CLASS;
 | |
|   } const ROW_CLASS = null;
 | |
| 
 | |
|   /**
 | |
|    * nom d'une fonction permettant de construire un identifiant pour une ligne,
 | |
|    * à retourner en tant que clé par l'itérateur ou dans un tableau.
 | |
|    *
 | |
|    * - utiliser la syntaxe ["static_method"] ou [null, "static_method"] pour
 | |
|    * indiquer que la fonction est en réalité [$ROW_CLASS, "static_method"]
 | |
|    * - utiliser la syntaxe ["->method"] ou [anything, "->method"] pour indiquer
 | |
|    * qu'il faut d'abord instancier $ROW_CLASS($row) avant d'appeler la méthode
 | |
|    */
 | |
|   protected function GENKEY_FUNC(): ?array {
 | |
|     return static::GENKEY_FUNC;
 | |
|   } const GENKEY_FUNC = null;
 | |
| 
 | |
|   function createBindings(?array &$bindings, ?array $filter, $row=null, ?array $results=null): void {
 | |
|     A::merge($bindings, $filter, $row, $results);
 | |
|   }
 | |
| 
 | |
|   function loadResults(?array &$results, array $bindings): void {
 | |
|     if ($results === null) return;
 | |
|     foreach ($results as $key => &$value) {
 | |
|       $value = A::get($bindings, $key);
 | |
|     }; unset($value);
 | |
|   }
 | |
| 
 | |
|   /** corriger une valeur avant de la fournir à la base de données */
 | |
|   protected function fixBinding(&$value, $key=null): void {
 | |
|   }
 | |
| 
 | |
|   function prepareBindings(?array &$bindings): void {
 | |
|     if ($bindings === null || !$this->FIX_BINDINGS()) return;
 | |
|     foreach ($bindings as $key => &$value) {
 | |
|       $this->fixBinding($value, $key);
 | |
|     }; unset($value);
 | |
|   }
 | |
| 
 | |
|   /** corriger une valeur provenant de la base de données */
 | |
|   protected function fixCol(&$value, $key=null): void {
 | |
|   }
 | |
| 
 | |
|   function loadRow(&$row, &$rowKey): void {
 | |
|     if (!is_array($row)) return;
 | |
|     if ($this->FORCE_LOWERCASE()) {
 | |
|       $row = array_change_key_case($row, CASE_LOWER);
 | |
|     }
 | |
|     if ($this->FIX_ROWS()) {
 | |
|       foreach ($row as $key => &$value) {
 | |
|         $this->fixCol($value, $key);
 | |
|       }; unset($value);
 | |
|     }
 | |
|     $row_class = $this->ROW_CLASS();
 | |
|     $genkey_func = $this->GENKEY_FUNC();
 | |
|     if ($row_class !== null) {
 | |
|       if ($genkey_func !== null) {
 | |
|         func::fix_static($genkey_func, $row_class);
 | |
|         if (func::is_method($genkey_func)) {
 | |
|           $row = func::cons($row_class, $row);
 | |
|           func::fix_method($genkey_func, $row);
 | |
|           $rowKey = func::call($genkey_func);
 | |
|         } else {
 | |
|           $rowKey = func::call($genkey_func, $row);
 | |
|           $row = func::cons($row_class, $row);
 | |
|         }
 | |
|       } else {
 | |
|         $row = func::cons($row_class, $row);
 | |
|       }
 | |
|     } elseif ($genkey_func !== null) {
 | |
|       $rowKey = func::call($genkey_func, $row);
 | |
|     }
 | |
|   }
 | |
| }
 |