Calculettes pour l'hydraulique
formulaire.class.php
Aller à la documentation de ce fichier.
1 <?php
2 abstract class formulaire {
3 
4  /**
5  * Structure du formulaire qui contient un tableau avec les regroupements de champs (fieldset).
6  * Dans un fieldset, on a :
7  * - 0 : identifiant utilisé sur l'élément id (qui sera suivi de "_fs')
8  * - 1 : tableau contenant la description des champs, pour chaque champ, on a une clé correspondant au code du champ (name) et un tableau avec :
9  * - 0 : code de langue du libellé du champ
10  * - 1 : valeur par défaut du champ ou chaîne commençant par "form_" donnant le nom du squelette à charger dans le répertoire "hyd_inc" du plugin
11  * - 3 : Codes de contrôle qui signifient :
12  * - o : Champ obligatoire (une valeur différente de "" est exigée)
13  * - p : Valeur strictement positive exigée
14  * - n : Valeur nulle acceptée (à associer systématiquement avec p)
15  * - s : chaîne de caractère acceptée (Une valeur numérique est exigée sinon)
16  * - 2 : Type de fieldset :
17  * - fix : Valeur fixe uniquement (pas de boutons radios)
18  * - var : Valeur fixe ou valeur variable
19  * - cal : var + valeur à calculer
20  */
21  protected $saisies;
22  public $champs_fvc; ///< Liste des codes de champs du formulaire avec bouton radio
23  public $champs; ///< Liste des codes de champs du formulaire
24  public $data; ///< Données du formulaire
25  protected $sVarCal=''; ///< Champ à calculer par défaut
26  protected $nb_col; ///< Nombre de colonnes du tableau du formulaire (2,4 ou 5)
27 
28  abstract protected function get_environnement();
29 
30  public function __construct() {
31  $this->champs_fvc = $this->get_champs_fvc();
32  $this->champs = $this->get_champs();
33  spip_log($this->saisies,'hydraulic',_LOG_DEBUG);
34  spip_log($this->champs,'hydraulic');
35  spip_log($this->champs_fvc,'hydraulic',_LOG_DEBUG);
36  }
37 
38  private function get_champs_fvc() {
39  $champs = array();
40  foreach($this->saisies as $fs) {
41  foreach($fs[1] as $cle=>$val) {
42  if($fs[2]!='fix') {
43  // Le champ peut être "à varier", il nécessite les vérifications des champs de variation
44  $champs[] = $cle;
45  }
46  }
47  }
48  return $champs;
49  }
50 
51  private function get_champs() {
52  $champs = array();
53  foreach($this->saisies as $fs) {
54  foreach($fs[1] as $cle=>$val) {
55  spip_log($cle,'hydraulic');
56  $champs[] = $cle;
57  }
58  }
59  return $champs;
60  }
61 
62  public function champs_obligatoires($bCalc = false){
63  /*
64  * Ce tableau contient la liste de tous les champs du formulaire.
65  * La suite de cette fonction se chargera de supprimer les valeurs non obligatoires.
66  */
67  $tChOblig = $this->champs;
68  $tChCalc = $this->champs_fvc;
69 
70  if($bCalc) {
71  return $tChCalc;
72  }
73 
74  $choix_champs = array();
75  foreach($tChCalc as $valeur){
76  $choix_champs[$valeur] = _request('choix_champs_'.$valeur);
77  }
78 
79  foreach($choix_champs as $cle=>$valeur){
80  // Si le choix du select est de calculer une valeur...
81  if($valeur != 'fix'){
82  foreach($tChOblig as $cle1=>$valeur1){
83  if($cle == $valeur1){
84  // ... alors on peut supprimer de notre tableau le champs calculé (il n'est pas obligatoire car grisé)
85  unset($tChOblig[$cle1]);
86  // Permet de tasser le tableau
87  $tChOblig = array_values($tChOblig);
88  }
89  }
90  }
91  // Si le choix du select est de faire varier une valeur alors on ajoute les 3 champs nécessaires
92  if($valeur == 'var'){
93  $tChOblig[] = 'val_min_'.$cle;
94  $tChOblig[] = 'val_max_'.$cle;
95  $tChOblig[] = 'pas_var_'.$cle;
96  }
97  }
98  return $tChOblig;
99  }
100 
101 
102  public function charger() {
103  $valeurs = $this->get_environnement();
104  $valeurs['saisies'] = $this->saisies;
105  $valeurs['nb_col'] = $this->nb_col;
106  $valeurs['sVarCal'] = $this->sVarCal;
107  $valeurs['champs_fvc'] = $this->champs_fvc;
108 
109  // Initialisation de la valeur des champs pour le formulaire
110  foreach($this->saisies as $fs) {
111  foreach($fs[1] as $cle=>$val) {
112  $valeurs[$cle] = $val[1];
113  }
114  }
115 
116  // On parcourt tous le tableau des indices, et on initialise les valeurs des boutons radios, et des champs de variation
118  foreach($this->champs_fvc as $cle){
119  $valeurs['choix_champs_'.$cle] = 'fix';
120  $valeurs['val_min_'.$cle] = 1;
121  $valeurs['val_max_'.$cle] = 2;
122  $valeurs['pas_var_'.$cle] = 0.1;
123  if(_request('choix_champs_'.$cle)=='cal') {
124  $sVarCal = $cle;
125  }
126  }
127  $valeurs['choix_champs_'.$sVarCal] = 'cal';
128 
129  return $valeurs;
130  }
131 
132 
133  /**
134  * Charge les données d'un formulaire avec choix des variables fixées, qui varient et à calculer
135  * @param $bLibelles Remplit la clé tlib avec les libellés traduits des variables
136  * @return un tableau avec les clés suivantes:
137  * - Couples clés/valeur des champs du formulaire
138  * - iPrec : nombre de décimales pour la précision des calculs
139  * - tLib: tableau avec couples clés/valeurs des libellés traduits des champs du formulaire
140  * - sLang : la langue en cours
141  * - CacheFileName : Le nom du fichier de cache
142  * - min, max, pas : resp. le min, le max et le pas de variation de la variable qui varie
143  * - i : pointeur vers la variable qui varie
144  * - ValCal : Nom de la variable à calculer
145  * - ValVar : Nom de la variable qui varie
146  * @author David Dorchies
147  * @date Juillet 2012
148  */
149  function charge_data($bLibelles = true) {
150  global $spip_lang;
151 
152  $tChOblig = $this->champs_obligatoires();
153  $tChCalc = $this->champs_obligatoires(true);
154  spip_log($tChOblig,'hydraulic');
155  spip_log($tChCalc,'hydraulic');
156  $choix_radio = array();
157  $tLib = array();
158  $data=array();
159  $data['iPrec']=(int)-log10(_request('rPrec'));
160 
161  //On récupère les données
162  foreach($tChOblig as $champ) {
163  if (_request($champ)){
164  $data[$champ] = _request($champ);
165  } else {
166  $data[$champ] = 999.;
167  }
168  $data[$champ] = str_replace(',','.',$data[$champ]); // Bug #574
169  }
170  //spip_log($data,'hydraulic');
171  // On ajoute la langue en cours pour différencier le fichier de cache par langue
172  $data['sLang'] = $spip_lang;
173 
174  // Nom du fichier en cache pour calcul déjà fait
175  $data['CacheFileName']=md5(serialize($data));
176 
177  // On récupère les différents choix effectué sur les boutons radios ainsi que les libelles de tous les paramètres
178  foreach($tChCalc as $cle){
179  $choix_radio[$cle] = _request('choix_champs_'.$cle);
180  if($bLibelles) {$data['tLib'][$cle] = _T('hydraulic:param_'.$cle);}
181  }
182 
183  $data['min'] = 0;
184  $data['max'] = 0;
185  $data['pas'] = 1;
186  $data['i'] = 999.;
187 
188  foreach($choix_radio as $sVar=>$valeur){
189  // Si il y a une valeur a calculer
190  if($valeur == 'cal'){
191  $data['ValCal'] = $sVar; // Stockage du nom de la variable à calculer
192  }
193  // Sinon si une valeur varie
194  else if($valeur == 'var'){
195  // alors on récupère sa valeur maximum, minimum et son pas de variation
196  $data['min'] = _request('val_min_'.$sVar);
197  $data['max'] = _request('val_max_'.$sVar);
198  $data['pas'] = _request('pas_var_'.$sVar);
199  // On fait pointer la variable qui varie sur l'indice de parcours du tableau i
200  $data['ValVar'] = $sVar; // Stockage du nom de la variable qui varie
201  $data[$sVar] = &$data['i']; // Pointeur pour relier le compteur de boucle à la variable
202  }
203  }
204  // Pour afficher correctement la valeur maximum avec les pb d'arrondi des réels
205  $data['max'] += $data['pas']/2;
206 
207  $this->data = $data;
208  spip_log($data,'hydraulic',_LOG_DEBUG);
209  return $data;
210  }
211 
212 
213  /**
214  * Vérification des données transmises et génération des messages d'erreur pour le formulaire
215  * @note Il faut l'utiliser après un appel à charge_data
216  */
217  public function verifier() {
218  $tCtrl = array();
219  $tData = array();
220 
221  foreach($this->saisies as $fs) {
222  foreach($fs[1] as $cle=>$val) {
223  $tData[$cle] = (isset($this->data[$cle]))?$this->data[$cle]:999;
224  $tCtrl[$cle] = $val[2];
225  }
226  }
227 
228  $erreurs = array();
229  foreach($tCtrl as $Cle=>$Ctrl) {
230  $tData[$Cle] = trim(str_replace(',','.',$tData[$Cle]));
231  if(strpos($Ctrl,'o')!==false & (!isset($tData[$Cle]) | $tData[$Cle]=="")) {
232  // Champ obligatoire
233  $erreurs[$Cle] = _T('hydraulic:erreur_obligatoire');
234  } elseif(strpos($Ctrl,'s')===false & !preg_match('#^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$#', $tData[$Cle]) & $tData[$Cle]!="") {
235  // Valeurs numériques obligatoire
236  $erreurs[$Cle] = _T('hydraulic:erreur_non_numerique');
237  } else {
238  // Conversion des champs en valeur réelle
239  $tData[$Cle] = floatval($tData[$Cle]);
240  if(strpos($Ctrl,'p')!==false & strpos($Ctrl,'n')!==false & $tData[$Cle] < 0) {
241  // Contrôles des valeurs qui doivent être positives ou nulles
242  $erreurs[$Cle] = _T('hydraulic:erreur_val_positive_nulle');
243  } elseif(strpos($Ctrl,'p')!==false & strpos($Ctrl,'n')===false & $tData[$Cle] <= 0) {
244  // Contrôles des valeurs qui doivent être strictement positives
245  $erreurs[$Cle] = _T('hydraulic:erreur_val_positive');
246  }
247  }
248  }
249 
250  // On compte s'il y a des erreurs. Si oui, alors on affiche un message
251  if (count($erreurs)) {
252  $erreurs['message_erreur'] = _T('hydraulic:saisie_erreur');
253  }
254 
255  return $erreurs;
256  }
257 }
258 ?>
$nb_col
Nombre de colonnes du tableau du formulaire (2,4 ou 5)
champs_obligatoires($bCalc=false)
$data
Données du formulaire.
verifier()
Vérification des données transmises et génération des messages d&#39;erreur pour le formulaire.
charge_data($bLibelles=true)
Charge les données d&#39;un formulaire avec choix des variables fixées, qui varient et à calculer...
$saisies
Debuggage de la methode charger.
$champs_fvc
Liste des codes de champs du formulaire avec bouton radio.
$champs
Liste des codes de champs du formulaire.
get_environnement()
$sVarCal
Nom du champ à calculer par défaut.