MDL-28014 - unpropitious use of bcmod()
[moodle.git] / mod / feedback / item / multichoice / lib.php
1 <?php
2 defined('MOODLE_INTERNAL') OR die('not allowed');
3 require_once($CFG->dirroot.'/mod/feedback/item/feedback_item_class.php');
5 define('FEEDBACK_MULTICHOICE_TYPE_SEP', '>>>>>');
6 define('FEEDBACK_MULTICHOICE_LINE_SEP', '|');
7 define('FEEDBACK_MULTICHOICE_ADJUST_SEP', '<<<<<');
8 define('FEEDBACK_MULTICHOICE_IGNOREEMPTY', 'i');
9 define('FEEDBACK_MULTICHOICE_HIDENOSELECT', 'h');
11 class feedback_item_multichoice extends feedback_item_base {
12     var $type = "multichoice";
13     var $commonparams;
14     var $item_form;
15     var $item;
17     function init() {
19     }
21     function build_editform($item, $feedback, $cm) {
22         global $DB, $CFG;
23         require_once('multichoice_form.php');
25         //get the lastposition number of the feedback_items
26         $position = $item->position;
27         $lastposition = $DB->count_records('feedback_item', array('feedback'=>$feedback->id));
28         if($position == -1){
29             $i_formselect_last = $lastposition + 1;
30             $i_formselect_value = $lastposition + 1;
31             $item->position = $lastposition + 1;
32         }else {
33             $i_formselect_last = $lastposition;
34             $i_formselect_value = $item->position;
35         }
36         //the elements for position dropdownlist
37         $positionlist = array_slice(range(0,$i_formselect_last),1,$i_formselect_last,true);
39         $item->presentation = empty($item->presentation) ? '' : $item->presentation;
40         $info = $this->get_info($item);
42         $item->ignoreempty = $this->ignoreempty($item);
43         $item->hidenoselect = $this->hidenoselect($item);
45         //all items for dependitem
46         $feedbackitems = feedback_get_depend_candidates_for_item($feedback, $item);
47         $commonparams = array('cmid'=>$cm->id,
48                              'id'=>isset($item->id) ? $item->id : NULL,
49                              'typ'=>$item->typ,
50                              'items'=>$feedbackitems,
51                              'feedback'=>$feedback->id);
53         //build the form
54         $this->item_form = new feedback_multichoice_form('edit_item.php', array('item'=>$item, 'common'=>$commonparams, 'positionlist'=>$positionlist, 'position'=>$position, 'info'=>$info));
55     }
57     //this function only can used after the call of build_editform()
58     function show_editform() {
59         $this->item_form->display();
60     }
62     function is_cancelled() {
63         return $this->item_form->is_cancelled();
64     }
66     function get_data() {
67         if($this->item = $this->item_form->get_data()) {
68             return true;
69         }
70         return false;
71     }
73     function save_item() {
74         global $DB;
76         if(!$item = $this->item_form->get_data()) {
77             return false;
78         }
80         if(isset($item->clone_item) AND $item->clone_item) {
81             $item->id = ''; //to clone this item
82             $item->position++;
83         }
85         $this->set_ignoreempty($item, $item->ignoreempty);
86         $this->set_hidenoselect($item, $item->hidenoselect);
88         $item->hasvalue = $this->get_hasvalue();
89         if(!$item->id) {
90             $item->id = $DB->insert_record('feedback_item', $item);
91         }else {
92             $DB->update_record('feedback_item', $item);
93         }
95         return $DB->get_record('feedback_item', array('id'=>$item->id));
96     }
99     //liefert ein eindimensionales Array mit drei Werten(typ, name, XXX)
100     //XXX ist ein eindimensionales Array (anzahl der Antworten bei Typ Radio) Jedes Element ist eine Struktur (answertext, answercount)
101     function get_analysed($item, $groupid = false, $courseid = false) {
102         $info = $this->get_info($item);
104         $analysedItem = array();
105         $analysedItem[] = $item->typ;
106         $analysedItem[] = $item->name;
107         //die moeglichen Antworten extrahieren
108         $answers = null;
109         // $presentation = '';
110         // @list($presentation) = explode(FEEDBACK_RADIO_ADJUST_SEP, $item->presentation); //remove the adjustment-info
112         $answers = explode (FEEDBACK_MULTICHOICE_LINE_SEP, $info->presentation);
113         if(!is_array($answers)) return null;
115         //die Werte holen
116         $values = feedback_get_group_values($item, $groupid, $courseid, $this->ignoreempty($item));
117         if(!$values) return null;
118         //schleife ueber den Werten und ueber die Antwortmoeglichkeiten
120         $analysedAnswer = array();
121         if($info->subtype == 'c') {
122             $sizeofanswers = sizeof($answers);
123             for ($i = 1; $i <= $sizeofanswers; $i++) {
124                 $ans = null;
125                 $ans->answertext = $answers[$i-1];
126                 $ans->answercount = 0;
127                 foreach ($values as $value) {
128                     //ist die Antwort gleich dem index der Antworten + 1?
129                     $vallist = explode(FEEDBACK_MULTICHOICE_LINE_SEP, $value->value);
130                     foreach ($vallist as $val) {
131                         if ($val == $i) {
132                            $ans->answercount++;
133                         }
134                     }
135                 }
136                 $ans->quotient = $ans->answercount / sizeof($values);
137                 $analysedAnswer[] = $ans;
138             }
139         }else {
140             $sizeofanswers = sizeof($answers);
141             for ($i = 1; $i <= $sizeofanswers; $i++) {
142                 $ans = null;
143                 $ans->answertext = $answers[$i-1];
144                 $ans->answercount = 0;
145                 foreach ($values as $value) {
146                     //ist die Antwort gleich dem index der Antworten + 1?
147                     if ($value->value == $i) {
148                         $ans->answercount++;
149                     }
150                 }
151                 $ans->quotient = $ans->answercount / sizeof($values);
152                 $analysedAnswer[] = $ans;
153             }
154         }
155         $analysedItem[] = $analysedAnswer;
156         return $analysedItem;
157     }
159     function get_printval($item, $value) {
160         $info = $this->get_info($item);
162         $printval = '';
164         if (!isset($value->value)) {
165             return $printval;
166         }
168         // @list($presentation) = explode(FEEDBACK_RADIO_ADJUST_SEP, $item->presentation); //remove the adjustment-info
170         $presentation = explode (FEEDBACK_MULTICHOICE_LINE_SEP, $info->presentation);
172         if ($info->subtype == 'c') {
173             $vallist = array_values(explode (FEEDBACK_MULTICHOICE_LINE_SEP, $value->value));
174             $sizeofvallist = sizeof($vallist);
175             $sizeofpresentation = sizeof($presentation);
176             for ($i = 0; $i < $sizeofvallist; $i++) {
177                 for ($k = 0; $k < $sizeofpresentation; $k++) {
178                     if ($vallist[$i] == ($k + 1)) {//Die Werte beginnen bei 1, das Array aber mit 0
179                         $printval .= trim($presentation[$k]) . chr(10);
180                         break;
181                     }
182                 }
183             }
184         } else {
185             $index = 1;
186             foreach($presentation as $pres){
187                 if ($value->value == $index){
188                     $printval = $pres;
189                     break;
190                 }
191                 $index++;
192             }
193         }
194         return $printval;
195     }
197     function print_analysed($item, $itemnr = '', $groupid = false, $courseid = false) {
198         $sep_dec = get_string('separator_decimal', 'feedback');
199         if(substr($sep_dec, 0, 2) == '[['){
200             $sep_dec = FEEDBACK_DECIMAL;
201         }
203         $sep_thous = get_string('separator_thousand', 'feedback');
204         if(substr($sep_thous, 0, 2) == '[['){
205             $sep_thous = FEEDBACK_THOUSAND;
206         }
208         $analysedItem = $this->get_analysed($item, $groupid, $courseid);
209         if($analysedItem) {
210             // $itemnr++;
211             $itemname = $analysedItem[1];
212             echo '<tr><th colspan="2" align="left">'. $itemnr . '&nbsp;('. $item->label .') ' . $itemname .'</th></tr>';
213             $analysedVals = $analysedItem[2];
214             $pixnr = 0;
215             foreach($analysedVals as $val) {
216                 $intvalue = $pixnr % 10;
217                 $pix = "pics/$intvalue.gif";
218                 $pixnr++;
219                 $pixwidth = intval($val->quotient * FEEDBACK_MAX_PIX_LENGTH);
220                 $quotient = number_format(($val->quotient * 100), 2, $sep_dec, $sep_thous);
221                 echo '<tr><td align="left" valign="top">-&nbsp;&nbsp;' . trim($val->answertext) . ':</td><td align="left" style="width: '.FEEDBACK_MAX_PIX_LENGTH.'"><img alt="'.$intvalue.'" src="'.$pix.'" height="5" width="'.$pixwidth.'" />&nbsp;' . $val->answercount . (($val->quotient > 0)?'&nbsp;('. $quotient . '&nbsp;%)':'').'</td></tr>';
222             }
223         }
224         // return $itemnr;
225     }
227     function excelprint_item(&$worksheet, $rowOffset, $xlsFormats, $item, $groupid, $courseid = false) {
228         $analysed_item = $this->get_analysed($item, $groupid, $courseid);
230         $data = $analysed_item[2];
232         // $worksheet->setFormat("<l><f><ro2><vo><c:green>");
233         //frage schreiben
234         $worksheet->write_string($rowOffset, 0, $item->label, $xlsFormats->head2);
235         $worksheet->write_string($rowOffset, 1, $analysed_item[1], $xlsFormats->head2);
236         if (is_array($data)) {
237             $sizeofdata = sizeof($data);
238             for ($i = 0; $i < $sizeofdata; $i++) {
239                 $aData = $data[$i];
241                 // $worksheet->setFormat("<l><f><ro2><vo><c:blue>");
242                 $worksheet->write_string($rowOffset, $i + 2, trim($aData->answertext), $xlsFormats->head2);
244                 // $worksheet->setFormat("<l><vo>");
245                 $worksheet->write_number($rowOffset + 1, $i + 2, $aData->answercount, $xlsFormats->default);
246                 // $worksheet->setFormat("<l><f><vo><pr>");
247                 $worksheet->write_number($rowOffset + 2, $i + 2, $aData->quotient, $xlsFormats->procent);
248             }
249         }
250         $rowOffset += 3;
251         return $rowOffset;
252     }
254     /**
255      * print the item at the edit-page of feedback
256      *
257      * @global object
258      * @param object $item
259      * @return void
260      */
261     function print_item_preview($item) {
262         global $OUTPUT, $DB;
263         $info = $this->get_info($item);
264         $align = right_to_left() ? 'right' : 'left';
266         $presentation = explode (FEEDBACK_MULTICHOICE_LINE_SEP, $info->presentation);
269         //test if required and no value is set so we have to mark this item
270         //we have to differ check and the other subtypes
271         $requiredmark =  ($item->required == 1) ? '<span class="feedback_required_mark">*</span>' : '';
273         //print the question and label
274         echo '<div class="feedback_item_label_'.$align.'">';
275         echo '('.$item->label.') ';
276         echo format_text($item->name.$requiredmark, true, false, false);
277         if($item->dependitem) {
278             if($dependitem = $DB->get_record('feedback_item', array('id'=>$item->dependitem))) {
279                 echo ' <span class="feedback_depend">('.$dependitem->label.'-&gt;'.$item->dependvalue.')</span>';
280             }
281         }
282         echo '</div>';
284         //print the presentation
285         echo '<div class="feedback_item_presentation_'.$align.'">';
286         $index = 1;
287         $checked = '';
288         echo '<ul>';
289         if($info->horizontal) {
290             $hv = 'h';
291         }else {
292             $hv = 'v';
293         }
295         if($info->subtype == 'r' AND !$this->hidenoselect($item)) {
296         //print the "not_selected" item on radiobuttons
297         ?>
298             <li class="feedback_item_radio_<?php echo $hv.'_'.$align;?>">
299                 <span class="feedback_item_radio_<?php echo $hv.'_'.$align;?>">
300                     <input type="radio" name="<?php echo $item->typ . '_' . $item->id ;?>" id="<?php echo $item->typ . '_' . $item->id.'_xxx';?>" value="" checked="checked" />
301                 </span>
302                 <span class="feedback_item_radiolabel_<?php echo $hv.'_'.$align;?>">
303                     <label for="<?php echo $item->typ . '_' . $item->id.'_xxx';?>"><?php print_string('not_selected', 'feedback');?>&nbsp;</label>
304                 </span>
305             </li>
306         <?php
307         }
309         switch($info->subtype) {
310             case 'r':
311                 $this->print_item_radio($presentation, $item, false, $info, $align);
312                 break;
313             case 'c':
314                 $this->print_item_check($presentation, $item, false, $info, $align);
315                 break;
316             case 'd':
317                 $this->print_item_dropdown($presentation, $item, false, $info, $align);
318                 break;
319         }
320         echo '</ul>';
321         echo '</div>';
322     }
324     /**
325      * print the item at the complete-page of feedback
326      *
327      * @global object
328      * @param object $item
329      * @param string $value
330      * @param bool $highlightrequire
331      * @return void
332      */
333     function print_item_complete($item, $value = '', $highlightrequire = false) {
334         global $OUTPUT;
335         $info = $this->get_info($item);
336         $align = right_to_left() ? 'right' : 'left';
338         $presentation = explode (FEEDBACK_MULTICHOICE_LINE_SEP, $info->presentation);
341         //test if required and no value is set so we have to mark this item
342         //we have to differ check and the other subtypes
343         if($info->subtype == 'c') {
344             if (is_array($value)) {
345                 $values = $value;
346             }else {
347                 $values = explode(FEEDBACK_MULTICHOICE_LINE_SEP, $value);
348             }
349             if($highlightrequire AND $item->required AND $values[0] == '') {
350                 $highlight = ' missingrequire';
351             }else {
352                 $highlight = '';
353             }
354             $requiredmark =  ($item->required == 1)?'<span class="feedback_required_mark">*</span>':'';
355         }else {
356             if($highlightrequire AND $item->required AND intval($value) <= 0) {
357                 $highlight = ' missingrequire';
358             }else {
359                 $highlight = '';
360             }
361             $requiredmark =  ($item->required == 1)?'<span class="feedback_required_mark">*</span>':'';
362         }
364         //print the question and label
365         echo '<div class="feedback_item_label_'.$align.$highlight.'">';
366             echo format_text($item->name.$requiredmark, true, false, false);
367         echo '</div>';
369         //print the presentation
370         echo '<div class="feedback_item_presentation_'.$align.$highlight.'">';
372         echo '<ul>';
373         if($info->horizontal) {
374             $hv = 'h';
375         }else {
376             $hv = 'v';
377         }
378         //print the "not_selected" item on radiobuttons
379         if($info->subtype == 'r' AND !$this->hidenoselect($item)) {
380         ?>
381             <li class="feedback_item_radio_<?php echo $hv.'_'.$align;?>">
382                 <span class="feedback_item_radio_<?php echo $hv.'_'.$align;?>">
383                     <input type="radio" name="<?php echo $item->typ.'_'.$item->id ;?>" id="<?php echo $item->typ . '_' . $item->id.'_xxx';?>" value="" <?php echo $value ? '' : 'checked="checked"';?> />
384                 </span>
385                 <span class="feedback_item_radiolabel_<?php echo $hv.'_'.$align;?>">
386                     <label for="<?php echo $item->typ.'_'.$item->id.'_xxx';?>"><?php print_string('not_selected', 'feedback');?>&nbsp;</label>
387                 </span>
388             </li>
389         <?php
390         }
392         switch($info->subtype) {
393             case 'r':
394                 $this->print_item_radio($presentation, $item, $value, $info, $align);
395                 break;
396             case 'c':
397                 $this->print_item_check($presentation, $item, $value, $info, $align);
398                 break;
399             case 'd':
400                 $this->print_item_dropdown($presentation, $item, $value, $info, $align);
401                 break;
402         }
403         echo '</ul>';
404         echo '</div>';
405     }
407     /**
408      * print the item at the complete-page of feedback
409      *
410      * @global object
411      * @param object $item
412      * @param string $value
413      * @return void
414      */
415     function print_item_show_value($item, $value = '') {
416         global $OUTPUT;
417         $info = $this->get_info($item);
418         $align = right_to_left() ? 'right' : 'left';
420         $presentation = explode (FEEDBACK_MULTICHOICE_LINE_SEP, $info->presentation);
423         //test if required and no value is set so we have to mark this item
424         //we have to differ check and the other subtypes
425         if($info->subtype == 'c') {
426             if (is_array($value)) {
427                 $values = $value;
428             }else {
429                 $values = explode(FEEDBACK_MULTICHOICE_LINE_SEP, $value);
430             }
431             $requiredmark =  ($item->required == 1)?'<span class="feedback_required_mark">*</span>':'';
432         }else {
433             $requiredmark =  ($item->required == 1)?'<span class="feedback_required_mark">*</span>':'';
434         }
436         //print the question and label
437         echo '<div class="feedback_item_label_'.$align.'">';
438         echo '('.$item->label.') ';
439         echo format_text($item->name . $requiredmark, true, false, false);
440         echo '</div>';
442         //print the presentation
443         echo '<div class="feedback_item_presentation_'.$align.'">';
444         $index = 1;
445         if($info->subtype == 'c') {
446             echo $OUTPUT->box_start('generalbox boxalign'.$align);
447             foreach($presentation as $pres){
448                 foreach($values as $val) {
449                     if($val == $index){
450                         echo '<div class="feedback_item_multianswer">';
451                         echo text_to_html($pres, true, false, false);
452                         echo '</div>';
453                         break;
454                     }
455                 }
456                 $index++;
457             }
458             echo $OUTPUT->box_end();
459         }else {
460             foreach($presentation as $pres){
461                 if($value == $index){
462                     echo $OUTPUT->box_start('generalbox boxalign'.$align);
463                     echo text_to_html($pres, true, false, false);
464                     echo $OUTPUT->box_end();
465                     break;
466                 }
467                 $index++;
468             }
469         }
470         echo '</div>';
471     }
473     function check_value($value, $item) {
474         $info = $this->get_info($item);
476         if($info->subtype == 'c') {
477             if((!isset($value) OR !is_array($value) OR $value[0] == '' OR $value[0] == 0) AND $item->required != 1){
478                 return true;
479             }
480             if($value[0] == ""){
481                 return false;
482             }
483             return true;
484         }else {
485             //if the item is not required, so the check is true if no value is given
486             if((!isset($value) OR $value == '' OR $value == 0) AND $item->required != 1) return true;
487             if(intval($value) > 0)return true;
488         }
489         return false;
490     }
492     function create_value($data) {
493         $vallist = $data;
494         return trim($this->item_arrayToString($vallist));
495     }
497     //compares the dbvalue with the dependvalue
498     //dbvalue is the number of one selection
499     //dependvalue is the presentation of one selection
500     function compare_value($item, $dbvalue, $dependvalue) {
502         if (is_array($dbvalue)) {
503             $dbvalues = $dbvalue;
504         }else {
505             $dbvalues = explode(FEEDBACK_MULTICHOICE_LINE_SEP, $dbvalue);
506         }
508         $info = $this->get_info($item);
509         $presentation = explode (FEEDBACK_MULTICHOICE_LINE_SEP, $info->presentation);
510         $index = 1;
511         foreach($presentation as $pres) {
512             foreach($dbvalues as $dbval) {
513                 if($dbval == $index AND trim($pres) == $dependvalue) {
514                     return true;
515                 }
516             }
517             $index++;
518         }
519         return false;
520     }
522     function get_presentation($data) {
523         $present = str_replace("\n", FEEDBACK_MULTICHOICE_LINE_SEP, trim($data->itemvalues));
524         if(!isset($data->subtype)) {
525             $subtype = 'r';
526         }else {
527             $subtype = substr($data->subtype, 0, 1);
528         }
529         if(isset($data->horizontal) AND $data->horizontal == 1 AND $subtype != 'd') {
530             $present .= FEEDBACK_MULTICHOICE_ADJUST_SEP.'1';
531         }
532         return $subtype.FEEDBACK_MULTICHOICE_TYPE_SEP.$present;
533     }
535     function get_hasvalue() {
536         return 1;
537     }
539     function get_info($item) {
540         $presentation = empty($item->presentation) ? '' : $item->presentation;
542         $info = new stdClass();
543         //check the subtype of the multichoice
544         //it can be check(c), radio(r) or dropdown(d)
545         $info->subtype = '';
546         $info->presentation = '';
547         $info->horizontal = false;
549         @list($info->subtype, $info->presentation) = explode(FEEDBACK_MULTICHOICE_TYPE_SEP, $item->presentation);
550         if(!isset($info->subtype)) {
551             $info->subtype = 'r';
552         }
554         if($info->subtype != 'd') {
555             @list($info->presentation, $info->horizontal) = explode(FEEDBACK_MULTICHOICE_ADJUST_SEP, $info->presentation);
556             if(isset($info->horizontal) AND $info->horizontal == 1) {
557                 $info->horizontal = true;
558             }else {
559                 $info->horizontal = false;
560             }
561         }
562         return $info;
563     }
565     function item_arrayToString($value) {
566         if (!is_array($value)) {
567             return $value;
568         }
569         $retval = '';
570         $arrvals = array_values($value);
571         $arrvals = clean_param($arrvals, PARAM_INT);  //prevent sql-injection
572         $retval = $arrvals[0];
573         $sizeofarrvals = sizeof($arrvals);
574         for ($i = 1; $i < $sizeofarrvals; $i++) {
575             $retval .= FEEDBACK_MULTICHOICE_LINE_SEP.$arrvals[$i];
576         }
577         return $retval;
578     }
580     function print_item_radio($presentation, $item, $value, $info, $align) {
581         $index = 1;
582         $checked = '';
584         if($info->horizontal) {
585             $hv = 'h';
586         }else {
587             $hv = 'v';
588         }
590         foreach($presentation as $radio){
591             if($value == $index){
592                 $checked = 'checked="checked"';
593             }else{
594                 $checked = '';
595             }
596             $inputname = $item->typ . '_' . $item->id;
597             $inputid = $inputname.'_'.$index;
598         ?>
599             <li class="feedback_item_radio_<?php echo $hv.'_'.$align;?>">
600                 <span class="feedback_item_radio_<?php echo $hv.'_'.$align;?>">
601                     <input type="radio" name="<?php echo $inputname;?>" id="<?php echo $inputid;?>" value="<?php echo $index;?>" <?php echo $checked;?> />
602                 </span>
603                 <span class="feedback_item_radiolabel_<?php echo $hv.'_'.$align;?>">
604                     <label for="<?php echo $inputid;?>"><?php echo text_to_html($radio, true, false, false);?>&nbsp;</label>
605                 </span>
606             </li>
607         <?php
608             $index++;
609         }
610     }
612     function print_item_check($presentation, $item, $value, $info, $align) {
614         if (is_array($value)) {
615             $values = $value;
616         }else {
617             $values = explode(FEEDBACK_MULTICHOICE_LINE_SEP, $value);
618         }
620         if($info->horizontal) {
621             $hv = 'h';
622         }else {
623             $hv = 'v';
624         }
626         $index = 1;
627         $checked = '';
628         foreach($presentation as $check){
629             foreach($values as $val) {
630                 if($val == $index){
631                     $checked = 'checked="checked"';
632                     break;
633                 }else{
634                     $checked = '';
635                 }
636             }
637             $inputname = $item->typ. '_' . $item->id;
638             $inputid = $item->typ. '_' . $item->id.'_'.$index;
639         ?>
640             <li class="feedback_item_check_<?php echo $hv.'_'.$align;?>">
641                 <span class="feedback_item_check_<?php echo $hv.'_'.$align;?>">
642                     <input type="checkbox" name="<?php echo $inputname;?>[]" id="<?php echo $inputid;?>" value="<?php echo $index;?>" <?php echo $checked;?> />
643                 </span>
644                 <span class="feedback_item_radiolabel_<?php echo $hv.'_'.$align;?>">
645                     <label for="<?php echo $inputid;?>"><?php echo text_to_html($check, true, false, false);?>&nbsp;</label>
646                 </span>
647             </li>
648         <?php
649             $index++;
650         }
651     }
653     function print_item_dropdown($presentation, $item, $value, $info, $align) {
654         if($info->horizontal) {
655             $hv = 'h';
656         }else {
657             $hv = 'v';
658         }
660         ?>
661         <li class="feedback_item_select_<?php echo $hv.'_'.$align;?>">
662             <select name="<?php echo $item->typ .'_' . $item->id;?>" size="1">
663                 <option value="0">&nbsp;</option>
664                 <?php
665                 $index = 1;
666                 $checked = '';
667                 foreach($presentation as $dropdown){
668                     if($value == $index){
669                         $selected = 'selected="selected"';
670                     }else{
671                         $selected = '';
672                     }
673                 ?>
674                     <option value="<?php echo $index;?>" <?php echo $selected;?>><?php echo text_to_html($dropdown, true, false, false);?></option>
675                 <?php
676                     $index++;
677                 }
678                 ?>
679             </select>
680         </li>
681         <?php
682     }
684     function set_ignoreempty($item, $ignoreempty=true) {
685         $item->options = str_replace(FEEDBACK_MULTICHOICE_IGNOREEMPTY, '', $item->options);
686         if($ignoreempty) {
687             $item->options .= FEEDBACK_MULTICHOICE_IGNOREEMPTY;
688         }
689     }
691     function ignoreempty($item) {
692         if(strstr($item->options, FEEDBACK_MULTICHOICE_IGNOREEMPTY)) {
693             return true;
694         }
695         return false;
696     }
698     function set_hidenoselect($item, $hidenoselect=true) {
699         $item->options = str_replace(FEEDBACK_MULTICHOICE_HIDENOSELECT, '', $item->options);
700         if($hidenoselect) {
701             $item->options .= FEEDBACK_MULTICHOICE_HIDENOSELECT;
702         }
703     }
705     function hidenoselect($item) {
706         if(strstr($item->options, FEEDBACK_MULTICHOICE_HIDENOSELECT)) {
707             return true;
708         }
709         return false;
710     }
713     function can_switch_require() {
714         return true;
715     }