source: pmb4.2/trunk/fuentes/pmb/classes/requester.class.php @ 815

Last change on this file since 815 was 815, checked in by jrpelegrina, 4 years ago

Initial release of pmb 4.2

  • Property svn:executable set to *
File size: 35.0 KB
Line 
1<?php
2// +-------------------------------------------------+
3// © 2002-2005 PMB Services / www.sigb.net pmb@sigb.net et contributeurs (voir www.sigb.net)
4// +-------------------------------------------------+
5// $Id: requester.class.php,v 1.10 2015-04-03 11:16:19 jpermanne Exp $
6
7if (stristr($_SERVER['REQUEST_URI'], ".class.php")) die("no access");
8
9require_once ($include_path.'/templates/requests.tpl.php');
10
11class requester {
12       
13        var $t_type = array();          //Table de definition des types de requetes                     
14        var $t_cont = array();          //Table de definition des contenus de requetes
15        var $t_univ = array();          //Table de definition des univers et relations
16        var $t_schema = array();        //Table schema de base
17        var $t_fct = array();           //Table de definition des fonctions
18        var $t_fct_grp = array();       //Table de definition des groupes de fonctions
19
20        var $t_join = array();          //Table de stockage des jointures
21
22        //Constructeur. 
23        function requester() {
24               
25                $rp = new reqParser();
26
27                $this->t_schema = $rp->run('req_schema');
28                $this->t_type = $rp->run('req_types');
29                $this->t_cont = $rp->run('req_contents');
30                $this->t_univ = $rp->run('req_universes');
31                $tmp = $rp->run('req_functions');
32                $this->t_fct = $tmp['REQ_FUNCTION'];
33                $this->t_fct_grp = $tmp['REQ_FUNCTION_GROUP'];
34        }
35
36
37        //Retourne un selecteur pour choix des univers
38        function getUnivSelector($selected=0, $change='') {
39               
40                global $charset;
41               
42                $form = "<select id='req_univ' name='req_univ' onChange=\"".$change."\">";
43                foreach($this->t_univ as $id=>$value) {
44                        $form.= "<option value='$id'";
45                        if($id==$selected) $form.= " selected='selected'";
46                        $form.= " >".htmlentities($value['name'], ENT_QUOTES, $charset)."</option>";
47                }
48                $form.= "</select>";
49                return $form;
50        }
51
52
53        //Retourne un selecteur pour choix du type de requete
54        function getTypeSelector($selected=0, $change='') {
55               
56                global $charset;
57               
58                $form = "<select id='req_type' name='req_type' onChange=\"".$change."\" >";
59                foreach($this->t_type as $id=>$value) {
60                        $form.="<option value='$id'";
61                        if($id==$selected) $form.= " selected='selected'";
62                        $form.=" >".htmlentities($value['name'], ENT_QUOTES, $charset)."</option>";
63                }
64                $form.= "</select>";
65                return $form;
66        }
67
68       
69        //Retourne le nom de la table de reference d'un univers
70        function getReferenceTableName($univ_id=0){
71                if (!$univ_id) return '';
72                $itr=$this->t_univ[$univ_id]['ref'];
73                return $itr;
74        }
75
76       
77        //Retourne l'id de la table de reference d'un univers
78        function getReferenceTableID($univ_id=0){
79                if (!$univ_id) return 0;
80                $tr=$this->getReferenceTableName($univ_id);
81                $itr=$this->t_schema[$tr];
82                return $itr;
83        }
84
85
86        //Retourne l'id d'une table a partir de son nom
87        function getTableID($table_name=''){
88                if (!$table_name) return 0;
89                $table_id=$this->t_schema[$table_name];
90                return $table_id;
91        }
92
93
94        //Retourne les informations sur une table a partir de son id
95        function getTableInfo($table_id=0){
96                if (!$table_id) return false;
97                return $this->t_schema[$table_id];
98        }
99
100
101        //Retourne la cle primaire d'une table
102        function getPrimaryKeyID($table_id=0){
103                if (!$table_id) return false;
104                $pkid=$this->t_schema[$table_id]['pkid'];
105                return $pkid;
106        }
107
108       
109        //Retourne les cles etrangeres d'une table
110        function getForeignKeys($table_id=0){
111                if (!$table_id) return false;
112                $t=array();
113                foreach($this->t_schema[$table_id]['fields'] as $k=>$v){
114                        if ($this->isForeignKey($k)) $t[]=$k;
115                }
116                return $t; 
117        }
118
119
120        //Retourne l'Id de la table accessible depuis une cle etrangere
121        function getForeignTableID($foreign_key=0) {
122                if(!$foreign_key) return false;
123                $pk=$this->t_schema['cp_links'][$foreign_key];
124                $tmp=explode('-',$pk);
125                return $tmp[0];
126        }
127
128
129        //Retourne true si le champ fait partie d'une relation enfant-parent
130        function isForeignKey($field_id=0){
131                if(!$field_id) return false;
132                if(array_key_exists($field_id,$this->t_schema['cp_links'])) return true;
133                        else return false;
134        }
135
136
137        //Retourne la liste des id des champs d'une table
138        function getTableFieldIDList($table_id=0, $with_FK='true'){
139                if(!$table_id) return false;
140                $t = array();
141                foreach($this->t_schema[$table_id]['fields'] as $k=>$v) {
142                        if ($with_FK){
143                                $t[]=$k;
144                        } else {
145                                if (!$this->isForeignKey($k)) $t[]=$k;
146                        }
147                }
148                return $t;
149        }
150
151
152        //Retourne la liste des informations pour les champs d'une table
153        function getTableFieldInfo($table_id=0, $with_FK='true'){
154                if(!$table_id) return false;
155                $t = array();
156                foreach($this->t_schema[$table_id]['fields'] as $k=>$v) {
157                        if ($with_FK){
158                                $t[$k]=$v;
159                        } else {
160                                if (!$this->isForeignKey($k)) $t[$k]=$v;
161                        }
162                }
163                return $t;
164        }
165
166       
167        //Construit un selecteur avec la liste des tables accessibles a partir d'un Univers
168        function getTableSelector($univ_id=0 ,$selected=0){
169               
170                global $charset;
171
172                if (!$univ_id) return false;
173
174                $u_info=$this->t_univ[$univ_id];
175               
176                $sel = "<select>\n";
177               
178                //Creation racine liens depuis les champs de la table de reference
179                //$dtree.="_dt_fiel_.add('U".$univ_id."',-1,'&nbsp;&nbsp;".addslashes($msg['req_fiel_lbl'])."');\n";
180
181                //Creation noeud table de base
182                $bt_id=$this->getReferenceTableID($univ_id);           
183                $t_info=$this->getTableInfo($bt_id);
184                $t_desc=$t_info['desc'];
185                $node_id='T'.$bt_id;
186                $sel.="<option value='".$node_id."' ";
187                if(!$selected || $bt_id==$selected) $sel.="selected='selected'" ;
188                $sel.=">".htmlentities($t_desc,ENT_QUOTES,$charset)."</option>";
189                //$link=$node_id;
190               
191                //Creation noeuds de l'arbre
192                //$dtree.=$this->getNodesTree($univ_id, $bt_id, $node_id);
193                               
194                //$dtree.= "_dt_fiel_.icon.root='../../images/req_fiel.gif';";
195                //$dtree.= "document.getElementById('req_fiel_tree').innerHTML = _dt_fiel_;\n";
196                $sel.= "</select>\n";
197                return $sel;
198        }
199       
200       
201        //Construit l'arbre des champs accessibles a partir d'un Univers
202        function getFielTree($univ_id=0 ){
203               
204                global $msg;
205
206                if (!$univ_id) return false;
207
208                $dtree = "<script type='text/javascript'>\n";
209                $dtree.= "_dt_fiel_ = new dTree('_dt_fiel_');\n";
210               
211                //Creation racine liens depuis les champs de la table de reference
212                $dtree.="_dt_fiel_.add('U".$univ_id."',-1,'&nbsp;&nbsp;".addslashes($msg['req_fiel_lbl'])."');\n";
213
214                //Creation noeud table de base
215                $bt_id=$this->getReferenceTableID($univ_id);           
216                $t_info=$this->getTableInfo($bt_id);
217                $t_desc=$t_info['desc'];
218                $node_id='T'.$bt_id;
219                $dtree.="_dt_fiel_.add('".$node_id."','U".$univ_id."','".addslashes($t_desc)."');\n";
220                //$link=$node_id;
221               
222                //Creation noeuds de l'arbre
223                $dtree.=$this->getNodesTree($univ_id, $bt_id, $node_id);
224                               
225                $dtree.= "_dt_fiel_.icon.root='../../images/req_fiel.gif';";
226                $dtree.= "document.getElementById('req_fiel_tree').innerHTML = _dt_fiel_;\n";
227                $dtree.= "</script>\n";
228                return $dtree;
229        }
230
231
232        //Construit les noeuds de l'arbre des champs accessibles a partir d'un univers
233        function getNodesTree($univ_id, $table_id, $prev_node_id=0, $prev_rel_id=0, $prev_desc=''){
234               
235                global $msg, $charset;
236               
237                //Info univers
238                $u_info=$this->t_univ[$univ_id];
239               
240                //Info table
241                $t_info=$this->getTableInfo($table_id);
242                $t_name=$t_info['name'];
243                $t_desc=$t_info['desc'];
244               
245                //Info champs
246                $f_info=$t_info['fields'];
247               
248                foreach($f_info as $f_id=>$f_tab) {
249
250                        $f_name=$f_tab['name'];
251                        $exc_fields=explode(',',$u_info[$prev_rel_id]['except']);
252                       
253                        if (!in_array($t_name.'.'.$f_name,$exc_fields)) {
254       
255                                //Affichage noeud champ
256                                $drag_text='';
257                                if(!$prev_rel_id) {
258                                        $drag_text.=$f_tab['desc'];
259                                        $node_id='F'.$f_id;
260                                } else {
261                                        $drag_text=$prev_desc.'.'.$f_tab['desc'];
262                                        $node_id=$prev_node_id.'_F'.$f_id;
263                                }
264                                $dtree.="_dt_fiel_.add('".$node_id."','".$prev_node_id."','".addslashes($f_tab['desc'])."', \"draggable='yes' dragtype='cell' dragtext='".htmlentities($drag_text, ENT_QUOTES, $charset)."' dragged_type='FI' dragged_id='".$node_id."' \", '#');\n";
265                               
266                                //Est-ce un champ lie?
267                                if (is_array($u_info['relations']['from'][$t_name.'.'.$f_name])) {
268                                        foreach ($u_info['relations']['from'][$t_name.'.'.$f_name] as $k=>$rel_id) {
269                                                $rel_to=explode('.',$u_info[$rel_id]['to']);
270                                                $rel_type=$u_info[$rel_id]['type'];
271                                                $rel_desc=$u_info[$rel_id]['desc'];
272                                                $rel_prev=$u_info[$rel_id]['prev'];
273                                                $rel_through=$u_info[$rel_id]['through'];
274                                                if ($prev_rel_id==$rel_prev) {
275                                                        switch($rel_type) {
276                                                                case 'S1' :
277                                                                        break;
278                                                                default :
279                                                                        //Calcul noeud relation
280                                                                        $r_node_id=$node_id.'_R'.$rel_id;
281                                                                       
282                                                                        //Affichage noeud relation                                             
283                                                                        $dtree.="_dt_fiel_.add('".$r_node_id."','".$prev_node_id."','".addslashes($rel_desc)."');\n";
284                                                                        $r_link=$r_node_id;
285                                                                       
286                                                                        //On descend dans l'arbre
287                                                                        $s_t_id=$this->t_schema[$rel_to[0]];
288                                                                        $dtree.=$this->getNodesTree($univ_id, $s_t_id, $r_link, $rel_id, $rel_desc);
289                                                                       
290                                                                        //Mise a jour table relations
291                                                                        $this->addJoin($univ_id, $rel_id);
292                                                                                                                               
293                                                                        //Est-ce une relation multivaluee?
294                                                                        if ($rel_through) {
295                                                                                $tmp=explode('.',$rel_through);
296                                                                                $tmp2=explode(',',$tmp[1]);
297                                                                                $lt_id=$this->getTableID($tmp[0]);
298                                                                                $lt_info=$this->getTableInfo($lt_id);
299                                                                                foreach($lt_info['fields'] as $lf_id=>$lf_tab){
300                                                                                        if (!in_array($lf_tab['name'], $tmp2)) {
301                                                                                                $drag_text=$rel_desc.'.'.$lf_tab['desc'];
302                                                                                                $lr_node_id=$r_node_id.'_F'.$lf_id;
303                                                                                                $dtree.="_dt_fiel_.add('".$lr_node_id."','".$r_node_id."','".addslashes($lf_tab['desc'])."', \"draggable='yes' dragtype='cell' dragtext='".htmlentities($drag_text, ENT_QUOTES, $charset)."' dragged_type='FI' dragged_id='".$lr_node_id."' \", '#');\n";
304                                                                                        }
305                                                                                }
306                                                                        }
307                                                                        break;
308                                                        }
309                                                }
310                                        }
311                                }
312                        }
313                }
314                return $dtree;
315        }       
316       
317       
318        //Ajout relations a la table des jointures
319        function addJoin($univ_id,$rel_id,$n=0) {
320
321                if (!($univ_id && $rel_id)) return;
322
323                $t_rel = $this->t_univ[$univ_id][$rel_id];
324                $tg_desc='';
325                if (!$t_rel['prev']) {
326                        $tg_desc=$this->t_univ[$univ_id]['name'];
327                } else {
328                        $tg_desc=$this->t_univ[$univ_id][$t_rel['prev']]['desc'];
329                }
330                $this->t_join[$rel_id][$n]['tg_desc']=$tg_desc;
331                $this->t_join[$rel_id][$n]['td_desc']=$t_rel['desc'];
332
333                switch($t_rel['type']) {
334                        case '11':
335                                $this->t_join[$rel_id][$n]['join']='S';
336                                break;
337                        case 'N0':
338                        case 'N1':
339                        case 'NN':
340                                $this->t_join[$rel_id][$n]['join']='R';
341                                break;
342                        default:
343                        case '0N':
344                        case '1N':
345                                $this->t_join[$rel_id][$n]['join']='L';
346                                break;
347                }
348                return;
349        }
350       
351       
352        //Retourne un formulaire pour la table des jointures
353        function getJoinTab() {
354               
355                global $charset,$joi_tab_line_select;
356               
357                $tpl='';
358                foreach($this->t_join as $rel_id=>$rels_tab) {
359                        foreach($rels_tab as $rel_tab){
360                                $tpl.=$joi_tab_line_select;
361                                $tpl = str_replace('!!tg_desc!!', htmlentities($rel_tab['tg_desc'],ENT_QUOTES,$charset), $tpl);
362                                $tpl = str_replace('!!td_desc!!', htmlentities($rel_tab['td_desc'],ENT_QUOTES,$charset), $tpl);
363                                $tpl = str_replace('!!R_rel!!','R'.$rel_id,$tpl);
364                                $tpl = str_replace('!!N_rel!!','R'.$rel_id,$tpl);
365/*                             
366 * Ancienne version, avec definition des jointures en fonction de la relation                   
367                                switch($rel_tab['join']) {
368                                        case 'S':       //jointure stricte
369                                                $tpl=str_replace('!!S_sel!!',"checked='checked'",$tpl);
370                                                break;
371                                        case 'R':       //jointure a droite
372                                                $tpl=str_replace('!!R_sel!!',"checked='checked'",$tpl);
373                                                break;
374                                        case 'L':       //jointure a gauche
375                                                $tpl=str_replace('!!L_sel!!',"checked='checked'",$tpl);
376                                                break;
377                                        case 'N':       //pas de jointure
378                                                $tpl=str_replace('!!N_sel!!',"checked='checked'",$tpl);
379                                                break;
380                                        default:
381                                                break;
382                                }
383                                $tpl=str_replace('!!S_sel!!','',$tpl);
384*/
385                                $tpl=str_replace('!!S_sel!!',"checked='checked'",$tpl);
386                               
387                                $tpl=str_replace('!!R_sel!!','',$tpl);
388                                $tpl=str_replace('!!L_sel!!','',$tpl);
389                                $tpl=str_replace('!!N_sel!!','',$tpl);
390                        }
391                }
392                return $tpl;
393        }
394
395       
396        //Construit l'arbre des fonctions SQL
397        function getFuncTree(){
398
399                global $msg, $charset;
400
401                $dtree = "<script type='text/javascript'>\n";
402                $dtree.= "_dt_func_ = new dTree('_dt_func_');\n";
403                $dtree.="_dt_func_.add(0,-1,'&nbsp;&nbsp;".addslashes($msg['req_func_lbl'])."');\n";
404
405                foreach($this->t_fct_grp as $k=>$v) {
406                        $g_name=$v['name'];
407                        $dtree.="_dt_func_.add(".($k).",0,'".addslashes($g_name)."');\n";
408                }
409               
410                foreach($this->t_fct as $k=>$v) {
411                                $f_name=$v['name'];
412                                //TODO Traduction des messages
413                                //$f_desc=$msg['req_fct_'.$f_name];
414                                $f_desc=$f_name;
415                                $grp_id=1*$v['group'];
416                        $dtree.="_dt_func_.add(".$k.",".$grp_id.",'".addslashes($f_desc)."', \" draggable='yes' dragtype='cell' dragtext='".htmlentities($f_desc, ENT_QUOTES, $charset)."' dragged_type='FU' dragged_id='".$k."'\",'#' );\n";
417                }
418               
419                $dtree.= "_dt_func_.icon.root='../../images/req_func.gif';";
420                $dtree.= "document.getElementById('req_func_tree').innerHTML = _dt_func_;\n";
421                $dtree.= "</script>\n";
422                return $dtree;
423        }
424               
425
426        //Construit l'arbre des sous-requetes SQL
427        function getSubrTree(){
428
429                global $msg,$charset,$dbh;
430
431                $dtree='';
432                $q = "select idproc, name, comment, libproc_classement, num_classement from procs left join procs_classements on idproc_classement=num_classement ";
433                $q.= "where trim(requete) like('select %') ";
434                $q.= "order by libproc_classement,name ";
435               
436                $r = pmb_mysql_query($q, $dbh);
437                if(pmb_mysql_num_rows($r)) {
438
439                        $dtree = "<script type='text/javascript'>\n";
440                        $dtree.= "_dt_subr_ = new dTree('_dt_subr_');\n";
441                        $dtree.= "_dt_subr_.add(0,-1,'&nbsp;&nbsp;".addslashes($msg['req_subr_lbl'])."');\n";                   
442                        $t_num_classement=array();
443
444                        while(($row=pmb_mysql_fetch_object($r))) {
445                                if(in_array($row->num_classement,$t_num_classement)===false) {
446                                        if(!$row->num_classement) {
447                                                $libproc_classement=$msg['proc_clas_aucun'];
448                                        } else {
449                                                $libproc_classement=$row->libproc_classement;
450                                        }
451                                        $t_num_classement[]=$row->num_classement;
452                                        $dtree.= "_dt_subr_.add('c_".$row->num_classement."',0,'".addslashes($libproc_classement)."');\n";
453                                }
454                                $dtree.="_dt_subr_.add(".$row->idproc.",'c_".$row->num_classement."','".addslashes($row->name)."', \" draggable='yes' dragtype='cell' dragtext='".htmlentities($row->name, ENT_QUOTES, $charset)."' dragged_type='SU' dragged_id='".$row->idproc."'\",'#' );\n";
455                        }
456                        $dtree.= "_dt_subr_.icon.root='../../images/req_subr.gif';";
457                        $dtree.= "document.getElementById('req_subr_tree').innerHTML = _dt_subr_;\n";
458                        $dtree.= "</script>\n";
459                }
460               
461                return $dtree;
462        }
463       
464       
465        //Construction requete a partir du formulaire poste
466        function buildRequest($req_type,$req_univ,$req_nb_lines,$req_datas) {
467
468                global $msg;
469                if (!$req_type || !$req_univ || !$req_nb_lines || !is_array($req_datas)) return;
470
471                //TODO a mettre a jour au fur et a mesure de l'evolution du soft
472                if ($req_type!='2') return ;
473
474                //donnees de la requete
475                $t_da=$req_datas['DA']; //donnees
476                $t_fi=$req_datas['FI']; //filtres
477                $t_va=$req_datas['VA']; //valeurs
478                $t_al=$req_datas['AL']; //alias
479                $t_vi=$req_datas['VI']; //visibilites
480                $t_gr=$req_datas['GR']; //regroupements
481                $t_so=$req_datas['SO']; //ordres
482                $t_jo=$req_datas['JO']; //jointures
483                $t_li=$req_datas['LI']; //limites
484               
485                $t_sql= array();                //Table de stockage des elements de la requete SQL
486
487                //Type de la requete
488                $t_sql['type']=$this->t_type[$req_type]['type'];
489
490                $t_rel=array();
491
492                //Pour chacune des lignes de la requete
493                for($i=1;$i<$req_nb_lines+1;$i++) {
494               
495                        //recuperation donnees
496                        if(is_array($t_da[$i]) && count($t_da[$i])) {
497                                $t=$this->buildDataContent($t_da[$i]);
498                                if(count($t['R'])) $t_rel+=$t['R'];
499                                if(count($t['D'])) $t_sql['data'][$i]=$t['D'];
500                                unset($t);
501                        }
502                       
503                        //recuperation valeurs
504                        if (is_array($t_va[$lig])) {
505                        }
506
507                        //recuperation filtres
508                        if(is_array($t_fi[$i]) && count($t_fi[$i])) {
509                                $t=$this->buildFilterContent($t_fi[$i]);
510                                if(count($t['R'])) $t_rel+=$t['R'];
511                                if(count($t['F'])) $t_sql['filter'][$i]=$t['F'];
512                                unset($t);
513                        }
514               
515                        //recuperation alias
516                        if (trim($t_al[$i][0])) $t_sql['alias'][$i]=$t_al[$i][0];
517                       
518                        //recuperation visibilites
519                        if($t_vi[$i][0]) $t_sql['visibility'][$i]=$t_vi[$i][0];
520
521                        //recuperation regroupements
522                        if($t_gr[$i][0]) $t_sql['group'][$i]=$t_gr[$i][0];
523                       
524                        //recuperation tris
525                        if($t_so[$i][0]) {
526                                switch ($t_so[$i][0]){
527                                        case '1':
528                                                $t_sql['sort'][$i]='asc';
529                                                break;
530                                        case '2':
531                                                $t_sql['sort'][$i]='desc';
532                                                break;
533                                        case '0':
534                                        default:
535                                                break;
536                                }
537                        }
538
539                }
540
541
542                //Creation jointures et tables
543                //Suppression des jointures redondantes
544                $t_rel2=array_unique($t_rel);
545
546                //Tri par nb de relations
547                $t_rel3=array();
548                foreach($t_rel2 as $v2) {
549                        $t_rel3[substr_count($v2,'_')][] =$v2;
550                }
551                ksort($t_rel3);
552
553                //Liste des jointures a prendre en consideration
554                $s_rel='';
555                while(count($t_rel3)!==0) {
556                        $t_rel4=array_pop($t_rel3);
557                        foreach($t_rel4 as $v4) {
558                                if(strpos($s_rel,$v4)===false) $s_rel.=$v4;
559                        }
560                }
561                $t_rel5 = explode('_',$s_rel);
562
563
564                //Liste des tables a prendre en compte dans la requete
565                $t_sql['from']=array();
566                //La table de reference
567                $t_sql['from'][0][0]['prev']=0;
568                $t_sql['from'][0][0]['t_from']=$this->t_schema[$this->getReferenceTableID($req_univ)]['name'];
569                //Pour chaque relation
570                foreach($t_rel5 as $v5) {
571                        if($v5) {
572                                $t_rel6 = $this->getFullJoin($req_univ, $v5, $t_jo);
573                                $t_sql['from']=array_merge($t_sql['from'],$t_rel6);
574                        }
575                }
576
577               
578                //*********************************************************************
579                //Creation de la requete !!!
580                $request = '';
581                //Le type
582                $request.= $t_sql['type'].' ';
583
584                //Les donnees
585                if (is_array($t_sql['data'])) {
586                        $t_data=array();
587                        foreach ($t_sql['data'] as $k6=>$v6) {
588                                if ($t_sql['visibility'][$k6]) {
589                                        $t_data[$k6]=$v6;
590                                        if($t_sql['alias'][$k6]) $t_data[$k6].= " as \"".$t_sql['alias'][$k6]."\"";
591                                }
592                        }
593                        $s_data=implode(", ",$t_data);
594                        $request.=$s_data.' ';
595                } else {
596                        $request.="* ";
597                }
598               
599                //les tables et jointures
600                $t_from=array();
601                foreach($t_sql['from'] as $k7=>$v7) {
602                        if (!$k7) {
603                                $t_from[]=$v7[0]['t_from'].' ';
604                        } else {
605                               
606                                foreach($v7 as $k8=>$v8) {
607                                        $prefix = '';
608                                        if ($v8['prev']) {
609                                                $prefix=$v8['prev'].'_';
610                                        }
611                                        switch($v8['join']) {
612                                                case 'L' :      //jointure a gauche
613                                                        $t_from[]='left join ';
614                                                        $t_from[]=$v8['t_to'].' as '.$k7.'_'.$v8['t_to'];
615                                                        $t_from[]=' on ';
616                                                        $t_from[]=$k7.'_'.$v8['t_to'].'.'.$v8['f_to'].'=';
617                                                        $t_from[]=$prefix.$v8['t_from'].'.'.$v8['f_from'].' ';
618                                                        break;
619                                                case 'R':       //jointure a droite
620                                                        $t_from[]='right join ';
621                                                        $t_from[]=$v8['t_to'].' as '.$k7.'_'.$v8['t_to'];
622                                                        $t_from[]=' on ';
623                                                        $t_from[]=$k7.'_'.$v8['t_to'].'.'.$v8['f_to'].'=';
624                                                        $t_from[]=$prefix.$v8['t_from'].'.'.$v8['f_from'].' ';
625                                                        break;
626                                                case 'S':       //jointure stricte
627                                                        $t_from[]='join ';
628                                                        $t_from[]=$v8['t_to'].' as '.$k7.'_'.$v8['t_to'];
629                                                        $t_from[]=' on ';
630                                                        $t_from[]=$k7.'_'.$v8['t_to'].'.'.$v8['f_to'].'=';
631                                                        $t_from[]=$prefix.$v8['t_from'].'.'.$v8['f_from'].' ';
632                                                        break;
633                                                case 'N':       //Pas de jointure
634                                                default :
635                                                        $t_from[]=', ';
636                                                        $t_from[]=$v8['t_to'].' as '.$k7.'_'.$v8['t_to'];
637                                                        break;
638                                        } 
639                                }
640                        }
641                }
642                $s_from= 'from '.implode('',$t_from).' ';
643                $request.=$s_from;
644
645               
646                //Les clauses where
647                $s_filter='';
648                $last_data=$msg['req_error'];
649                if (is_array($t_sql['filter'])) {
650                        $t_filter=array();
651                        foreach ($t_sql['filter'] as $k6=>$v6) {
652                                for($i=$k6;$i>=0;$i--){
653                                        if($t_sql['data'][$i]) {
654                                                $last_data=$t_sql['data'][$i];
655                                                break;
656                                        }
657                                }
658                                foreach($v6 as $v7) {
659                                        if(count($t_filter[$k6])) {
660                                                $t_filter[$k6].=' OR '; 
661                                        }
662                                        $t_filter[$k6].=$last_data.$v7;
663                                }
664                        }
665                        $s_filter.='('.implode(") and (",$t_filter).')';
666                }
667                if($s_filter) {
668                        $request.= " where ".$s_filter." ";
669                }
670                               
671               
672                //Les regroupements
673                if (is_array($t_sql['group'])) {
674                        $t_group=array();
675                        foreach ($t_sql['group'] as $k8=>$v8) {
676                                if ($v8==1 && $t_sql['data'][$k8]) {
677                                        $t_group[]=$t_sql['data'][$k8];
678                                }
679                        }
680                        if (count($t_group!=0)) {
681                                $s_group=implode(", ",$t_group);
682                                $request.= "group by $s_group ";
683                        }
684                }
685               
686                //Les tris
687                if (is_array($t_sql['sort'])) {
688                        $t_sort=array();
689                        foreach ($t_sql['sort'] as $k9=>$v9) {
690                                $t_sort[]=$t_sql['data'][$k9].' '.$v9;
691                        }
692                        if (count($t_sort!=0)) {
693                                $s_sort=implode(", ",$t_sort);
694                                $request.='order by '.$s_sort.' ';
695                        }
696                }
697
698               
699                //Les limites
700                $s_limit='';
701                if(is_array($t_li)) {
702                        if ($t_li['B']!=='') {
703                                $s_limit.= $t_li['B'].', ';
704                        }
705                        if ($t_li['Q']!=='') {
706                                $s_limit.= $t_li['Q']; 
707                        }
708                }
709                if ($s_limit!=='') {
710                        $request.='limit '.$s_limit;
711                }
712
713                return $request;
714        }
715
716
717        //Extraction des parametres d'une fonction
718        //$f_id = id de fonction
719        function getFunction($f_id) {
720                $data=array();
721                if($this->t_fct[$f_id]['name']) {
722                        $data['id']=$this->t_fct[$f_id]['id'];
723                        $data['name']=$this->t_fct[$f_id]['name'];
724                        $data['parenthesis']=$this->t_fct[$f_id]['parenthesis'];
725                        $data['param']=$this->t_fct[$f_id]['param'];
726                        $data['filter']=$this->t_fct[$f_id]['filter'];
727                       
728                }
729                return $data;
730                       
731        }
732       
733        //Extraction d'une sous-requete
734        //$r_id = id de requete
735        function getSubRequest($r_id) {
736               
737                global $dbh;
738                $sub='';
739                $q = "select requete from procs where idproc='".$r_id."'";
740                $r = pmb_mysql_query($q,$dbh);
741                if(pmb_mysql_num_rows($r)) {
742                        $sub = '('.pmb_mysql_result($r,0,0).')';
743                }
744                return $sub;
745        }
746
747       
748        //Extraction des infos de champ et de relation a partir de l'identifiant poste
749        //$f_id = id de champ
750        function getField($f_id) {
751               
752                $data=array();
753                $data['D']='';          //Stockage donnees calculees
754                $data['R']='';          //Stockage relations trouvees
755                $tmp=explode('_',$f_id);
756                $tmp2=explode('-',end($tmp));   //Id dernier champ
757                $t_id=substr($tmp2[0],1);
758                $f_id=substr(end($tmp),1);
759                $t_name=$this->t_schema[$t_id]['name'];
760                $f_name=$this->t_schema[$t_id]['fields'][$f_id]['name'];
761                if (count($tmp)>1) {
762                        $rel_id=$tmp[count($tmp)-2];
763                        foreach($tmp as $v1) {
764                                if (substr($v1,0,1)=='R') {
765                                        $data['R'].=$v1.'_';
766                                }
767                        }
768                        $data['D']=$rel_id.'_';
769                } else {
770                        $rel_id=0;
771                        $data['R']=0;
772                }
773                $data['D'].=$t_name.'.'.$f_name;
774                return $data;
775        }
776
777       
778        //Extraction des jointures multiples
779        function getFullJoin($univ_id, $rel, $t_jo) {
780               
781                $rel_id=substr($rel,1);
782                $join=array();
783                $tf_from=array();
784                $tf_to=array();
785                $r_prev=$this->t_univ[$univ_id][$rel_id]['prev'];
786                $tf_from=explode('.',$this->t_univ[$univ_id][$rel_id]['from']);
787                $t_from=$tf_from[0];
788                $f_from=$tf_from[1];
789                $tf_to=explode('.',$this->t_univ[$univ_id][$rel_id]['to']);
790                $t_to=$tf_to[0];
791                $f_to=$tf_to[1];
792                $r_through=$this->t_univ[$univ_id][$rel_id]['through'];
793                if ($r_through) {
794
795                        $tmp=explode('.',$r_through);
796                        $t_int=$tmp[0];
797                        $tmp2=explode(',',$tmp[1]);
798                        $f_int_from=$tmp2[0];
799                        $f_int_to=$tmp2[1];
800                       
801
802                        if ($r_prev) {
803                                $join[$rel][0]['prev']='R'.$r_prev;
804                        } else {
805                                $join[$rel][0]['prev']=0;
806                        }
807                        $join[$rel][0]['t_from']=$t_from;
808                        $join[$rel][0]['f_from']=$f_from;
809                        $join[$rel][0]['t_to']=$t_int;
810                        $join[$rel][0]['f_to']=$f_int_from;
811                        $join[$rel][0]['join']=$t_jo[$rel][0];
812                       
813                        $join[$rel][1]['prev']=$rel;
814                        $join[$rel][1]['t_from']=$t_int;
815                        $join[$rel][1]['f_from']=$f_int_to;
816                        $join[$rel][1]['t_to']=$t_to;
817                        $join[$rel][1]['f_to']=$f_to;
818                        $join[$rel][1]['join']=$t_jo[$rel][0];
819                                               
820                } else {
821
822                        if ($r_prev) {
823                                $join[$rel][0]['prev']='R'.$r_prev;
824                        } else {
825                                $join[$rel][0]['prev']=0;
826                        }
827                        $join[$rel][0]['t_from']=$t_from;
828                        $join[$rel][0]['f_from']=$f_from;
829                        $join[$rel][0]['t_to']=$t_to;
830                        $join[$rel][0]['f_to']=$f_to;
831                        $join[$rel][0]['join']=$t_jo[$rel][0];
832                }
833                return $join;
834        }
835       
836       
837        //Recuperation des attributs de fonction a partir de l'identifiant
838        function getAttributes($fct_id=0,$c_type='') {
839                global $charset;
840                if (!$fct_id) die('No function id');
841               
842                $tp_fct=$this->t_fct[$fct_id]['param'];
843
844                $xml="<params parenthesis=\"".$this->t_fct[$fct_id]['parenthesis']."\" remove=\"".$this->t_fct[$fct_id]['remove']."\" >\n";
845                if(count($tp_fct)) {
846                        foreach($tp_fct as $v) {
847                                if($c_type !="FI" || ($v['order'] >= $this->t_fct[$fct_id]['filter']) ) {
848                                        $xml.= "<param order=\"".$v['order']."\" content=\"".$v['content']."\" optional=\"".$v['optional']."\" repeat_from=\"".$v['repeat_from']."\" value=\"".trim(htmlspecialchars($v['value'],ENT_QUOTES,$charset))."\" />\n";
849                                }
850                        }
851                       
852                }
853                $xml.="</params>\n";
854                return $xml;
855        }
856
857       
858        //construit la partie data d'une ligne de requete
859        function buildDataContent($t_da) {
860
861                $t_ret=array();
862               
863                $t_fct=array(); //table de stockage de l'expression sql pour une fonction
864                $tab_fu=array(); //table de stockage des fonctions en cours de traitement
865                $n_fu=0;
866                foreach($t_da as $e_da) {
867                       
868                        $da_type=key($e_da);
869                        $da_cont=$e_da[$da_type];
870                       
871                        switch ($da_type) {
872
873                                case 'FU' :     //Debut Fonction
874                                       
875                                        //si on est dans une fonction, c'est un argument
876                                        if ($n_fu) {
877                                                $tab_fu[$n_fu]['params'][]=array('sub',($n_fu+1));
878                                        }
879                                       
880                                        //stockage id fonction courante
881                                        $n_fu++;
882                                        $tab_fu[$n_fu]['id']=$da_cont;
883                                        break;
884                                       
885                                case 'order' : //Nouvel element fonction
886                                        $tab_fu[$n_fu]['params'][]=array('order',$da_cont);
887                                        break;
888                                       
889                                case 'FU_E' : //Fin Fonction
890                                       
891                                        //Traitement de la fonction ici
892                                        $f_format=$this->getFunction($tab_fu[$n_fu]['id']);
893                                       
894                                        //print '<pre>';print_r($tab_fu);print '</pre>';
895               
896                                        $f_content=array();
897                                        $order=0;
898                                        foreach($tab_fu[$n_fu]['params'] as $v) {
899                                                switch($v[0]) {
900                                                        case 'order' :
901                                                                if ($f_format['param'][$v[1]]['optional']!='yes' && $f_format['param'][$v[1]]['content']=='keyword') {
902                                                                        if($f_format['param'][$v[1]]['before_sep']) {
903                                                                                $f_content[]=$f_format['param'][$v[1]]['before_sep'];
904                                                                        }
905                                                                        $f_content[]=$f_format['param'][$v[1]]['value'];
906                                                                }
907                                                                if($f_format['parenthesis']==$v[1]) $f_content[]='(';
908                                                                $order=$v[1];
909                                                                break;
910                                                        case 'arg' :
911                                                                if($f_format['param'][$order]['before_sep']) {
912                                                                        $f_content[]=$f_format['param'][$order]['before_sep'];
913                                                                }
914                                                                $f_content[]=$v[1];
915                                                                break;
916                                                        case 'sub' :
917                                                                if($f_format['param'][$order]['before_sep']) {
918                                                                        $f_content[]=$f_format['param'][$order]['before_sep'];
919                                                                }
920                                                                $f_content[]=array_pop($t_fct);
921                                                        default :
922                                                                break;
923                                                }
924                                        }
925                                        //parenthese fermante
926                                        if($f_format['parenthesis']) $f_content[]=')';
927                                       
928                                        //print '<pre>';print_r($f_content);print '</pre>';
929                                       
930                                        //ajout de la fonction a la table de stockage de l'expression sql pour une fonction
931                                        $t_fct[]=implode('',$f_content);
932                                        array_pop($tab_fu);
933                                        $n_fu--;
934                                        if($n_fu==0) {
935                                                $t_ret['D']=implode(' ',$t_fct);
936                                        }
937                                        break;
938                                       
939                                case 'FI' :     //Champ         
940                                        $fi_data= array();
941                                        $fi_data=$this->getField($da_cont);
942                                        if($fi_data['R']) {
943                                                $t_ret['R'][]=$fi_data['R'];
944                                        }
945                                        //si on est dans une fonction, c'est un argument
946                                        if($n_fu) {
947                                                $tab_fu[$n_fu]['params'][]=array('arg',$fi_data['D']);
948                                        } else {
949                                                $t_ret['D']=$fi_data['D'];
950                                        }
951                                        break;
952                                       
953                                case 'TE' : //Saisie libre
954                                        //si on est dans une fonction, c'est un argument
955                                        if($n_fu) {
956                                                $tab_fu[$n_fu]['params'][]=array('arg',stripslashes($da_cont));
957                                        } else {
958                                                $t_ret['D']=stripslashes($da_cont);
959                                        }
960                                        break;
961                                       
962                                case 'SU' : //Sous requete
963                                        //si on est dans une fonction, c'est un argument
964                                        if($n_fu) {
965                                                $tab_fu[$n_fu]['params'][]=array('arg',$this->getSubRequest($da_cont));
966                                        } else {
967                                                $t_ret['D']=$this->getSubRequest($da_cont);
968                                        }
969                                        break;
970                               
971                                default:
972                                        break;
973                       
974                        }
975                }
976                return $t_ret;
977        }
978       
979       
980        //construit la partie filtre d'une ligne de requete (where)
981        function buildFilterContent($t_fi) {
982
983                $t_ret=array();
984
985                $t_fct=array(); //table de stockage de l'expression sql pour une fonction
986                $tab_fu=array(); //table de stockage des fonctions en cours de traitement
987                $n_fu=0;
988               
989                foreach($t_fi as $e_fi) {
990                       
991                        $fi_type=key($e_fi);
992                        $fi_cont=$e_fi[$fi_type];
993                       
994                        switch ($fi_type) {
995
996                                case 'FU' :     //Debut Fonction
997                                       
998                                        //si on est dans une fonction, c'est un argument
999                                        if ($n_fu) {
1000                                                $tab_fu[$n_fu]['params'][]=array('sub',($n_fu+1));
1001                                        }
1002                                       
1003                                        //stockage id fonction courante
1004                                        $n_fu++;
1005                                        $tab_fu[$n_fu]['id']=$fi_cont;
1006                                        break;
1007                                       
1008                                case 'order' : //Nouvel element fonction
1009                                        $tab_fu[$n_fu]['params'][]=array('order',$fi_cont);
1010                                        break;
1011                                       
1012                                case 'FU_E' : //Fin Fonction
1013                                       
1014                                        //Traitement de la fonction ici
1015                                        $f_format=$this->getFunction($tab_fu[$n_fu]['id']);
1016                                       
1017                                        $f_content=array();
1018                                        $order=0;
1019                                       
1020                                        foreach($tab_fu[$n_fu]['params'] as $v) {
1021                                                switch($v[0]) {
1022                                                        case 'order' :
1023                                                                if ($f_format['param'][$v[1]]['optional']!='yes' && $f_format['param'][$v[1]]['content']=='keyword') {
1024                                                                        $f_content[]=$f_format['param'][$v[1]]['value'];
1025                                                                }
1026                                                                if($f_format['parenthesis']==$v[1]) $f_content[]='(';
1027                                                                $order=$v[1];
1028                                                                break;
1029                                                        case 'arg' :
1030                                                                if($f_format['param'][$order]['before_sep']) {
1031                                                                        $f_content[]=$f_format['param'][$order]['before_sep'];
1032                                                                }
1033                                                                $f_content[]=$v[1];
1034                                                                break;
1035                                                        case 'sub' :
1036                                                                if($f_format['param'][$order]['before_sep']) {
1037                                                                        $f_content[]=$f_format['param'][$order]['before_sep'];
1038                                                                }
1039                                                                $f_content[]=array_pop($t_fct);
1040                                                        default :
1041                                                                break;
1042                                                }
1043                                        }
1044                                        //parenthese fermante
1045                                        if($f_format['parenthesis']) $f_content[]=')';
1046
1047                                        //ajout de la fonction a la table de stockage de l'expression sql pour une fonction
1048                                        $t_fct[]=implode('',$f_content);
1049                                        array_pop($tab_fu);
1050                                        $n_fu--;
1051                                        if($n_fu==0) {
1052                                                $eq="";
1053                                                if(!$f_format['filter']) $eq="=";
1054                                                $t_ret['F'][]=$eq.implode(' ',$t_fct);
1055                                                unset($t_fct);
1056                                        }
1057
1058                                        break;
1059                                       
1060                                case 'FI' :     //Champ         
1061                                        $fi_filter= array();
1062                                        $fi_filter=$this->getField($fi_cont);
1063                                        if($fi_filter['R']) {
1064                                                $t_ret['R'][]=$fi_filter['R'];
1065                                        }
1066
1067                                        //si on est dans une fonction, c'est un argument
1068                                        if($n_fu) {
1069                                                $tab_fu[$n_fu]['params'][]=array('arg',$fi_filter['D']);
1070                                        } else {
1071                                                $t_ret['F'][]="=".$fi_filter['D'];
1072                                        }
1073                                        break;
1074                                       
1075                                case 'TE' : //Saisie libre
1076                                        //si on est dans une fonction, c'est un argument
1077                                        if($n_fu) {
1078                                                $tab_fu[$n_fu]['params'][]=array('arg',stripslashes($fi_cont));
1079                                        } else {
1080                                                $t_ret['F'][]="=".stripslashes($fi_cont);
1081                                        }
1082                                        break;
1083                                       
1084                                case 'SU' : //Sous requete
1085                                        //si on est dans une fonction, c'est un argument
1086                                        if($n_fu) {
1087                                                $tab_fu[$n_fu]['params'][]=array('arg',$this->getSubRequest($fi_cont));
1088                                        } else {
1089                                                $t_ret['F'][]="=".$this->getSubRequest($fi_cont);
1090                                        }
1091                                        break;
1092                               
1093                                default:
1094                                        break;
1095                       
1096                        }
1097                }
1098                return $t_ret;
1099        }       
1100       
1101       
1102
1103}
1104
1105
1106class reqParser {
1107
1108        var $parser;
1109        var $t=array();
1110        var $cur_id=0;
1111        var $cur_rel=0;
1112        var $cur_fct=0;
1113       
1114        function reqParser() {
1115        }
1116       
1117        function run($file) {
1118               
1119                global $include_path;
1120                global $charset;
1121               
1122                //Recherche du fichier XML de description
1123                $file = $include_path.'/requests/'.$file.'.xml';
1124                $xml=file_get_contents($file,"r") or die("Can't find XML file $file");
1125
1126                unset($this->t);
1127                $this->cur_id=0;
1128               
1129                $rx = "/<?xml.*encoding=[\'\"](.*?)[\'\"].*?>/m";
1130                if (preg_match($rx, $xml, $m)) $encoding = strtoupper($m[1]);
1131                        else $encoding = "ISO-8859-1";
1132               
1133                $this->parser = xml_parser_create($encoding);
1134                xml_set_object($this->parser, $this);
1135                xml_parser_set_option($this->parser, XML_OPTION_TARGET_ENCODING, $charset);             
1136                xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, FALSE);   
1137                xml_parser_set_option($this->parser, XML_OPTION_SKIP_WHITE, TRUE);
1138                xml_set_element_handler($this->parser, "tagStart", "tagEnd");
1139                if (!xml_parse($this->parser, $xml, TRUE)) {
1140                        die( sprintf( "erreur XML %s à la ligne: %d", 
1141                                xml_error_string(xml_get_error_code($this->parser ) ),
1142                                xml_get_current_line_number($this->parser) ) );
1143                }
1144                xml_parser_free($this->parser);
1145                return ($this->t);
1146        }
1147
1148
1149        function tagStart($parser, $tag, $att) {
1150               
1151                global $msg;
1152               
1153                switch ($tag) {
1154                       
1155                        case 'table':
1156                                $this->t[$att['id']]['name']= $att['name'];
1157                                $this->t[$att['id']]['desc']= $att['desc'];
1158                                $this->t[$att['id']]['pkid']= $att['pkid'];
1159                                $this->t[$att['name']]=$att['id'];
1160                                $this->cur_id=$att['id'];
1161                                break;
1162                        case 'field':
1163                                $this->t[$this->cur_id]['fields'][$att['id']]['name']= $att['name'];
1164                                $this->t[$this->cur_id]['fields'][$att['id']]['desc']= $att['desc'];
1165                                $this->t[$this->cur_id]['fields'][$att['id']]['type']= $att['type'];
1166                                $this->t[$this->cur_id]['fields'][$att['id']]['name']= $att['name'];
1167                                $this->t[$this->cur_id]['fields'][$att['id']]['length']= $att['length'];
1168                                $this->t[$this->cur_id]['fields'][$att['id']]['precision']= $att['precision'];
1169                                $this->t[$this->cur_id]['fields'][$att['id']]['autoincrement']= $att['autoincrement'];
1170                                $this->t[$this->cur_id]['fields'][$att['id']]['enum']= $att['enum'];
1171                                $this->t[$this->cur_id]['fields'][$att['id']]['defval']= $att['defval'];
1172                                break;
1173                        case 'lien':
1174                                $this->t['cp_links'][$att['child']]=$att['parent'];
1175                                $this->t['pc_links'][$att['parent']][]=$att['child'];
1176                                break;
1177                        case 'REQ_TYPE':
1178                                $this->t[$att['id']]['type']= $att['type'];
1179                                $this->t[$att['id']]['name']= $msg[$att['name']];
1180                                break;
1181                        case 'REQ_CONTENT':
1182                                $this->t['REQ_CONTENT'][$att['id']]['type']= $att['type'];
1183                                $this->t['REQ_CONTENT'][$att['id']]['name']= $msg[$att['name']];
1184                                break;
1185                        case 'REQ_CONTAINER':
1186                                $this->t['REQ_CONTAINER'][$att['id']]['type']= $att['type'];
1187                                $this->t['REQ_CONTAINER'][$att['id']]['name']= $msg[$att['name']];
1188                                break;
1189                        case 'REQ_UNIVERSE':
1190                                $this->t[$att['id']]['name']= $msg[$att['name']];
1191                                $this->t[$att['id']]['ref']= $att['ref'];
1192                                $this->cur_id=$att['id'];
1193                                break;
1194                        case 'REQ_RELATION':
1195                                $this->t[$this->cur_id]['relations']['from'][$att['from']][]=$att['id'];
1196                                $this->t[$this->cur_id][$att['id']]['from']=$att['from'];
1197                                $this->t[$this->cur_id][$att['id']]['prev']=$att['prev'];
1198                                $this->t[$this->cur_id][$att['id']]['type']=$att['type'];
1199                                $this->t[$this->cur_id][$att['id']]['to']=$att['to'];
1200                                $this->t[$this->cur_id][$att['id']]['desc']=$att['desc'];
1201                                $this->t[$this->cur_id][$att['id']]['except']=$att['except'];           
1202                                $this->cur_rel=$att['id'];
1203                                break;
1204                        case 'REQ_THROUGH':
1205                                        $this->t[$this->cur_id][$this->cur_rel]['through']= $att['through'];
1206                                break;                         
1207                        case 'REQ_FUNCTION_GROUP' :
1208                                $this->t['REQ_FUNCTION_GROUP'][$att['id']]['name']=$att['name'];
1209                                break;
1210                        case 'REQ_FUNCTION':
1211                                $this->t['REQ_FUNCTION'][$att['id']]['name']=$att['name'];
1212                                $this->t['REQ_FUNCTION'][$att['id']]['group']=$att['group'];
1213                                $this->t['REQ_FUNCTION'][$att['id']]['parenthesis']= $att['parenthesis'];
1214                                $this->t['REQ_FUNCTION'][$att['id']]['remove']= $att['remove'];
1215                                $this->t['REQ_FUNCTION'][$att['id']]['filter']= $att['filter'];
1216                                $this->cur_fct=$att['id'];
1217                                break;
1218                        case 'FCT_PARAM':
1219                                $this->t['REQ_FUNCTION'][$this->cur_fct]['param'][$att['order']]['order']= $att['order'];
1220                                $this->t['REQ_FUNCTION'][$this->cur_fct]['param'][$att['order']]['content']= $att['content'];
1221                                $this->t['REQ_FUNCTION'][$this->cur_fct]['param'][$att['order']]['optional']= $att['optional'];
1222                                $this->t['REQ_FUNCTION'][$this->cur_fct]['param'][$att['order']]['value']= $att['value'];
1223                                $this->t['REQ_FUNCTION'][$this->cur_fct]['param'][$att['order']]['before_sep']= $att['before_sep'];
1224                                $this->t['REQ_FUNCTION'][$this->cur_fct]['param'][$att['order']]['repeat_from']= $att['repeat_from'];
1225                                break;                         
1226                        default :
1227                                break;
1228                }
1229                return;
1230        }
1231       
1232       
1233        function tagEnd($parser, $tag) {
1234                return;
1235        }
1236       
1237}
1238
1239
1240?>
Note: See TracBrowser for help on using the repository browser.