MDL-55127 mod_data: Search entries fixes
[moodle.git] / mod / data / field / checkbox / 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_checkbox extends data_field_base {
27     var $type = 'checkbox';
28     /**
29      * priority for globalsearch indexing
30      *
31      * @var int
32      */
33     protected static $priority = self::LOW_PRIORITY;
35     function display_add_field($recordid = 0, $formdata = null) {
36         global $CFG, $DB, $OUTPUT;
38         $content = array();
40         if ($formdata) {
41             $fieldname = 'field_' . $this->field->id;
42             $content = $formdata->$fieldname;
43         } else if ($recordid) {
44             $content = $DB->get_field('data_content', 'content', array('fieldid'=>$this->field->id, 'recordid'=>$recordid));
45             $content = explode('##', $content);
46         } else {
47             $content = array();
48         }
50         $str = '<div title="' . s($this->field->description) . '">';
51         $str .= '<fieldset><legend><span class="accesshide">'.$this->field->name;
52         if ($this->field->required) {
53             $str .= '$nbsp;' . get_string('requiredelement', 'form');
54             $str .= '</span></legend>';
55             $image = html_writer::img($OUTPUT->pix_url('req'), get_string('requiredelement', 'form'),
56                                      array('class' => 'req', 'title' => get_string('requiredelement', 'form')));
57             $str .= html_writer::div($image, 'inline-req');
58         } else {
59             $str .= '</span></legend>';
60         }
62         $i = 0;
63         foreach (explode("\n", $this->field->param1) as $checkbox) {
64             $checkbox = trim($checkbox);
65             if ($checkbox === '') {
66                 continue; // skip empty lines
67             }
68             $str .= '<input type="hidden" name="field_' . $this->field->id . '[]" value="" />';
69             $str .= '<input type="checkbox" id="field_'.$this->field->id.'_'.$i.'" name="field_' . $this->field->id . '[]" ';
70             $str .= 'value="' . s($checkbox) . '" class="mod-data-input" ';
72             if (array_search($checkbox, $content) !== false) {
73                 $str .= 'checked />';
74             } else {
75                 $str .= '/>';
76             }
77             $str .= '<label for="field_'.$this->field->id.'_'.$i.'">'.$checkbox.'</label><br />';
78             $i++;
79         }
80         $str .= '</fieldset>';
81         $str .= '</div>';
82         return $str;
83     }
85     function display_search_field($value='') {
86         global $CFG, $DB;
88         if (is_array($value)) {
89             $content = $value['checked'];
90             $allrequired = $value['allrequired'] ? true : false;
91         } else {
92             $content = array();
93             $allrequired = false;
94         }
96         $str = '';
97         $found = false;
98         foreach (explode("\n",$this->field->param1) as $checkbox) {
99             $checkbox = trim($checkbox);
101             if (in_array($checkbox, $content)) {
102                 $str .= html_writer::checkbox('f_'.$this->field->id.'[]', s($checkbox), true, $checkbox);
103             } else {
104                 $str .= html_writer::checkbox('f_'.$this->field->id.'[]', s($checkbox), false, $checkbox);
105             }
106             $str .= html_writer::empty_tag('br');
107             $found = true;
108         }
109         if (!$found) {
110             return '';
111         }
113         $str .= html_writer::checkbox('f_'.$this->field->id.'_allreq', null, $allrequired, get_string('selectedrequired', 'data'));
114         return $str;
115     }
117     function parse_search_field() {
118         $selected    = optional_param_array('f_'.$this->field->id, array(), PARAM_NOTAGS);
119         $allrequired = optional_param('f_'.$this->field->id.'_allreq', 0, PARAM_BOOL);
120         if (empty($selected)) {
121             // no searching
122             return '';
123         }
124         return array('checked'=>$selected, 'allrequired'=>$allrequired);
125     }
127     function generate_sql($tablealias, $value) {
128         global $DB;
130         static $i=0;
131         $i++;
132         $name = "df_checkbox_{$i}_";
133         $params = array();
134         $varcharcontent = $DB->sql_compare_text("{$tablealias}.content", 255);
136         $allrequired = $value['allrequired'];
137         $selected    = $value['checked'];
139         if ($selected) {
140             $conditions = array();
141             $j=0;
142             foreach ($selected as $sel) {
143                 $j++;
144                 $xname = $name.$j;
145                 $likesel = str_replace('%', '\%', $sel);
146                 $likeselsel = str_replace('_', '\_', $likesel);
147                 $conditions[] = "({$tablealias}.fieldid = {$this->field->id} AND ({$varcharcontent} = :{$xname}a
148                                                                                OR {$tablealias}.content LIKE :{$xname}b
149                                                                                OR {$tablealias}.content LIKE :{$xname}c
150                                                                                OR {$tablealias}.content LIKE :{$xname}d))";
151                 $params[$xname.'a'] = $sel;
152                 $params[$xname.'b'] = "$likesel##%";
153                 $params[$xname.'c'] = "%##$likesel";
154                 $params[$xname.'d'] = "%##$likesel##%";
155             }
156             if ($allrequired) {
157                 return array(" (".implode(" AND ", $conditions).") ", $params);
158             } else {
159                 return array(" (".implode(" OR ", $conditions).") ", $params);
160             }
161         } else {
162             return array(" ", array());
163         }
164     }
166     function update_content($recordid, $value, $name='') {
167         global $DB;
169         $content = new stdClass();
170         $content->fieldid = $this->field->id;
171         $content->recordid = $recordid;
172         $content->content = $this->format_data_field_checkbox_content($value);
174         if ($oldcontent = $DB->get_record('data_content', array('fieldid'=>$this->field->id, 'recordid'=>$recordid))) {
175             $content->id = $oldcontent->id;
176             return $DB->update_record('data_content', $content);
177         } else {
178             return $DB->insert_record('data_content', $content);
179         }
180     }
182     function display_browse_field($recordid, $template) {
183         global $DB;
185         if ($content = $DB->get_record('data_content', array('fieldid'=>$this->field->id, 'recordid'=>$recordid))) {
186             if (strval($content->content) === '') {
187                 return false;
188             }
190             $options = explode("\n",$this->field->param1);
191             $options = array_map('trim', $options);
193             $contentArr = explode('##', $content->content);
194             $str = '';
195             foreach ($contentArr as $line) {
196                 if (!in_array($line, $options)) {
197                     // hmm, looks like somebody edited the field definition
198                     continue;
199                 }
200                 $str .= $line . "<br />\n";
201             }
202             return $str;
203         }
204         return false;
205     }
207     function format_data_field_checkbox_content($content) {
208         if (!is_array($content)) {
209             return NULL;
210         }
211         $options = explode("\n", $this->field->param1);
212         $options = array_map('trim', $options);
214         $vals = array();
215         foreach ($content as $key=>$val) {
216             if ($key === 'xxx') {
217                 continue;
218             }
219             if (!in_array($val, $options)) {
220                 continue;
222             }
223             $vals[] = $val;
224         }
226         if (empty($vals)) {
227             return NULL;
228         }
230         return implode('##', $vals);
231     }
233     /**
234      * Check whether any boxes in the checkbox where checked.
235      *
236      * @param mixed $value The submitted values
237      * @param mixed $name
238      * @return bool
239      */
240     function notemptyfield($value, $name) {
241         $found = false;
242         foreach ($value as $checkboxitem) {
243             if (strval($checkboxitem) !== '') {
244                 $found = true;
245                 break;
246             }
247         }
248         return $found;
249     }
251     /**
252      * Returns the presentable string value for a field content.
253      *
254      * The returned string should be plain text.
255      *
256      * @param stdClass $content
257      * @return string
258      */
259     public static function get_content_value($content) {
260         $arr = explode('##', $content->content);
262         $strvalue = '';
263         foreach ($arr as $a) {
264             $strvalue .= $a . ' ';
265         }
267         return trim($strvalue, "\r\n ");
268     }