]> git.mjollnir.org Git - moodle.git/commitdiff
MDL-14390 fixed saving of multiselect field type; merged from MOODLE_19_STABLE
authorskodak <skodak>
Wed, 16 Apr 2008 14:51:44 +0000 (14:51 +0000)
committerskodak <skodak>
Wed, 16 Apr 2008 14:51:44 +0000 (14:51 +0000)
mod/data/field/multimenu/field.class.php

index 82760cfcae29ffe30b1d9f376bfa5d8b5324a4bc..ed6e8305346fd50d612b1559ccb6f06939bf79b8 100755 (executable)
@@ -41,18 +41,19 @@ class data_field_multimenu extends data_field_base {
         }
 
         $str = '<div title="'.s($this->field->description).'">';
+        $str .= '<input name="field_' . $this->field->id . '[xxx]" type="hidden" value="xxx"/>'; // hidden field - needed for empty selection
         $str .= '<select name="field_' . $this->field->id . '[]" id="field_' . $this->field->id . '" multiple="multiple">';
 
         foreach (explode("\n",$this->field->param1) as $option) {
             $option = trim($option);
             $str .= '<option value="' . s($option) . '"';
 
-            if (array_search($option, $content) !== false) {
+            if (in_array($option, $content)) {
                 // Selected by user.
-                $str .= ' selected >';
-            } else {
-                $str .= '>';
+                $str .= ' selected = "selected"';
             }
+
+            $str .= '>';
             $str .= $option . '</option>';
         }
         $str .= '</select>';
@@ -80,13 +81,11 @@ class data_field_multimenu extends data_field_base {
             $option = trim($option);
             $str .= '<option value="' . s($option) . '"';
 
-            if (array_search($option, $content) !== false) {
+            if (in_array(addslashes($option), $content)) {
                 // Selected by user.
-                $str .= ' selected >';
-            } else {
-                $str .= '>';
+                $str .= ' selected = "selected"';
             }
-            $str .= $option . '</option>';
+            $str .= '>' . $option . '</option>';
         }
         $str .= '</select>';
 
@@ -129,9 +128,9 @@ class data_field_multimenu extends data_field_base {
 
     function update_content($recordid, $value, $name='') {
         $content = new object;
-        $content->fieldid = $this->field->id;
+        $content->fieldid  = $this->field->id;
         $content->recordid = $recordid;
-        $content->content = $this->format_data_field_multimenu_content($value);
+        $content->content  = $this->format_data_field_multimenu_content($value);
 
         if ($oldcontent = get_record('data_content','fieldid', $this->field->id, 'recordid', $recordid)) {
             $content->id = $oldcontent->id;
@@ -143,16 +142,27 @@ class data_field_multimenu extends data_field_base {
 
     function format_data_field_multimenu_content($content) {
         if (!is_array($content)) {
-            $str = $content;
-        } else {
-            $str = '';
-            foreach ($content as $val) {
-                $str .= $val . '##';
+            return NULL;
+        }
+        $options = explode("\n", $this->field->param1);
+        $options = array_map('trim', $options);
+
+        $vals = array();
+        foreach ($content as $key=>$val) {
+            if ($key === 'xxx') {
+                continue;
+            }
+            if (!in_array(stripslashes($val), $options)) {
+                continue;
             }
-            $str = substr($str, 0, -2);
+            $vals[] = $val;
         }
-        $str = clean_param($str, PARAM_NOTAGS);
-        return $str;
+
+        if (empty($vals)) {
+            return NULL;
+        }
+
+        return implode('##', $vals);
     }