Index: branches/5.2.x/core/kernel/utility/formatters/options_formatter.php =================================================================== --- branches/5.2.x/core/kernel/utility/formatters/options_formatter.php (revision 16647) +++ branches/5.2.x/core/kernel/utility/formatters/options_formatter.php (revision 16648) @@ -1,116 +1,132 @@ GetFieldOptions($field_name); if (!array_key_exists('options', $field_options) || !is_array($field_options['options'])) { trigger_error('Options not defined for '.$object->Prefix.' field '.$field_name.'', E_USER_WARNING); return $value; } $options = $field_options['options']; $use_phrases = array_key_exists('use_phrases', $field_options) ? $field_options['use_phrases'] : false; - if (strpos($value, '|') !== false) { - // multiple checkboxes OR multiselect - $values = Array (); - $values_unsorted = explode('|', substr($value, 1, -1) ); + if ( strpos($value, '|') !== false ) { + // Multiple checkboxes OR multiselect. + $sorted_values = array(); + $selected_values = explode('|', substr($value, 1, -1)); // 1. sort values using options order from unit config - $key_indexes = array_keys($options); - foreach ($values_unsorted as $value) { - $values[ array_search($value, $key_indexes) ] = $value; + $existing_values = array_keys($options); + $non_existing_selected_values = array_diff($selected_values, $existing_values); + + if ( $non_existing_selected_values ) { + $selected_values = array_diff($selected_values, $non_existing_selected_values); + + foreach ( $selected_values as $unsorted_value ) { + $sorted_values[array_search($unsorted_value, $existing_values)] = $unsorted_value; + } + + ksort($sorted_values); + $sorted_values = array_merge($sorted_values, $non_existing_selected_values); + } + else { + foreach ( $selected_values as $unsorted_value ) { + $sorted_values[array_search($unsorted_value, $existing_values)] = $unsorted_value; + } + + ksort($sorted_values); } - ksort($values); // 2. convert values to titles - $labels = Array (); - foreach ($values as $value) { - $label = $this->formatOption($value, $options, $use_phrases); - if ($label) { + $labels = array(); + + foreach ( $sorted_values as $sorted_value ) { + $label = $this->formatOption($sorted_value, $options, $use_phrases); + + if ( $label ) { $labels[] = $label; } } return implode($format, $labels); } - else { - return $this->formatOption($value, $options, $use_phrases); - } + + return $this->formatOption($value, $options, $use_phrases); } function formatOption($value, $options, $use_phrases = true) { $label = getArrayValue($options, $value); if ($label !== false) { // option_id found in options array return $use_phrases ? $this->Application->Phrase($label) : $label; } else { // option_id not found return "$value" == "0" ? '' : $value; } } /** * Performs basic type validation on form field value * * @param mixed $value * @param string $field_name * @param kDBItem $object * @return mixed * @access public */ public function Parse($value, $field_name, &$object) { if ( $value == '' ) { return NULL; } $found = $option_key = false; $options = $object->GetFieldOptions($field_name); $use_phrases = getArrayValue($options, 'use_phrases'); foreach ($options['options'] as $option_key => $option_value) { if ( $use_phrases ) { $option_value = $this->Application->Phrase($option_value); } if ( "$option_value" === "$value" ) { $found = true; break; } } return $found ? $option_key : $value; } -} \ No newline at end of file +}