source: pmb4.2/trunk/fuentes/pmb/classes/editions_state_view_group.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: 10.7 KB
Line 
1<?php
2// +-------------------------------------------------+
3// © 2002-2012 PMB Services / www.sigb.net pmb@sigb.net et contributeurs (voir www.sigb.net)
4// +-------------------------------------------------+
5// $Id: editions_state_view_group.class.php,v 1.1 2013-03-11 10:40:09 mbertin Exp $
6
7if (stristr($_SERVER['REQUEST_URI'], ".class.php")) die("no access");
8
9require_once($class_path."/editions_state_view.class.php");
10
11class editions_state_view_group extends editions_state_view {
12        private $sqlite_resource=null;
13        private $sqlite_error="";
14        private $my_function=array("sum","min","max","avg","count","group_concat","val");
15       
16        public function __construct($datas,$id,$param=array()){
17                //on gère les propriétés communes dans la classe parente
18                parent::__construct($datas,$id,$param);
19                $this->sqlite_db_open();
20                $this->set_param_group($param["group"]);
21        }
22       
23        private function sqlite_db_open(){
24                global $base_path;
25                if(!class_exists('SQLite3')){
26                        $this->sqlite_error="SQLite 3 NOT supported";
27                        return;
28                }
29                try{
30                        $this->sqlite_resource=new SQLite3(":memory:");
31                        //Création de la table
32                        $list_champ=array();
33                        $query="CREATE TABLE datas(";
34                        foreach ( $this->datas[0] as $key => $value ) {
35                                $list_champ[]="champ_".$key;
36                                $query.="champ_".$key." text,";
37                        }
38                        $query=substr($query, 0, -1);//On enlève la dernière virgule
39                        $query.=");";
40                        $res=$this->sqlite_resource->exec($query);
41                        if(!$res){
42                                $this->sqlite_error="Unable to create table datas : ".$query;
43                                return;                         
44                        }
45                       
46                        //Insertion des données
47                        for ($i = 1; $i < count($this->datas); $i++) {
48                                $query="INSERT INTO datas(".implode(", ",$list_champ).") VALUES(";
49                                foreach ( $this->datas[$i] as $value ) {
50                                        $query.="'".$this->sqlite_resource->escapeString($value)."',";
51                                }
52                                $query=substr($query, 0, -1);//On enlève la dernière virgule
53                                $query.=");";
54                                $res=$this->sqlite_resource->query($query);
55                                if(!$res){
56                                        $this->sqlite_error="Unable to insert in table datas : ".$query;
57                                        return;                         
58                                }
59                        }
60                       
61                }catch(Exception $e){
62                        $this->sqlite_error=$e->getMessage();
63                }
64        }
65       
66        private function sqlite_calc_group(){
67               
68                $show_fields=$this->my_param["group"]["show_fields"];
69                $group_fields=$this->my_param["group"]["group_fields"];
70               
71                $result=array();
72                $query="SELECT ";
73               
74                if(count($show_fields) && $this->sqlite_resource){
75                        if(count($group_fields)){
76                                foreach ( $group_fields as $value ) {
77                                        $query.="champ_".$value.",";
78                                }
79                        }
80                       
81                        foreach ( $show_fields as $value ) {
82                                $function_field = "function_field_".$value;
83                                $option=$this->my_param["group"]["function_fields"][$function_field];
84                                if($option && $option != "val"){
85                                        if($option == "group_concat"){
86                                                //$query.=$option."( DISTINCT champ_".$value.") AS alias_".$value.",";
87                                                $query.=" (REPLACE(REPLACE(GROUP_CONCAT(DISTINCT REPLACE(champ_".$value.",',','{virgul}')),',',' {sep_val} '),'{virgul}',',')) AS alias_".$value.",";
88                                        }else{
89                                                $query.=$option."(champ_".$value.") AS alias_".$value.",";
90                                        }
91                                }else{
92                                        $query.="champ_".$value." AS alias_".$value.",";
93                                }
94                        }
95                        $query=substr($query, 0, -1);//On enlève la dernière virgule
96                        $query.=" FROM datas ";
97                        if(count($group_fields)){
98                                $query.=" GROUP BY ";
99                                foreach ( $group_fields as $value ) {
100                                        $query.="champ_".$value.",";
101                                }
102                                $query=substr($query, 0, -1);//On enlève la dernière virgule
103                        }
104                        $res=$this->sqlite_resource->query($query);
105                        if($res){
106                                while ($ligne=$res->fetchArray(SQLITE3_ASSOC)) {
107                                        $result[]=$ligne;
108                                }
109                                $res->finalize();
110                        }
111                }
112                return $result;
113        }
114       
115        private function sqlite_db_close(){
116                if($this->sqlite_resource){
117                        $this->sqlite_resource->close();
118                }
119        }
120       
121        public function set_param_group($param=array()){
122                global $save_param;
123               
124                if($save_param == "group"){
125                        global $show_fields_tabl;
126                        global $group_fields_tabl;
127                        $function_fields_tabl=array();
128                        if(is_array($show_fields_tabl) && count($show_fields_tabl)){
129                                foreach ( $show_fields_tabl as $champ ) {
130                                $function_field = "function_field_".$champ;
131                                        global $$function_field;
132                                        $option=$$function_field;
133                                        if(!$option){
134                                                $option="val";
135                                        }
136                                        $function_fields_tabl[$function_field]=$option;
137                                }
138                        }
139                }else{
140                        $show_fields_tabl=$param["show_fields"];
141                        $group_fields_tabl=$param["group_fields"];
142                        $function_fields_tabl=$param["function_fields"];
143                }
144               
145                if(!is_array($show_fields_tabl)){
146                        $show_fields_tabl=array();
147                }
148               
149                if(!is_array($group_fields_tabl)){
150                        $group_fields_tabl=array();
151                }
152                if(!is_array($function_fields_tabl)){
153                        $function_fields_tabl=array();
154                }
155               
156                $this->my_param["group"]=array("show_fields"=>$show_fields_tabl,"group_fields"=>$group_fields_tabl,"function_fields"=>$function_fields_tabl);
157                return;
158        }
159       
160        private function form_select_filter($champ){
161                global $msg,$charset;
162                $function_field = "function_field_".$champ;
163               
164                $html="<select name='".$function_field."' id='".$function_field."'>";
165                foreach ( $this->my_function as $value ) {
166                $html.="<option value='".$value."' ".($this->my_param["group"]["function_fields"][$function_field] == $value ? " selected='selected' " : "").">".htmlentities($msg["editions_state_view_group_filter_".$value],ENT_QUOTES,$charset)."</option>";
167                }
168                $html.="</select>";
169                return $html;
170        }
171       
172        //
173        public function show(){
174                global $charset,$msg;
175                global $javascript_path;
176                global $show_all;
177               
178                $show_fields_tabl=$this->my_param["group"]["show_fields"];
179                $group_fields_tabl=$this->my_param["group"]["group_fields"];
180               
181                $new_data=$this->sqlite_calc_group();
182                $nb_lignes=count($new_data);
183                $nb_colonne=count($show_fields_tabl)+count($group_fields_tabl);
184               
185                if($this->sqlite_error){
186                        $html="<div class='erreur'>".$msg["editions_state_view_group_sqlite_error"].": (SQLite 3 error: ".$this->sqlite_error.")</div>";
187                        return $html;
188                }
189               
190                $html ="<script type='text/javascript' src='".$javascript_path."/sorttable.js'></script>
191                <div class='row'>
192                        <div class='colonne4'>&nbsp;<input type='hidden' name='save_param'  id='save_param' value='group'/></div>
193                        <div class='colonne_scroll' style='border:0px;overflow-x:hidden;'>
194                                        <label>".$msg['editions_state_nb_rows']."</label>
195                                        <span>".$nb_lignes."</span>     
196                                        <input type='button' class='bouton' value='".htmlentities($msg["actualiser"],ENT_QUOTES,$charset)."' onclick=\"test_form('group');\" />
197                                        <input type='button' class='bouton' value='".htmlentities($msg["editions_state_view_export_excel"],ENT_QUOTES,$charset)."' onclick=\"test_form('group','edit');\" />
198                        </div>
199                </div>
200               
201                <div class='row'>
202                <div class='colonne4'>
203                        <table class='sortable'>
204                                <tr>
205                                        <th>".htmlentities($msg["editions_state_view_group_par"],ENT_QUOTES,$charset)."</th>
206                                        <th>".htmlentities($msg["editions_state_view_group_afficher"],ENT_QUOTES,$charset)."</th>
207                                        <th>".htmlentities($msg["editions_state_view_group_champs"],ENT_QUOTES,$charset)."</th>
208                                </tr>";
209                foreach ( $this->datas[0] as $key => $value ) {
210                $html.="
211                                <tr>
212                                        <td><input type=\"checkbox\" name=\"group_fields_tabl[]\" value='".$key."' ".(in_array($key,$group_fields_tabl) ? "checked" : "")." /></td>
213                                        <td><input type=\"checkbox\" name=\"show_fields_tabl[]\" value='".$key."' ".(in_array($key,$show_fields_tabl) ? "checked" : "")." /></td>
214                                        <td>".htmlentities($value,ENT_QUOTES,$charset)."</td>
215                                </tr>";
216                }
217
218                $html.="
219                        </table>
220                </div>
221                <div class='colonne_scroll' >";
222                if(count($show_fields_tabl)){
223                        $html.="
224                                <table class='sortable'>";
225                        //1ère ligne
226                        $html.="<thead>";
227                        $html.="<tr class='sorttop'>";
228                        foreach ( $group_fields_tabl as $value ) {
229                        $html.="<th>".htmlentities($this->datas[0][$value],ENT_QUOTES,$charset)."</th>";
230                        }
231                        foreach ( $show_fields_tabl as $value ) {
232                        $html.="<th>".htmlentities($this->datas[0][$value],ENT_QUOTES,$charset)."</th>";
233                        }
234                        $html.="</tr>";
235                        //2ème ligne
236                        $html.="<tr>";
237                        foreach ( $group_fields_tabl as $value ) {
238                        $html.="<td>".htmlentities($msg["editions_state_view_group_distinct"],ENT_QUOTES,$charset)."</td>";
239                        }
240                        foreach ( $show_fields_tabl as $value ) {
241                        $html.="<td>".$this->form_select_filter($value)."</td>";
242                        }
243                        $html.="</tr>";
244                        $html.="</thead>";
245                        //Résultat
246                        if(count($new_data)){
247                                foreach ( $new_data as $key => $ligne_result ) {
248                                 $html.="<tr>";
249                                        foreach ( $group_fields_tabl as $value ) {
250                                        $html.="<td>".htmlentities($ligne_result["champ_".$value],ENT_QUOTES,$charset)."</td>";
251                                        }
252                                        foreach ( $show_fields_tabl as $value ) {
253                                        $html.="<td>".htmlentities($ligne_result["alias_".$value],ENT_QUOTES,$charset)."</td>";
254                                        }
255                                        $html.="</tr>";
256                                        if(!$show_all && ($key == 49)){
257                                                $html.="<tr class='sortbottom' ><td colspan=\"".$nb_colonne."\"><a onclick='test_form(\"group\",\"show_all\");'><b>".$msg["editions_state_view_tab_all"]."</b></a></td></tr>";
258                                                break;
259                                        }
260                                }
261                        }
262                       
263                        $html.="</table>";
264                }
265                $html.="
266                </div>
267        </div>
268        <div class='row'>&nbsp;</div>";
269                $this->sqlite_db_close();
270                return $html;
271        }
272       
273        public function render_xls_file($name="state"){
274                global $msg,$charset;
275               
276                $tmp_file = tempnam(sys_get_temp_dir(),"state_");
277                header("Content-Type: application/x-msexcel; name=\"".$name.".xls\"");
278                header("Content-Disposition: inline; filename=\"".$name.".xls\"");
279                $workbook = new writeexcel_workbook($tmp_file);
280                $worksheet = &$workbook->addworksheet();
281               
282                $show_fields_tabl=$this->my_param["group"]["show_fields"];
283                $group_fields_tabl=$this->my_param["group"]["group_fields"];
284       
285               
286                if(count($show_fields_tabl)){
287                        //1ère ligne
288                        $nb_ligne=0;
289                        $nb_colonne=0;
290                        foreach ( $group_fields_tabl as $value ) {
291                                $worksheet->write($nb_ligne,$nb_colonne,$this->datas[0][$value]);
292                                $nb_colonne++;
293                        }
294                        foreach ( $show_fields_tabl as $value ) {
295                        $worksheet->write($nb_ligne,$nb_colonne,$this->datas[0][$value]);
296                                $nb_colonne++;
297                        }
298                        //2ème ligne
299                        $nb_ligne++;
300                        $nb_colonne=0;
301                        foreach ( $group_fields_tabl as $value ) {
302                                $worksheet->write($nb_ligne,$nb_colonne,$msg["editions_state_view_group_distinct"]);
303                                $nb_colonne++;
304                        }
305                        foreach ( $show_fields_tabl as $value ) {
306                                $worksheet->write($nb_ligne,$nb_colonne,$msg["editions_state_view_group_filter_".$this->my_param["group"]["function_fields"]["function_field_".$value]]);
307                                $nb_colonne++;
308                        }
309                        //Résultat
310                        $new_data=$this->sqlite_calc_group();
311                        if(count($new_data)){
312                                foreach ( $new_data as $ligne_result ) {
313                                $nb_ligne++;
314                                        $nb_colonne=0;
315                                        foreach ( $group_fields_tabl as $value ) {
316                                                $worksheet->write($nb_ligne,$nb_colonne,$ligne_result["champ_".$value]);
317                                                $nb_colonne++;
318                                        }
319                                        foreach ( $show_fields_tabl as $value ) {
320                                                $worksheet->write($nb_ligne,$nb_colonne,$ligne_result["alias_".$value]);
321                                                $nb_colonne++;
322                                        }
323                                }
324                        }
325                }
326                $workbook->close();
327                $fh=fopen($tmp_file, "rb");
328                fpassthru($fh);
329                unlink($tmp_file);             
330        }
331}
Note: See TracBrowser for help on using the repository browser.