/[openfoncier]/trunk/obj/om_dbform.class.php
ViewVC logotype

Diff of /trunk/obj/om_dbform.class.php

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 305 by atreal, Wed Mar 28 07:19:34 2012 UTC revision 691 by nhaye, Wed Nov 14 16:01:49 2012 UTC
# Line 27  class om_dbform extends dbForm { Line 27  class om_dbform extends dbForm {
27       */       */
28      var $om_formulaire = "om_formulaire";      var $om_formulaire = "om_formulaire";
29    
30        
31        
32            /**
33         * Constructeur
34         *
35         * @param string $id
36         * @param object $db Objet de connexion DB
37         * @param boolean $DEBUG Mode debug (@deprecated)
38         */
39        function constructeur($id, &$db, $DEBUG = false) {
40            if (defined('REST_REQUEST')) { // $this->REST
41                logger::instance()->display_log = false;
42            }
43            //
44            if (isset($GLOBALS["f"])) {
45                $this->f = $GLOBALS["f"];
46            }
47            // Le framework REST est utilisee
48            $this->errors = array();
49            
50            // Affectation de l'identifiant de base de donnees dans l'attribut db
51            // de l'objet
52            $this->db = $db;
53            // Inclusion du fichier de parametre de la table pour recuperer les
54            // trois parametres permettant de construire la requete de selection
55            // $champs - clause select
56            // $tableSelect - clause from
57            // $selection - clause where
58            $fichier = "../sql/".$this->db->phptype."/".$this->table.".form.inc.php";
59            if (file_exists($fichier)) {
60                include $fichier;
61            } else {
62                $fichier = "../sql/".$this->db->phptype."/".$this->table.".form.inc";
63                if (file_exists($fichier)) {
64                    include $fichier;
65                }
66            }
67            // Sauvegarde des actions contextuelles supplementaires
68            if (isset($portlet_actions)) {
69                $this->actions_sup = $portlet_actions;
70            }
71            //Si le flag $archivable est posé
72            //if(isset($archivable) and $archivable){
73            //    $this->archivable=TRUE;
74            //} else {
75            //    $this->archivable=FALSE;
76            //}
77            // Concatenation des champs pour constitution de la clause select
78            $listeChamp = "";
79            foreach ($champs as $elem) {
80                $listeChamp .= $elem.",";
81            }
82            // Suppresion de la derniere virgule
83            $listeChamp = substr($listeChamp, 0, strlen($listeChamp)-1);
84            // Initialisation de la variable selection
85            if (!isset($selection)) {
86                $selection = "";
87            }
88            // Concatenation de la requete de selection
89            $sql = " select ".$listeChamp." from ".$tableSelect." ";
90            // Si mode ajout
91            if ($id == "]") {
92                // Remplacement du 'and' par 'where' dans la varibale $selection
93                $selection = ltrim($selection);
94                if (strtolower(substr($selection, 0, 3)) == "and") {
95                    $selection = " where ".substr($selection, 4, strlen($selection));
96                }
97            } else { // Si mode modification ou suppression
98                // Clause where en fonction du type de la cle primaire
99                if ($this->typeCle == "A") {
100                    $sql .= " where ".$this->clePrimaire." like '".$id."' ";
101                } else {
102                    $sql .= " where ".$this->table.".".$this->clePrimaire." = ".$id." ";
103                }
104            }
105            $sql .= " ".$selection." ";
106            //print '$sql:'.$sql.'   ';
107            // Execution de la requete
108            $res = $db->limitquery($sql, 0, 1);
109            // Logger
110            $this->addToLog("constructeur(): db->limitquery(\"".str_replace(",",", ",$sql)."\", 0, 1);", VERBOSE_MODE);
111            // Si une erreur survient
112            if (database::isError($res, true)) {
113                // Appel de la methode de recuperation des erreurs
114                $this->erreur_db($res->getDebugInfo(), $res->getMessage(), $tableSelect);
115            } else {
116                // Recuperation des informations sur la structure de la table
117                // ??? compatibilite POSTGRESQL (len = -1, type vide, flags vide)
118                $info = $res->tableInfo();
119                // Initialisation de la cle a 0
120                $i = 0;
121                // Recuperation du nom de chaque champ dans l'attribut 'champs'
122                foreach ($info as $elem) {
123                    $this->champs[$i++] = $elem['name'];
124                }
125                // ??? Le $i devrait etre initialises a 0 pour chaque attribut suivant
126                // Recuperation de la taille de chaque champ dans l'attibut 'longueurMax'
127                foreach ($info as $elem) {
128                    $this->longueurMax[$i++] = $elem['len'];
129                }
130                // Recuperation du type de chaque champ dans l'attribut 'type'
131                // ??? Non utilise
132                foreach ($info as $elem) {
133                    $this->type[$i++] = $elem['type'];
134                }
135                // Recuperation du flag de chaque champ dans l'attribut 'flags'
136                // ??? Non utilise
137                foreach ($info as $elem) {
138                    $this->flags[$i++] = $elem['flags'];
139                }
140                // Recuperation de l'enregistrement resultat de la requete
141                while ($row =& $res->fetchRow()) {
142                    // Initialisation de la cle a 0
143                    $i = 0;
144                    // Recuperation de la valeur de chaque champ dans l'attribut 'val'
145                    foreach ($row as $elem) {
146                        $this->val[$i] = $elem;
147                        if (defined('REST_REQUEST')) { // $this->REST
148                            $this->valF[$this->champs[$i]] = $elem;
149                        }
150                        $i++;
151                    }
152                }
153            }
154        }
155    
156    
157    
158        /**
159         * Cette methode permet d'executer l'ajout (MODE 'insert') de l'objet dans
160         * la base de donnees.
161         *
162         * @param array $val
163         * @param object $db Objet de connexion DB
164         * @param boolean $DEBUG Mode debug (@deprecated)
165         */
166        function ajouter($val, &$db = NULL, $DEBUG = false) {
167            // Logger
168            $this->addToLog("ajouter() - begin", EXTRA_VERBOSE_MODE);
169            // Mutateur de valF
170            $this->setValF($val);
171            // Mutateur de valF specifique a l'ajout
172            $this->setValFAjout($val);
173            // Verification de la validite des donnees
174            $this->verifier($val, $db, $DEBUG);
175            // Verification specifique au MODE 'insert' de la validite des donnees
176            $this->verifierAjout($val, $db);
177            // Verification du verrou
178            $this->testverrou();
179            // Si les verifications precedentes sont correctes, on procede a
180            // l'ajout, sinon on ne fait rien et on affiche un message d'echec
181            if ($this->correct) {
182                // Appel au mutateur pour le calcul de la cle primaire (si la cle
183                // est automatique) specifique au MODE 'insert'
184                $this->setId($db);
185                // Execution du trigger 'before' specifique au MODE 'insert'
186                // Le premier parametre est vide car en MODE 'insert'
187                // l'enregistrement n'existe pas encore donc il n'a pas
188                // d'identifiant
189                $this->triggerajouter("", $db, $val, $DEBUG);
190                // Execution de la requete d'insertion des donnees de l'attribut
191                // valF de l'objet dans l'attribut table de l'objet
192                $res = $db->autoExecute(DB_PREFIXE.$this->table, $this->valF, DB_AUTOQUERY_INSERT);
193                // Si une erreur survient
194                if (database::isError($res, true)) {
195                    // Appel de la methode de recuperation des erreurs
196                    $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
197                } else {
198                    // Log
199                    $this->addToLog(_("Requete executee"), VERBOSE_MODE);
200                    // Log
201                    if(isset($val[$this->clePrimaire])) // ***
202                        $id = $val[$this->clePrimaire];
203                    else
204                        $id=$this->id;
205                    $message = _("Enregistrement")." ".$this->valF[$this->clePrimaire]." ";
206                    $message .= _("de la table")." \"".$this->table."\" ";
207                    $message .= "[ ".$db->affectedRows()." ";
208                    $message .= _("enregistrement(s) ajoute(s)")." ]";
209                    $this->addToLog($message, VERBOSE_MODE);
210                    // Message de validation
211                    $this->addToMessage(_("Vos modifications ont bien ete enregistrees.")."<br/>");
212                    // Mise en place du verrou pour ne pas valider plusieurs fois
213                    // le meme formulaire
214                    $this->verrouille();
215                
216                    // Execution du trigger 'after' specifique au MODE 'insert'
217                    // Le premier parametre est vide car en MODE 'insert'
218                    // l'enregistrement n'existe pas encore donc il n'a pas
219                    // d'identifiant
220                    $this->triggerajouterapres("", $db, $val, $DEBUG);
221                }
222            } else {
223                // Message d'echec (saut d'une ligne supplementaire avant le
224                // message pour qu'il soit mis en evidence)
225                $this->addToMessage("<br/>"._("SAISIE NON ENREGISTREE")."<br/>");
226            }
227            // Logger
228            $this->addToLog("ajouter() - end", EXTRA_VERBOSE_MODE);
229        }
230    
231    
232        /**
233         *
234         * @param array $val
235         * @param object $db Objet de connexion DB
236         */
237        function verifierAjout($val = array(), &$db = NULL) {
238    
239            // Verifier [verify]
240            // la cle primaire est obligatoire
241            // [primary key is compulsory]
242            if ($this->valF[$this->clePrimaire] == "") {
243                //
244                $this->correct = false;
245                //
246                $this->addToMessage("<br/>");
247                $this->addToMessage( _("L'\"identifiant\" est obligatoire")."&nbsp;");
248                $this->addToMessage("[&nbsp;"._($this->clePrimaire)."&nbsp;]");
249            }
250            if ($this->typeCle == "A") {
251                $sql = "select count(*) from ".DB_PREFIXE.$this->table." ";    
252                $sql .= "where ".$this->clePrimaire."='".$this->valF[$this->clePrimaire]."' ";
253                $nb = $db->getone($sql);
254                $this->addToLog("verifierAjout(): db->getone(\"".$sql."\");", VERBOSE_MODE);
255                if (database::isError($nb)) {
256                    $this->erreur_db($nb->getDebugInfo(), $nb->getMessage(), '');
257                }else{
258                    if ($nb > 0) {
259                        $this->correct = false;
260                        $this->addToMessage($nb." ");
261                        $this->addToMessage( _("cle primaire existante"));
262                        $this->addToMessage(" ".$this->table."<br />");
263                    }
264                }
265            }
266        }
267    
268        
269        /**
270         * Cette methode permet d'executer la modification (MODE 'update') de
271         * l'objet dans la base de donnees.
272         *
273         * @param array $val
274         * @param object $db Objet de connexion DB
275         * @param boolean $DEBUG Mode debug (@deprecated)
276         */
277        function modifier($val = array(), &$db = NULL, $DEBUG = false) {
278    
279            // Logger
280            $this->addToLog("modifier() - begin", EXTRA_VERBOSE_MODE);
281            // Recuperation de la valeur de la cle primaire de l'objet
282            if(isset($val[$this->clePrimaire]))
283                $id = $val[$this->clePrimaire];
284            else
285                $id=$this->id;
286            // Appel au mutateur de l'attribut valF de l'objet
287            $this->setValF($val);
288            // Verification de la validite des donnees
289            $this->verifier($val, $db, $DEBUG);
290            // Verification du verrou
291            $this->testverrou();
292            // Si les verifications precedentes sont correctes, on procede a
293            // la modification, sinon on ne fait rien et on affiche un message
294            // d'echec
295            if ($this->correct) {
296                // Execution du trigger 'before' specifique au MODE 'update'
297                $this->triggermodifier($id, $db, $val, $DEBUG);
298                // Execution de la requête de modification des donnees de l'attribut
299                // valF de l'objet dans l'attribut table de l'objet
300                $res = $db->autoExecute(DB_PREFIXE.$this->table, $this->valF, DB_AUTOQUERY_UPDATE, $this->getCle($id));
301                // Si une erreur survient
302                if (database::isError($res, true)) {
303                    // Appel de la methode de recuperation des erreurs
304                    $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
305                } else {
306                    // Log
307                    $this->addToLog(_("Requete executee"), VERBOSE_MODE);
308                    // Log
309                    $message = _("Enregistrement")."&nbsp;".$id."&nbsp;";
310                    $message .= _("de la table")."&nbsp;\"".$this->table."\"&nbsp;";
311                    $message .= "[&nbsp;".$db->affectedRows()."&nbsp;";
312                    $message .= _("enregistrement(s) mis a jour")."&nbsp;]";
313                    $this->addToLog($message, VERBOSE_MODE);
314                    // Message de validation
315                    if ($db->affectedRows() == 0) {
316                        $this->addToMessage(_("Attention vous n'avez fait aucune modification.")."<br/>");
317                    } else {
318                        $this->addToMessage(_("Vos modifications ont bien ete enregistrees.")."<br/>");
319                    }
320                    // Mise en place du verrou pour ne pas valider plusieurs fois
321                    // le meme formulaire
322                    $this->verrouille();
323                
324                    // Execution du trigger 'after' specifique au MODE 'update'
325                    $this->triggermodifierapres($id, $db, $val, $DEBUG);
326                }
327            } else {
328                // Message d'echec (saut d'une ligne supplementaire avant le
329                // message pour qu'il soit mis en evidence)
330                $this->addToMessage("<br/>"._("SAISIE NON ENREGISTREE")."<br/>");
331            }
332            // Logger
333            $this->addToLog("modifier() - end", EXTRA_VERBOSE_MODE);
334        }
335    
336    
337        /**
338         * Cette methode permet d'executer la suppression (MODE 'delete') de
339         * l'objet dans la base de donnees.
340         *
341         * @param array $val
342         * @param object $db Objet de connexion DB
343         * @param boolean $DEBUG Mode debug (@deprecated)
344         */
345        function supprimer($val = array(), &$db = NULL, $DEBUG = false) {
346            // Logger
347            $this->addToLog("supprimer() - begin", EXTRA_VERBOSE_MODE);
348            // Recuperation de la valeur de la cle primaire de l'objet
349            if(isset($val[$this->clePrimaire]))
350                $id = $val[$this->clePrimaire];
351            else
352                $id=$this->id;
353            // Verification des contraintes d'integrite specifique au MODE 'delete'
354            $this->correct=true;
355            $this->cleSecondaire($id, $db, $val, $DEBUG);
356            // Verification du verrou
357            $this->testverrou();
358            // Si les verifications precedentes sont correctes, on procede a
359            // la suppression, sinon on ne fait rien et on affiche un message
360            // d'echec
361            if ($this->correct) {
362                // Execution du trigger 'before' specifique au MODE 'delete'
363                $this->triggersupprimer($id, $db, $val, $DEBUG);
364                // Construction de la requete de suppression de l'objet dans
365                // l'attribut table de l'objet
366                $sql = "delete from ".DB_PREFIXE.$this->table." where ".$this->getCle($id);
367                // Execution de la requete de suppression de l'objet
368                $res = $db->query($sql);
369                // Logger
370                $this->addToLog("supprimer(): db->query(\"".$sql."\");", VERBOSE_MODE);
371                // Si une erreur survient
372                if (database::isError($res, true)) {
373                    // Appel de la methode de recuperation des erreurs
374                    $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
375                } else {
376                    // Log
377                    $message = _("Enregistrement")."&nbsp;".$id."&nbsp;";
378                    $message .= _("de la table")."&nbsp;\"".$this->table."\"&nbsp;";
379                    $message .= "[&nbsp;".$db->affectedRows()."&nbsp;";
380                    $message .= _("enregistrement(s) supprime(s)")."&nbsp;]";
381                    $this->addToLog($message, VERBOSE_MODE);
382                    // Message de validation
383                    $this->addToMessage(_("La suppression a ete correctement effectuee.")."<br/>");
384                    // Mise en place du verrou pour ne pas valider plusieurs fois
385                    // le meme formulaire
386                    $this->verrouille();
387                
388                    // Execution du trigger 'after' specifique au MODE 'delete'
389                    $this->triggersupprimerapres($id, $db, $val, $DEBUG);
390                }
391            } else {
392                // Message d'echec (saut d'une ligne supplementaire avant le
393                // message pour qu'il soit mis en evidence)
394                $this->addToMessage("<br/>"._("SUPPRESSION NON EFFECTUEE")."<br/>");
395            }
396            // Logger
397            $this->addToLog("supprimer() - end", EXTRA_VERBOSE_MODE);
398        }
399    
400        /**
401         * Methode de verification de l'unicite d'une valeur pour chaque elements du tableau unique_key,
402         * ainsi que l'unicite de la cle multiple unique_multiple_key.
403         *
404         * @param objet $db Objet Base de donnees
405         */
406        function checkUniqueKey() {
407            $unique=true;
408            //Verification des cles uniques
409            if(!empty($this->unique_key)) {
410                foreach ($this->unique_key as $constraint) {
411                    if(!is_array($constraint)) {
412                        if(!is_null ($this->valF[$constraint])) {
413                            if(!$this->isUnique($constraint,$this->valF[$constraint])) {
414                                $this->addToMessage( _("La valeur saisie dans le champ")." <span class=\"bold\">");
415                                $this->addToMessage( (!defined('REST_REQUEST')) ? $this->form->lib[$constraint] : $constraint); // $this->REST
416                                $this->addToMessage( "</span> "._("existe deja, veuillez saisir une nouvelle valeur.")."<br/>");
417                                $unique=false;
418                            }
419                        }
420                    } else {
421                        //Verification du groupe de champs uniques
422                        $oneIsNull=false;
423                        if(!empty($constraint)) {
424                            $valueMultiple=array();
425                            foreach($constraint as $field) {
426                                $valueMultiple[]=$this->valF[$field];
427                                if(is_null($this->valF[$field])) {
428                                    $oneIsNull=true;
429                                }
430                            }
431                            if(!$oneIsNull) {
432                                if(!$this->isUnique($constraint,$valueMultiple)) {
433                                    foreach($constraint as $field) {
434                                        $temp[] = (!defined('REST_REQUEST')) ? $this->form->lib[$field] : $constraint; // $this->REST
435                                    }
436                                    $this->addToMessage( _("Les valeurs saisies dans les champs")." <span class=\"bold\">".implode("</span>, <span class=\"bold\">",$temp)."</span> "._("existent deja, veuillez saisir de nouvelles valeurs.")."<br/>");
437                                    $unique=false;
438                                }
439                            }
440                        }
441                    }
442                }
443            }
444            if(!$unique) {
445                $this->correct = false;
446            }
447        }
448    
449    
450    
451        /**
452         * Methode permettant de requeter la base afin de definir la validite du champ unique
453         *
454         * @param string $champ nom du champ unique
455         * @param string $value valeur à inserer dans la colonne
456         */
457        function isUnique($champ,$value) {
458            //Test sur un groupe de champs
459            if(is_array($champ) and is_array($value)) {
460                $sql = 'SELECT count(*) FROM '.DB_PREFIXE.$this->table." WHERE ".implode(" = ? AND ",$champ)." = ?";
461            } else {
462            //Test sur un champ
463                $sql = 'SELECT count(*) FROM '.DB_PREFIXE.$this->table." WHERE ".$champ." = ?";
464            }
465            if($this->getParameter('maj')) {
466                $sql .= " AND ".$this->clePrimaire." \!= ".$this->valF[$this->clePrimaire];
467            }
468            $nb = $this->db->getone($sql,$value);
469            $this->addToLog("isUnique() : db->getone(\"".$sql."\");", VERBOSE_MODE);
470            if (database::isError($nb, true)) {
471                // Affichage de l'erreur
472                $this->erreur_db($nb->getDebugInfo(), $nb->getMessage(), '');
473                return true;
474            } else {
475                //Si superieur a 0, pas unique
476                if ($nb > 0) {
477                    return false;
478                } else {
479                    return true;
480                }
481            }
482        }
483    
484    
485    
486        /**
487         * Methode de verification des contraintes not null,
488         * affiche une erreur si nul.
489         *
490         * @param objet $db Objet Base de donnees
491         */
492        function checkRequired() {
493            foreach($this->required_field as $field) {
494                //Ne test la cle primaire car n'a pas de valeur a l'ajout
495                // la cle primaire est automatiquement cree
496                if ($field == $this->clePrimaire) {
497                    continue;
498                }
499    
500                $error = false;
501    
502                /* En ajout - verification des requis
503    
504                   Fonctionnement formel de la condition:
505    
506                    SI le champ n'existe pas (est 'unset')
507                    OU le champ est vide
508    
509                    ALORS le formulaire n'est pas correct
510    
511                    SINON le formulaire est correct
512    
513                  Explication:
514    
515                    Les champs verifies sont les champs requis. S'ils n'existent
516                    pas en ajout ou qu'ils sont vide, un message apparait a l'ecran
517                    avertissant l'utilisateur que certains champs doivent etre
518                    remplis.
519    
520                */
521                if ($this->getParameter('maj') == 0 and
522                    (!isset($this->valF[$field]) or $this->valF[$field] == '')) {
523                    $error = true;
524                    $this->correct = false;
525    
526                /* En modification - verification des requis
527    
528                   Fonctionnement formel de la condition:
529    
530                    SI le champ existe (est 'set')
531                    ET le champ est vide
532    
533                    ALORS le formulaire n'est pas correct
534    
535                    SINON le formulaire est correct
536    
537                  Explication:
538    
539                    Les champs verifies sont les champs requis. S'ils existent
540                    et qu'ils sont vides alors un message apparait a l'ecran
541                    avertissant l'utilisateur que certains champs doivent etre
542                    remplis. Si ces champs sont tous saisis, le formulaire est
543                    correctement soumis. Par contre, si l'un des champs requis
544                    n'existe pas au moment de verification (il aurait ete 'unset'),
545                    il ne sera pas verifie, n'entrainera pas de formulaire incorrect
546                    et ne sera pas insere dans la base de donnees.
547                    
548                    Faire un 'unset' permet de ne pas mettre a jour certaines
549                    donnees sensibles en base a chaque soumission de formulaire.
550                    
551                    Faire un 'unset' permet egalement d'outre passer cette condition
552                    en mode de modification. On suppose qu'a l'ajout une valeur
553                    a ete inseree dans un champ, et qu'il n'est plus necessaire
554                    de verifier si ce champ est vide puisque sa valeur ne sera
555                    pas modifiee en base. Elle sera donc conservee.
556    
557                */
558                } elseif ($this->getParameter('maj') == 1
559                           and isset($this->valF[$field])
560                           and $this->valF[$field] == '') {
561                    $error = true;
562                    $this->correct = false;
563                }
564    
565                // ajout du message d'erreur
566                if ($error == true) {
567                    //$this->msg .= _('Le champ').' <span class="bold">'.($this->form->lib[$field]!=""?$this->form->lib[$field]:_($field)).'</span> '._('est obligatoire').".<br/>";
568                    $this->addToMessage( _('Le champ').' <span class="bold">'.((!defined('REST_REQUEST')) ? $this->form->lib[$field] :_($field)).'</span> '._('est obligatoire').".<br/>"); // $this->REST
569                }
570            }
571        }
572    
573    
574    
575    
576    
577        /**
578         *
579         */
580        function message() {
581            
582            // do not output anything in case of a REST request
583            if (defined('REST_REQUEST')) {
584                return;
585            }
586    
587            if ($this->msg != "") {
588    
589                //
590                $m = new message();
591    
592                //
593                if ($this->correct) {
594                    $class = "valid";
595                } else {
596                    $class = "error";
597                }
598                $m->displayMessage($class, $this->msg);
599    
600            }
601    
602        }
603    
604        
605    
606        /**
607         * Cette methode ne doit plus etre appelee, c'est 'message::isError($res)'
608         * qui s'occupe d'afficher le message d'erreur et de faire le 'die()'.
609         *
610         * @deprecated
611         */
612        function erreur_db($debuginfo, $messageDB, $table) {
613            if (!defined('REST_REQUEST')) { // $this->REST
614                die(_("Erreur de base de donnees. Contactez votre administrateur."));
615            } else {
616                $this->errors['db_debuginfo'] = $debuginfo;
617                $this->errors['db_message'] = $messageDB;
618                $this->addToLog("Erreur de BD pour table ".$table ." avec message: \"".$messageDB.
619                                "\" et debug info \"".$debuginfo."\"", VERBOSE_MODE);
620            }
621        }
622    
623    
624        /**
625         *
626         */
627        function addToLog($message, $type = DEBUG_MODE) {
628            if (defined('REST_REQUEST')) { // dans le cas d'utilisation du REST  $this->REST
629                logger::instance()->log("REST request class ".get_class($this)." - ".$message, $type);
630            } else {
631                logger::instance()->log("class ".get_class($this)." - ".$message, $type);
632            }
633        }
634    
635        // }}}
636        
637        /**
638         * Cette methode vide les valeurs des erreurs du tableau errors.
639         */
640        function clearErrors() {
641            foreach (array_keys($this->errors) as $key) {
642                $this->errors[$key] = '';
643            }
644        }
645  }  }
646    
647  ?>  ?>

Legend:
Removed from v.305  
changed lines
  Added in v.691

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26