MDL-21437 data - number and date fields search under mssql and oracle
[moodle.git] / mod / data / field / number / field.class.php
1 <?php
2 ///////////////////////////////////////////////////////////////////////////
3 //                                                                       //
4 // NOTICE OF COPYRIGHT                                                   //
5 //                                                                       //
6 // Moodle - Modular Object-Oriented Dynamic Learning Environment         //
7 //          http://moodle.org                                            //
8 //                                                                       //
9 // Copyright (C) 1999-onwards Moodle Pty Ltd  http://moodle.com          //
10 //                                                                       //
11 // This program is free software; you can redistribute it and/or modify  //
12 // it under the terms of the GNU General Public License as published by  //
13 // the Free Software Foundation; either version 2 of the License, or     //
14 // (at your option) any later version.                                   //
15 //                                                                       //
16 // This program is distributed in the hope that it will be useful,       //
17 // but WITHOUT ANY WARRANTY; without even the implied warranty of        //
18 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         //
19 // GNU General Public License for more details:                          //
20 //                                                                       //
21 //          http://www.gnu.org/copyleft/gpl.html                         //
22 //                                                                       //
23 ///////////////////////////////////////////////////////////////////////////
25 class data_field_number extends data_field_base {
26     var $type = 'number';
28     function update_content($recordid, $value, $name='') {
29         global $DB;
31         $content = new stdClass();
32         $content->fieldid = $this->field->id;
33         $content->recordid = $recordid;
34         $value = trim($value);
35         if (strlen($value) > 0) {
36             $content->content = floatval($value);
37         } else {
38             $content->content = null;
39         }
40         if ($oldcontent = $DB->get_record('data_content', array('fieldid'=>$this->field->id, 'recordid'=>$recordid))) {
41             $content->id = $oldcontent->id;
42             return $DB->update_record('data_content', $content);
43         } else {
44             return $DB->insert_record('data_content', $content);
45         }
46     }
48     function display_browse_field($recordid, $template) {
49         global $DB;
51         if ($content = $DB->get_record('data_content', array('fieldid'=>$this->field->id, 'recordid'=>$recordid))) {
52             if (strlen($content->content) < 1) {
53                 return false;
54             }
55             $number = $content->content;
56             $decimals = trim($this->field->param1);
57             // only apply number formatting if param1 contains an integer number >= 0:
58             if (preg_match("/^\d+$/", $decimals)) {
59                 $decimals = $decimals * 1;
60                 // removes leading zeros (eg. '007' -> '7'; '00' -> '0')
61                 $str = format_float($number, $decimals, true);
62                 // For debugging only:
63 #                $str .= " ($decimals)";
64             } else {
65                 $str = $number;
66             }
67             return $str;
68         }
69         return false;
70     }
72     function display_search_field($value = '') {
73         return '<input type="text" size="16" name="f_'.$this->field->id.'" value="'.$value.'" />';
74     }
76     function parse_search_field() {
77         return optional_param('f_'.$this->field->id, '', PARAM_NOTAGS);
78     }
80     // need to cast?
81     function generate_sql($tablealias, $value) {
82         global $DB;
84         static $i=0;
85         $i++;
86         $name = "df_number_$i";
87         $varcharcontent = $DB->sql_compare_text("{$tablealias}.content");
88         return array(" ({$tablealias}.fieldid = {$this->field->id} AND $varcharcontent = :$name) ", array($name=>$value));
89     }
91     function get_sort_sql($fieldname) {
92         global $DB;
93         switch ($DB->get_db_family()) {
94             case 'mysql':
95                 // string in an arithmetic operation is converted to a floating-point number
96                 return '('.$fieldname.'+0.0)';
97             case 'postgres':
98                 // cast for PG
99                 return 'CAST('.$fieldname.' AS REAL)';
100             default:
101                 // the rest, just the field name. TODO: Analyse behaviour under MSSQL and Oracle
102                 return $fieldname;
103         }
104     }