Marius Burkard
2016-04-20 4569cae57f127afd093794310ccd290d2d9fdf36
commit | author | age
fb02f0 1 <?php
T 2
3 /*
4 Copyright (c) 2007, Till Brehm, projektfarm Gmbh
5 All rights reserved.
6
7 Redistribution and use in source and binary forms, with or without modification,
8 are permitted provided that the following conditions are met:
9
10     * Redistributions of source code must retain the above copyright notice,
11       this list of conditions and the following disclaimer.
12     * Redistributions in binary form must reproduce the above copyright notice,
13       this list of conditions and the following disclaimer in the documentation
14       and/or other materials provided with the distribution.
15     * Neither the name of ISPConfig nor the names of its contributors
16       may be used to endorse or promote products derived from this software without
17       specific prior written permission.
18
19 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22 IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
23 INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
24 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
26 OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
28 EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31 class listform {
32
7fe908 33     private $debug = 0;
MC 34     private $errorMessage;
35     public  $listDef;
36     public  $searchValues;
37     public  $pagingHTML;
38     private $pagingValues;
39     private $searchChanged = 0;
40     private $module;
fb02f0 41     public $wordbook;
T 42
7fe908 43     public function loadListDef($file, $module = '')
MC 44     {
45         global $app, $conf;
46         if(!is_file($file)){
47             die("List-Definition: $file not found.");
fb02f0 48         }
7fe908 49         require_once $file;
MC 50         $this->listDef = $liste;
51         $this->module = $module;
52
53         //* Fill datasources
54         if(@is_array($this->listDef['item'])) {
55             foreach($this->listDef['item'] as $key => $field) {
56                 if(@is_array($field['datasource'])) {
57                     $this->listDef['item'][$key]['value'] = $this->getDatasourceData($field);
58                 }
59             }
60         }
61
fb02f0 62         //* Set local Language File
5ded80 63         $lng_file = 'lib/lang/'.$_SESSION['s']['language'].'_'.$this->listDef['name'].'_list.lng';
F 64         if(!file_exists($lng_file)) $lng_file = 'lib/lang/en_'.$this->listDef['name'].'_list.lng';
7fe908 65         include $lng_file;
MC 66
fb02f0 67         $this->wordbook = $wb;
7fe908 68
MC 69         return true;
70     }
71
fb02f0 72     /**
7fe908 73      * Get the key => value array of a form filed from a datasource definitiom
MC 74      *
75      * @param field = array with field definition
76      * @param record = Dataset as array
77      * @return array key => value array for the value field of a form
78      */
fb02f0 79
T 80
7fe908 81     private function getDatasourceData($field)
MC 82     {
83         global $app;
84         $values = array();
85
86         if($field['datasource']['type'] == 'SQL') {
87
88             //** Preparing SQL string. We will replace some common placeholders
89             $querystring = $field['datasource']['querystring'];
90             $querystring = str_replace('{USERID}', $_SESSION['s']['user']['userid'], $querystring);
91             $querystring = str_replace('{GROUPID}', $_SESSION['s']['user']['default_group'], $querystring);
92             $querystring = str_replace('{GROUPS}', $_SESSION['s']['user']['groups'], $querystring);
93             //TODO:
94             //$table_idx = $this->formDef['db_table_idx'];
95             //$querystring = str_replace("{RECORDID}",$record[$table_idx],$querystring);
fb02f0 96             $app->uses('tform');
7fe908 97             $querystring = str_replace("{AUTHSQL}", $app->tform->getAuthSQL('r'), $querystring);
MC 98             $querystring = str_replace("{AUTHSQL-A}", $app->tform->getAuthSQL('r', 'a'), $querystring);
99             $querystring = str_replace("{AUTHSQL-B}", $app->tform->getAuthSQL('r', 'b'), $querystring);
53f0d2 100             $querystring = preg_replace_callback('@{AUTHSQL::(.+?)}@', create_function('$matches','global $app; $tmp = $app->tform->getAuthSQL("r", $matches[1]); return $tmp;'), $querystring);
fb02f0 101
7fe908 102             //* Getting the records
MC 103             $tmp_records = $app->db->queryAllRecords($querystring);
104             if($app->db->errorMessage != '') die($app->db->errorMessage);
105             if(is_array($tmp_records)) {
106                 $key_field = $field['datasource']['keyfield'];
107                 $value_field = $field['datasource']['valuefield'];
108                 foreach($tmp_records as $tmp_rec) {
109                     $tmp_id = $tmp_rec[$key_field];
110                     $values[$tmp_id] = $tmp_rec[$value_field];
111                 }
112             }
113         }
fb02f0 114
7fe908 115         if($field['datasource']['type'] == 'CUSTOM') {
MC 116             //* Calls a custom class to validate this record
117             if($field['datasource']['class'] != '' and $field['datasource']['function'] != '') {
118                 $datasource_class = $field['datasource']['class'];
119                 $datasource_function = $field['datasource']['function'];
120                 $app->uses($datasource_class);
fb02f0 121                 $record = array();
7fe908 122                 $values = $app->$datasource_class->$datasource_function($field, $record);
MC 123             } else {
124                 $this->errorMessage .= "Custom datasource class or function is empty<br />\r\n";
125             }
126         }
a9b325 127         
MC 128         if($api == false && isset($field['filters']) && is_array($field['filters'])) {
129             $new_values = array();
130             foreach($values as $index => $value) {
131                 $new_index = $app->tform->filterField($index, $index, $field['filters'], 'SHOW');
132                 $new_values[$new_index] = $app->tform->filterField($index, (isset($values[$index]))?$values[$index]:'', $field['filters'], 'SHOW');
133             }
134             $values = $new_values;
135             unset($new_values);
136             unset($new_index);
137         }
7fe908 138         return $values;
MC 139     }
fb02f0 140
7fe908 141     public function getSearchSQL($sql_where = '')
MC 142     {
143         global $app, $db;
fb02f0 144
7fe908 145         //* Get config variable
MC 146         $list_name = $this->listDef['name'];
147         $search_prefix = $this->listDef['search_prefix'];
148
a59ad3 149         if(isset($_REQUEST['Filter']) && !isset($_SESSION['search'][$list_name])) {
T 150             //* Jump back to page 1 of the list when a new search gets started.
151             $_SESSION['search'][$list_name]['page'] = 0;
152         }
fb02f0 153
7fe908 154         //* store retrieval query
MC 155         if(@is_array($this->listDef['item'])) {
156             foreach($this->listDef['item'] as $i) {
157                 $field = $i['field'];
fb02f0 158
7fe908 159                 //* The search string has been changed
MC 160                 if(isset($_REQUEST[$search_prefix.$field]) && isset($_SESSION['search'][$list_name][$search_prefix.$field]) && $_REQUEST[$search_prefix.$field] != $_SESSION['search'][$list_name][$search_prefix.$field]){
161                     $this->searchChanged = 1;
fb02f0 162
7fe908 163                     //* Jump back to page 1 of the list when search has changed.
MC 164                     $_SESSION['search'][$list_name]['page'] = 0;
165                 }
166
167                 //* Store field in session
168                 if(isset($_REQUEST[$search_prefix.$field]) && !stristr($_REQUEST[$search_prefix.$field], "'")){
169                     $_SESSION['search'][$list_name][$search_prefix.$field] = $_REQUEST[$search_prefix.$field];
86985d 170                     if(preg_match("/['\\\\]/", $_SESSION['search'][$list_name][$search_prefix.$field])) $_SESSION['search'][$list_name][$search_prefix.$field] = '';
T 171                 }
fb02f0 172
7fe908 173                 if(isset($i['formtype']) && $i['formtype'] == 'SELECT'){
MC 174                     if(is_array($i['value'])) {
175                         $out = '<option value=""></option>';
176                         foreach($i['value'] as $k => $v) {
177                             // TODO: this could be more elegant
178                             $selected = (isset($_SESSION['search'][$list_name][$search_prefix.$field])
179                                 && $k == $_SESSION['search'][$list_name][$search_prefix.$field]
180                                 && $_SESSION['search'][$list_name][$search_prefix.$field] != '')
181                                 ? ' SELECTED' : '';
182                             $out .= "<option value='$k'$selected>$v</option>\r\n";
183                         }
184                     }
185                     $this->searchValues[$search_prefix.$field] = $out;
186                 } else {
187                     if(isset($_SESSION['search'][$list_name][$search_prefix.$field])){
188                         $this->searchValues[$search_prefix.$field] = htmlspecialchars($_SESSION['search'][$list_name][$search_prefix.$field]);
189                     }
190                 }
191             }
192         }
193         //* Store variables in object | $this->searchValues = $_SESSION["search"][$list_name];
194         if(@is_array($this->listDef['item'])) {
195             foreach($this->listDef['item'] as $i) {
196                 $field = $i['field'];
615a0a 197                 $table = $i['table'];
7fe908 198
2d2fd1 199                 $searchval = $_SESSION['search'][$list_name][$search_prefix.$field];
e9d5c9 200                 // IDN
MC 201                 if($searchval != ''){
cc636e 202                     if(is_array($i['filters'])) {
TB 203                         foreach($i['filters'] as $searchval_filter) {
204                             if($searchval_filter['event'] == 'SHOW') {
205                                 switch ($searchval_filter['type']) {
206                                 case 'IDNTOUTF8':
207                                     $searchval = $app->functions->idn_encode($searchval);
208                                     //echo $searchval;
209                                     break;
210                                 }
e9d5c9 211                             }
MC 212                         }
213                     }
214                 }
215         
2d2fd1 216                 // format user date format to MySQL date format 0000-00-00
FT 217                 if($i['datatype'] == 'DATE' && $this->lng('conf_format_dateshort') != 'Y-m-d'){
218                     $dateformat = preg_replace("@[^Ymd]@", "", $this->lng('conf_format_dateshort'));
219                     $yearpos = strpos($dateformat, 'Y') + 1;
220                     $monthpos = strpos($dateformat, 'm') + 1;
221                     $daypos = strpos($dateformat, 'd') + 1;
7fe908 222
MC 223                     $full_date_trans = array ('Y' => '((?:19|20)\d\d)',
224                         'm' => '(0[1-9]|1[012])',
225                         'd' => '(0[1-9]|[12][0-9]|3[01])'
226                     );
227                     // d.m.Y  Y/m/d
2d2fd1 228                     $full_date_regex = strtr(preg_replace("@[^Ymd]@", "[^0-9]", $this->lng('conf_format_dateshort')), $full_date_trans);
FT 229                     //echo $full_date_regex;
7fe908 230
2d2fd1 231                     if (preg_match("@^\d+$@", $_SESSION['search'][$list_name][$search_prefix.$field])) { // we just have digits
FT 232                         $searchval = $_SESSION['search'][$list_name][$search_prefix.$field];
233                     } elseif(preg_match("@^[^0-9]?\d+[^0-9]?$@", $_SESSION['search'][$list_name][$search_prefix.$field])){ // 10. or .10.
234                         $searchval = preg_replace("@[^0-9]@", "", $_SESSION['search'][$list_name][$search_prefix.$field]);
235                     } elseif(preg_match("@^[^0-9]?(\d{1,2})[^0-9]((?:19|20)\d\d)$@", $_SESSION['search'][$list_name][$search_prefix.$field], $matches)){ // 10.2013
236                         $month = $matches[1];
237                         $year = $matches[2];
238                         $searchval = $year.'-'.$month;
239                     } elseif(preg_match("@^((?:19|20)\d\d)[^0-9](\d{1,2})[^0-9]?$@", $_SESSION['search'][$list_name][$search_prefix.$field], $matches)){ // 2013-10
240                         $month = $matches[2];
241                         $year = $matches[1];
242                         $searchval = $year.'-'.$month;
243                     } elseif(preg_match("@^[^0-9]?(\d{1,2})[^0-9](\d{1,2})[^0-9]?$@", $_SESSION['search'][$list_name][$search_prefix.$field], $matches)){ // 04.10.
244                         if($monthpos < $daypos){
7fe908 245                             $month = $matches[1];
MC 246                             $day = $matches[2];
2d2fd1 247                         } else {
FT 248                             $month = $matches[2];
249                             $day = $matches[1];
250                         }
251                         $searchval = $month.'-'.$day;
252                     } elseif (preg_match("@^".$full_date_regex."$@", $_SESSION['search'][$list_name][$search_prefix.$field], $matches)) {
253                         //print_r($matches);
254                         $day = $matches[$daypos];
255                         $month = $matches[$monthpos];
256                         $year = $matches[$yearpos];
257                         $searchval = $year.'-'.$month.'-'.$day;
258                     }
259                 }
d22277 260                 
MB 261                 if($i['datatype'] == 'BOOLEAN' && $searchval != ''){
262                     if (!function_exists('boolval')) {
263                         $searchval = (bool) $searchval;
264                         if($searchval === true){
265                             $searchval = 'TRUE';
266                         } else {
267                             $searchval = 'FALSE';
268                         }
269                     } else {
270                         $searchval = boolval($searchval)? 'TRUE' : 'FALSE';
271                     }
272                 }
7fe908 273
MC 274                 // if($_REQUEST[$search_prefix.$field] != '') $sql_where .= " $field ".$i["op"]." '".$i["prefix"].$_REQUEST[$search_prefix.$field].$i["suffix"]."' and";
275                 if(isset($searchval) && $searchval != ''){
d22277 276                     $sql_where .= " ".($table != ''? $table.'.' : $this->listDef['table'].'.')."$field ".$i['op']." ".($i['datatype'] == 'BOOLEAN'? "" : "'").$app->db->quote($i['prefix'].$searchval.$i['suffix']).($i['datatype'] == 'BOOLEAN'? "" : "'")." and";
7fe908 277                 }
MC 278             }
279         }
280         return ( $sql_where != '' ) ? $sql_where = substr($sql_where, 0, -3) : '1';
281     }
282
202df8 283     public function getPagingValue($key) {
MC 284         if(!is_array($this->pagingValues)) return null;
285         if(!array_key_exists($key, $this->pagingValues)) return null;
286         return $this->pagingValues[$key];
287     }
7fe908 288
2af58c 289     /* TODO: maybe rewrite sql */
7fe908 290     public function getPagingSQL($sql_where = '1')
MC 291     {
292         global $app, $conf;
e03212 293         
TB 294         $old_search_limit = intval($_SESSION['search']['limit']);
7fe908 295
7b47c0 296         //* Add Global Limit from selectbox
7fe908 297         if(!empty($_POST['search_limit']) and $app->functions->intval($_POST['search_limit']) > 0){
65ea2e 298             $_SESSION['search']['limit'] = $app->functions->intval($_POST['search_limit']);
26c0fc 299         }
7fe908 300
992797 301         //if(preg_match('{^[0-9]$}',$_SESSION['search']['limit'])){
7fe908 302         // $_SESSION['search']['limit'] = 15;
992797 303         //}
MC 304         if(intval($_SESSION['search']['limit']) < 1) $_SESSION['search']['limit'] = 15;
fb02f0 305
7fe908 306         //* Get Config variables
MC 307         $list_name          = $this->listDef['name'];
308         $search_prefix      = $this->listDef['search_prefix'];
309         $records_per_page   = (empty($_SESSION['search']['limit']) ? $app->functions->intval($this->listDef['records_per_page']) : $app->functions->intval($_SESSION['search']['limit'])) ;
310         $table              = $this->listDef['table'];
fb02f0 311
7fe908 312         //* set PAGE to zero, if in session not set
MC 313         if(!isset($_SESSION['search'][$list_name]['page']) || $_SESSION['search'][$list_name]['page'] == ''){
314             $_SESSION['search'][$list_name]['page'] = 0;
315         }
fb02f0 316
7fe908 317         //* set PAGE to worth request variable "PAGE" - ? setze page auf wert der request variablen "page"
MC 318         if(isset($_REQUEST["page"])) $_SESSION["search"][$list_name]["page"] = $app->functions->intval($_REQUEST["page"]);
e03212 319         
TB 320         //* Set search to changed when search limit has been changed.
321         if(intval($_SESSION['search']['limit']) != $old_search_limit) $this->searchChanged = 1;
fb02f0 322
7fe908 323         //* PAGE to 0 set, if look for themselves ?  page auf 0 setzen, wenn suche sich ge�ndert hat.
MC 324         if($this->searchChanged == 1) $_SESSION['search'][$list_name]['page'] = 0;
fb02f0 325
7fe908 326         $sql_von = $app->functions->intval($_SESSION['search'][$list_name]['page'] * $records_per_page);
2af58c 327         $record_count = $app->db->queryOneRecord("SELECT count(*) AS anzahl FROM ??".($app->listform->listDef['additional_tables'] != ''? ','.$app->listform->listDef['additional_tables'] : '')." WHERE $sql_where", $table);
7fe908 328         $pages = $app->functions->intval(($record_count['anzahl'] - 1) / $records_per_page);
fb02f0 329
T 330
7fe908 331         $vars['list_file']      = $_SESSION['s']['module']['name'].'/'.$this->listDef['file'];
MC 332         $vars['page']           = $_SESSION['search'][$list_name]['page'];
333         $vars['last_page']      = $_SESSION['search'][$list_name]['page'] - 1;
334         $vars['next_page']      = $_SESSION['search'][$list_name]['page'] + 1;
335         $vars['pages']          = $pages;
336         $vars['max_pages']      = $pages + 1;
337         $vars['records_gesamt'] = $record_count['anzahl'];
338         $vars['page_params']    = (isset($this->listDef['page_params'])) ? $this->listDef['page_params'] : '';
339         $vars['offset']   = $sql_von;
340         $vars['records_per_page'] = $records_per_page;
341         //$vars['module'] = $_SESSION['s']['module']['name'];
fb02f0 342
7fe908 343         if($_SESSION['search'][$list_name]['page'] > 0) $vars['show_page_back'] = 1;
MC 344         if($_SESSION['search'][$list_name]['page'] <= $vars['pages'] - 1) $vars['show_page_next'] = 1;
fb02f0 345
7fe908 346         $this->pagingValues = $vars;
MC 347         $this->pagingHTML = $this->getPagingHTML($vars);
fb02f0 348
7fe908 349         //* Return limit sql
MC 350         return "LIMIT $sql_von, $records_per_page";
351     }
fb02f0 352
7fe908 353     public function getPagingHTML($vars)
MC 354     {
355         global $app;
356
357         // we want to show at max 17 page numbers (8 left, current, 8 right)
358         $show_pages_count = 17;
359
360         $show_pages = array(0); // first page
361         if($vars['pages'] > 0) $show_pages[] = $vars['pages']; // last page
362         for($p = $vars['page'] - 2; $p <= $vars['page'] + 2; $p++) { // surrounding pages
363             if($p > 0 && $p < $vars['pages']) $show_pages[] = $p;
364         }
365
366         $l_start = $vars['page'] - 13;
367         $l_start -= ($l_start % 10) + 1;
368         $h_end = $vars['page'] + 23;
369         $h_end -= ($h_end % 10) + 1;
370         for($p = $l_start; $p <= $h_end; $p += 10) { // surrounding pages
371             if($p > 0 && $p < $vars['pages'] && !in_array($p, $show_pages, true) && count($show_pages) < $show_pages_count) $show_pages[] = $p;
372         }
373
374         $l_start = $vars['page'] - 503;
375         $l_start -= ($l_start % 100) + 1;
376         $h_end = $vars['page'] + 603;
377         $h_end -= ($h_end % 100) + 1;
378         for($p = $l_start; $p <= $h_end; $p += 100) { // surrounding pages
379             if($p > 0 && $p < $vars['pages'] && !in_array($p, $show_pages, true) && count($show_pages) < $show_pages_count) $show_pages[] = $p;
380         }
381
382         $l_start = $vars['page'] - 203;
383         $l_start -= ($l_start % 25) + 1;
384         $h_end = $vars['page'] + 228;
385         $h_end -= ($h_end % 25) + 1;
386         for($p = $l_start; $p <= $h_end; $p += 25) { // surrounding pages
387             if($p > 0 && $p < $vars['pages'] && abs($p - $vars['page']) > 30 && !in_array($p, $show_pages, true) && count($show_pages) < $show_pages_count) $show_pages[] = $p;
388         }
389
390         sort($show_pages);
391         $show_pages = array_unique($show_pages);
8ceb08 392         
MC 393         $content = '<nav>
394         <ul class="pagination">';
395         
7fe908 396         //* Show Back
MC 397         if(isset($vars['show_page_back']) && $vars['show_page_back'] == 1){
9021d7 398             $content .= '<li><a href="#" data-load-content="'.$vars['list_file'].'?page=0'.$vars['page_params'].'" aria-label="First">
8ceb08 399             <span aria-hidden="true">&laquo;</span></a></li>';
d22277 400             $content .= '<li><a href="#" data-load-content="'.$vars['list_file'].'?page='.$vars['last_page'].$vars['page_params'].'" aria-label="Previous">
8ceb08 401             <span aria-hidden="true">&lsaquo;</span></a></li>';
7fe908 402         }
MC 403         $prev = -1;
404         foreach($show_pages as $p) {
8ceb08 405             if($prev != -1 && $p > $prev + 1) $content .= '<li class="disabled"><a href="#">…</a></li>';
9021d7 406             $content .= '<li' . ($p == $vars['page'] ? ' class="active"' : '') . '><a href="#" data-load-content="'.$vars['list_file'].'?page='.$p.$vars['page_params'].'">'. ($p+1) .'</a></li>';
7fe908 407             $prev = $p;
MC 408         }
409         //.$vars['next_page'].' '.$this->lng('page_of_txt').' '.$vars['max_pages'].' &nbsp; ';
410         //* Show Next
411         if(isset($vars['show_page_next']) && $vars['show_page_next'] == 1){
9021d7 412             $content .= '<li><a href="#" data-load-content="'.$vars['list_file'].'?page='.$vars['next_page'].$vars['page_params'].'" aria-label="Next">
8ceb08 413             <span aria-hidden="true">&rsaquo;</span></a></li>';
9021d7 414             $content .= '<li><a href="#" data-load-content="'.$vars['list_file'].'?page='.$vars['pages'].$vars['page_params'].'" aria-label="Last">
8ceb08 415             <span aria-hidden="true">&raquo;</span></a></li>';
7fe908 416         }
8ceb08 417         $content .= '</ul></nav>';
MC 418         
7fe908 419         return $content;
MC 420     }
421
fb02f0 422     public function getPagingHTMLasTXT($vars)
7fe908 423     {
MC 424         global $app;
425         $content = '[<a href="'.$vars['list_file'].'?page=0'.$vars['page_params'].'">|&lt;&lt; </a>]';
426         if($vars['show_page_back'] == 1){
427             $content .= '[<< <a href="'.$vars['list_file'].'?page='.$vars['last_page'].$vars['page_params'].'">'.$app->lng('page_back_txt').'</a>] ';
428         }
429         $content .= ' '.$this->lng('page_txt').' '.$vars['next_page'].' '.$this->lng('page_of_txt').' '.$vars['max_pages'].' ';
430         if($vars['show_page_next'] == 1){
431             $content .= '[<a href="'.$vars['list_file'].'?page='.$vars['next_page'].$vars['page_params'].'">'.$app->lng('page_next_txt').' >></a>] ';
432         }
433         $content .= '[<a href="'.$vars['list_file'].'?page='.$vars['pages'].$vars['page_params'].'"> &gt;&gt;|</a>]';
434         return $content;
435     }
fb02f0 436
7fe908 437     public function getSortSQL()
MC 438     {
439         global $app, $conf;
440         //* Get config vars
441         $sort_field = $this->listDef['sort_field'];
442         $sort_direction = $this->listDef['sort_direction'];
443         return ($sort_field != '' && $sort_direction != '') ? "ORDER BY $sort_field $sort_direction" : '';
444     }
fb02f0 445
7fe908 446     public function decode($record)
MC 447     {
448         global $conf, $app;
449         if(is_array($record) && count($record) > 0 && is_array($this->listDef['item'])) {
450             foreach($this->listDef['item'] as $field){
451                 $key = $field['field'];
452                 //* Apply filter to record value.
453                 if(isset($field['filters']) && is_array($field['filters'])) {
454                     $app->uses('tform');
455                     $record[$key] = $app->tform->filterField($key, (isset($record[$key]))?$record[$key]:'', $field['filters'], 'SHOW');
fb02f0 456                 }
7fe908 457                 if(isset($record[$key])) {
MC 458                     switch ($field['datatype']){
459                     case 'VARCHAR':
460                         case 'TEXT':
461                         $record[$key] = htmlentities(stripslashes($record[$key]), ENT_QUOTES, $conf["html_content_encoding"]);
462                         break;
fb02f0 463
57540e 464                     case 'DATETSTAMP':
7fe908 465                         if ($record[$key] > 0) {
MC 466                             // is value int?
467                             if (preg_match("/^[0-9]+[\.]?[0-9]*$/", $record[$key], $p)) {
468                                 $record[$key] = date($this->lng('conf_format_dateshort'), $record[$key]);
469                             } else {
470                                 $record[$key] = date($this->lng('conf_format_dateshort'), strtotime($record[$key]));
471                             }
472                         }
473                         break;
615a0a 474                     case 'DATETIMETSTAMP':
7fe908 475                         if ($record[$key] > 0) {
MC 476                             // is value int?
477                             if (preg_match("/^[0-9]+[\.]?[0-9]*$/", $record[$key], $p)) {
478                                 $record[$key] = date($this->lng('conf_format_datetime'), $record[$key]);
479                             } else {
480                                 $record[$key] = date($this->lng('conf_format_datetime'), strtotime($record[$key]));
481                             }
482                         }
483                         break;
484                     case 'DATE':
485                         if ($record[$key] > 0) {
486                             // is value int?
487                             if (preg_match("/^[0-9]+[\.]?[0-9]*$/", $record[$key], $p)) {
488                                 $record[$key] = date($this->lng('conf_format_dateshort'), $record[$key]);
489                             } else {
490                                 $record[$key] = date($this->lng('conf_format_dateshort'), strtotime($record[$key]));
491                             }
492                         }
493                         break;
e11f5d 494
7fe908 495                     case 'DATETIME':
MC 496                         if ($record[$key] > 0) {
497                             // is value int?
498                             if (preg_match("/^[0-9]+[\.]?[0-9]*$/", $record[$key], $p)) {
499                                 $record[$key] = date($this->lng('conf_format_datetime'), $record[$key]);
500                             } else {
501                                 $record[$key] = date($this->lng('conf_format_datetime'), strtotime($record[$key]));
502                             }
503                         }
504                         break;
fb02f0 505
7fe908 506                     case 'INTEGER':
MC 507                         $record[$key] = $app->functions->intval($record[$key]);
508                         break;
fb02f0 509
7fe908 510                     case 'DOUBLE':
MC 511                         $record[$key] = htmlentities($record[$key], ENT_QUOTES, $conf["html_content_encoding"]);
512                         break;
fb02f0 513
7fe908 514                     case 'CURRENCY':
MC 515                         $record[$key] = $app->functions->currency_format($record[$key]);
516                         break;
d22277 517                         
MB 518                     case 'BOOLEAN':
519                         if (!function_exists('boolval')) {
520                             $record[$key] = (bool) $record[$key];
521                         } else {
522                             $record[$key] = boolval($record[$key]);
523                         }
524                         break;
7fe908 525
MC 526                     default:
527                         $record[$key] = htmlentities(stripslashes($record[$key]), ENT_QUOTES, $conf["html_content_encoding"]);
528                     }
529                 }
530             }
531         }
532         return $record;
533     }
2af58c 534     
MC 535     /* TODO: check double quoting of SQL */
7fe908 536     public function encode($record)
MC 537     {
538         global $app;
539         if(is_array($record)) {
540             foreach($this->listDef['item'] as $field){
541                 $key = $field['field'];
542                 switch($field['datatype']){
543
544                 case 'VARCHAR':
545                 case 'TEXT':
546                     if(!is_array($record[$key])) {
547                         $record[$key] = $app->db->quote($record[$key]);
548                     } else {
549                         $record[$key] = implode($this->tableDef[$key]['separator'], $record[$key]);
550                     }
551                     break;
552
553                 case 'DATETSTAMP':
554                     if($record[$key] > 0) {
555                         $record[$key] = date('Y-m-d', strtotime($record[$key]));
556                     }
557                     break;
558
559                 case 'DATETIMETSTAMP':
560                     if($record[$key] > 0) {
561                         $record[$key] = date('Y-m-d H:i:s', strtotime($record[$key]));
562                     }
563                     break;
564
565                 case 'DATE':
651642 566                     if($record[$key] != '' && !is_null($record[$key]) && $record[$key] != '0000-00-00') {
7fe908 567                         $record[$key] = $record[$key];
MC 568                     }
569                     break;
570
571                 case 'DATETIME':
572                     if($record[$key] > 0) {
573                         $record[$key] = date('Y-m-d H:i:s', strtotime($record[$key]));
574                     }
575                     break;
576
577                 case 'INTEGER':
578                     $record[$key] = $app->functions->intval($record[$key]);
579                     break;
580
581                 case 'DOUBLE':
582                     $record[$key] = $app->db->quote($record[$key]);
583                     break;
584
585                 case 'CURRENCY':
586                     $record[$key] = str_replace(',', '.', $record[$key]);
587                     break;
d22277 588                 
MB 589                 case 'BOOLEAN':
590                     if (!function_exists('boolval')) {
591                         $record[$key] = (bool) $record[$key];
592                     } else {
593                         $record[$key] = boolval($record[$key]);
594                     }
595                     break;
7fe908 596                 }
MC 597             }
598         }
599         return $record;
600     }
601
fb02f0 602     function lng($msg) {
T 603         global $app;
7fe908 604
fb02f0 605         if(isset($this->wordbook[$msg])) {
T 606             return $this->wordbook[$msg];
607         } else {
608             return $app->lng($msg);
7fe908 609         }
fb02f0 610     }
7fe908 611
ae69e6 612     function escapeArrayValues($search_values) {
7fe908 613         global $conf;
MC 614
ae69e6 615         $out = array();
T 616         if(is_array($search_values)) {
617             foreach($search_values as $key => $val) {
7fe908 618                 $out[$key] = htmlentities($val, ENT_QUOTES, $conf["html_content_encoding"]);
ae69e6 619             }
T 620         }
7fe908 621
ae69e6 622         return $out;
7fe908 623
ae69e6 624     }
fb02f0 625
T 626 }
627
7fe908 628 ?>