Index: core/kernel/db/db_tag_processor.php IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- core/kernel/db/db_tag_processor.php (revision 15958) +++ core/kernel/db/db_tag_processor.php (revision ) @@ -1188,14 +1188,16 @@ $block_params['field_name'] = ''; } else { - $block_params['field_name'] = $this->InputName($params); // depricated (produces warning when used as grid filter), but used in Front-End (submission create), admin (submission view) + // deprecated (produces warning when used as grid filter), but used in Front-End (submission create), admin (submission view) + $block_params['field_name'] = $this->InputName($params); } + $selected_html = isset($params['selected']) ? $params['selected'] : 'selected'; $selected_param_name = array_key_exists('selected_param', $params) ? $params['selected_param'] : false; + if (!$selected_param_name) { - $selected_param_name = $params['selected']; + $selected_param_name = $selected_html; } - $selected = $params['selected']; $o = ''; if (array_key_exists('no_empty', $params) && $params['no_empty'] && !getArrayValue($options, '')) { @@ -1203,35 +1205,93 @@ array_shift($options); } - $index = 0; + $selected_option_keys = $this->getSelectedOptionKeys($value); + + if ( isset($params['selected_only']) && $params['selected_only'] ) { + $options = $this->getSelectedOptions($options, $selected_option_keys); + } + + $column_changed = false; + $option_number = $column_number = 1; $option_count = count($options); + $column_count = isset($params['columns']) ? $params['columns'] : 1; + $options_per_column = ceil($option_count / $column_count); - if (strpos($value, '|') !== false) { - // multiple checkboxes OR multiselect - $value = explode('|', substr($value, 1, -1) ); - foreach ($options as $key => $val) { - $block_params['key'] = $key; - $block_params['option'] = $val; - $block_params[$selected_param_name] = ( in_array($key, $value) ? ' '.$selected : ''); - $block_params['is_last'] = $index == $option_count - 1; + $block_params['option_count'] = $option_count; + + foreach ( $options as $option_key => $option_title ) { + $block_params['key'] = $option_key; + $block_params['option'] = $option_title; + $block_params[$selected_param_name] = $this->isOptionSelected($option_key, $selected_option_keys) ? ' ' . $selected_html : ''; + + $block_params['column_number'] = $column_number; + $block_params['column_changed'] = $column_changed; + $block_params['option_number'] = $option_number; + $block_params['is_last'] = $option_number == $option_count; + - $o .= $this->Application->ParseBlock($block_params); + $o .= $this->Application->ParseBlock($block_params); + $column_changed = false; + $option_number++; - $index++; + if ( $option_number > $column_number * $options_per_column ) { + $column_number++; + $column_changed = true; } } - else { + + return $o; + } + + /** + * Returns unified representation of selected options based on field value. + * + * @param mixed $field_value Field value. + * + * @return array + */ + protected function getSelectedOptionKeys($field_value) + { + if ( strpos($field_value, '|') !== false ) { + // multiple checkboxes OR multiselect + return explode('|', trim($field_value, '|')); + } + - // single selection radio OR checkboxes OR dropdown + // single selection radio OR checkboxes OR dropdown - foreach ($options as $key => $val) { - $block_params['key'] = $key; - $block_params['option'] = $val; - $block_params[$selected_param_name] = (strlen($key) == strlen($value) && ($key == $value) ? ' '.$selected : ''); - $block_params['is_last'] = $index == $option_count - 1; - $o .= $this->Application->ParseBlock($block_params); + return array("$field_value"); + } - $index++; + /** + * Returns only options, that have been selected. + * + * @param array $options All options. + * @param array $selected_option_keys Selected options. + * + * @return array + */ + protected function getSelectedOptions(array $options, array $selected_option_keys) + { + $ret = array(); + + foreach ( $options as $option_key => $option_title ) { + if ( $this->isOptionSelected($option_key, $selected_option_keys) ) { + $ret[$option_key] = $option_title; } } - return $o; + + return $ret; + } + + /** + * Determines if given option is among selected ones. + * + * @param mixed $option_key Option key. + * @param array $selected_option_keys Selected options. + * + * @return boolean + */ + protected function isOptionSelected($option_key, array $selected_option_keys) + { + return in_array("$option_key", $selected_option_keys, true); } function PredefinedSearchOptions($params) @@ -3156,4 +3216,4 @@ return ''; } -} \ No newline at end of file +}