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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 516 - (show annotations)
Wed Oct 17 17:13:43 2012 UTC (12 years, 3 months ago) by mlimic
File size: 25754 byte(s)
save
1 <?php
2 /**
3 * Ce fichier est destine a permettre la surcharge de certaines methodes de
4 * la classe om_dbform pour des besoins specifiques de l'application
5 *
6 * @package openmairie_exemple
7 * @version SVN : $Id$
8 */
9
10 /**
11 *
12 */
13 require_once PATH_OPENMAIRIE."om_dbform.class.php";
14
15 /**
16 *
17 */
18 require_once "om_formulaire.class.php";
19
20 /**
21 *
22 */
23 class om_dbform extends dbForm {
24
25 /**
26 *
27 */
28 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")."&nbsp;".$this->valF[$this->clePrimaire]."&nbsp;";
206 $message .= _("de la table")."&nbsp;\"".$this->table."\"&nbsp;";
207 $message .= "[&nbsp;".$db->affectedRows()."&nbsp;";
208 $message .= _("enregistrement(s) ajoute(s)")."&nbsp;]";
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
402 /**
403 * Methode de verification de l'unicite d'une valeur pour chaque elements du tableau unique_key,
404 * ainsi que l'unicite de la cle multiple unique_multiple_key.
405 *
406 * @param objet $db Objet Base de donnees
407 */
408 function checkUniqueKey() {
409 $unique=true;
410 //Verification des cles uniques
411 if(!empty($this->unique_key)) {
412 foreach ($this->unique_key as $constraint) {
413 if(!is_array($constraint)) {
414 if(!is_null ($this->valF[$constraint])) {
415 if(!$this->isUnique($constraint,$this->valF[$constraint])) {
416 $this->addToMessage( _("La valeur saisie dans le champ")." <span class=\"bold\">");
417 $this->addToMessage( (!defined('REST_REQUEST')) ? $this->form->lib[$constraint] : $constraint); // $this->REST
418 $this->addToMessage( "</span> "._("existe deja, veuillez saisir une nouvelle valeur.")."<br/>");
419 $unique=false;
420 }
421 }
422 } else {
423 //Verification du groupe de champs uniques
424 $oneIsNull=false;
425 if(!empty($constraint)) {
426 $valueMultiple=array();
427 foreach($constraint as $field) {
428 $valueMultiple[]=$this->valF[$field];
429 if(is_null($this->valF[$field])) {
430 $oneIsNull=true;
431 }
432 }
433 if(!$oneIsNull) {
434 if(!$this->isUnique($constraint,$valueMultiple)) {
435 foreach($constraint as $field) {
436 $temp[] = (!defined('REST_REQUEST')) ? $this->form->lib[$field] : $constraint; // $this->REST
437 }
438 $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/>");
439 $unique=false;
440 }
441 }
442 }
443 }
444 }
445 }
446 if(!$unique) {
447 $this->correct = false;
448 }
449 }
450
451
452
453 /**
454 * Methode permettant de requeter la base afin de definir la validite du champ unique
455 *
456 * @param string $champ nom du champ unique
457 * @param string $value valeur à inserer dans la colonne
458 */
459 function isUnique($champ,$value) {
460 //Test sur un groupe de champs
461 if(is_array($champ) and is_array($value)) {
462 $sql = 'SELECT count(*) FROM '.DB_PREFIXE.$this->table." WHERE ".implode(" = ? AND ",$champ)." = ?";
463 } else {
464 //Test sur un champ
465 $sql = 'SELECT count(*) FROM '.DB_PREFIXE.$this->table." WHERE ".$champ." = ?";
466 }
467 if($this->getParameter('maj')) {
468 $sql .= " AND ".$this->clePrimaire." \!= ".$this->valF[$this->clePrimaire];
469 }
470 $nb = $this->db->getone($sql,$value);
471 $this->addToLog("isUnique() : db->getone(\"".$sql."\");", VERBOSE_MODE);
472 if (database::isError($nb, true)) {
473 // Affichage de l'erreur
474 $this->erreur_db($nb->getDebugInfo(), $nb->getMessage(), '');
475 return true;
476 } else {
477 //Si superieur a 0, pas unique
478 if ($nb > 0) {
479 return false;
480 } else {
481 return true;
482 }
483 }
484 }
485
486
487
488 /**
489 * Methode de verification des contraintes not null,
490 * affiche une erreur si nul.
491 *
492 * @param objet $db Objet Base de donnees
493 */
494 function checkRequired() {
495 foreach($this->required_field as $field) {
496 //Ne test la cle primaire car n'a pas de valeur a l'ajout
497 // la cle primaire est automatiquement cree
498 if ($field == $this->clePrimaire) {
499 continue;
500 }
501
502 $error = false;
503
504 /* En ajout - verification des requis
505
506 Fonctionnement formel de la condition:
507
508 SI le champ n'existe pas (est 'unset')
509 OU le champ est vide
510
511 ALORS le formulaire n'est pas correct
512
513 SINON le formulaire est correct
514
515 Explication:
516
517 Les champs verifies sont les champs requis. S'ils n'existent
518 pas en ajout ou qu'ils sont vide, un message apparait a l'ecran
519 avertissant l'utilisateur que certains champs doivent etre
520 remplis.
521
522 */
523 if ($this->getParameter('maj') == 0 and
524 (!isset($this->valF[$field]) or $this->valF[$field] == '')) {
525 $error = true;
526 $this->correct = false;
527
528 /* En modification - verification des requis
529
530 Fonctionnement formel de la condition:
531
532 SI le champ existe (est 'set')
533 ET le champ est vide
534
535 ALORS le formulaire n'est pas correct
536
537 SINON le formulaire est correct
538
539 Explication:
540
541 Les champs verifies sont les champs requis. S'ils existent
542 et qu'ils sont vides alors un message apparait a l'ecran
543 avertissant l'utilisateur que certains champs doivent etre
544 remplis. Si ces champs sont tous saisis, le formulaire est
545 correctement soumis. Par contre, si l'un des champs requis
546 n'existe pas au moment de verification (il aurait ete 'unset'),
547 il ne sera pas verifie, n'entrainera pas de formulaire incorrect
548 et ne sera pas insere dans la base de donnees.
549
550 Faire un 'unset' permet de ne pas mettre a jour certaines
551 donnees sensibles en base a chaque soumission de formulaire.
552
553 Faire un 'unset' permet egalement d'outre passer cette condition
554 en mode de modification. On suppose qu'a l'ajout une valeur
555 a ete inseree dans un champ, et qu'il n'est plus necessaire
556 de verifier si ce champ est vide puisque sa valeur ne sera
557 pas modifiee en base. Elle sera donc conservee.
558
559 */
560 } elseif ($this->getParameter('maj') == 1
561 and isset($this->valF[$field])
562 and $this->valF[$field] == '') {
563 $error = true;
564 $this->correct = false;
565 }
566
567 // ajout du message d'erreur
568 if ($error == true) {
569 //$this->msg .= _('Le champ').' <span class="bold">'.($this->form->lib[$field]!=""?$this->form->lib[$field]:_($field)).'</span> '._('est obligatoire').".<br/>";
570 $this->addToMessage( _('Le champ').' <span class="bold">'.((!defined('REST_REQUEST')) ? $this->form->lib[$field] :_($field)).'</span> '._('est obligatoire').".<br/>"); // $this->REST
571 }
572 }
573 }
574
575
576
577
578
579 /**
580 *
581 */
582 function message() {
583
584 // do not output anything in case of a REST request
585 if (defined('REST_REQUEST')) {
586 return;
587 }
588
589 if ($this->msg != "") {
590
591 //
592 $m = new message();
593
594 //
595 if ($this->correct) {
596 $class = "valid";
597 } else {
598 $class = "error";
599 }
600 $m->displayMessage($class, $this->msg);
601
602 }
603
604 }
605
606
607
608 /**
609 * Cette methode ne doit plus etre appelee, c'est 'message::isError($res)'
610 * qui s'occupe d'afficher le message d'erreur et de faire le 'die()'.
611 *
612 * @deprecated
613 */
614 function erreur_db($debuginfo, $messageDB, $table) {
615 if (!defined('REST_REQUEST')) { // $this->REST
616 die(_("Erreur de base de donnees. Contactez votre administrateur."));
617 } else {
618 $this->errors['db_debuginfo'] = $debuginfo;
619 $this->errors['db_message'] = $messageDB;
620 $this->addToLog("Erreur de BD pour table ".$table ." avec message: \"".$messageDB.
621 "\" et debug info \"".$debuginfo."\"", VERBOSE_MODE);
622 }
623 }
624
625
626 /**
627 *
628 */
629 function addToLog($message, $type = DEBUG_MODE) {
630 if (defined('REST_REQUEST')) { // dans le cas d'utilisation du REST $this->REST
631 logger::instance()->log("REST request class ".get_class($this)." - ".$message, $type);
632 } else {
633 logger::instance()->log("class ".get_class($this)." - ".$message, $type);
634 }
635 }
636
637 // }}}
638
639 /**
640 * Cette methode vide les valeurs des erreurs du tableau errors.
641 */
642 function clearErrors() {
643 foreach (array_keys($this->errors) as $key) {
644 $this->errors[$key] = '';
645 }
646 }
647
648
649 }
650
651 ?>

Properties

Name Value
svn:keywords Id

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26