Index: item_filter_tp.php =================================================================== --- item_filter_tp.php (revision 15052) +++ item_filter_tp.php (working copy) @@ -76,23 +76,21 @@ $cache[$cache_key]['counts'] = $this->Conn->GetCol($count_sql, 'GroupField'); } elseif ( $filter_type == 'range' ) { - // TODO: auto-scalable range alghoritm (used here) has several problems: - // 1. range values has meaningless values, e.g. 32, 56 and not 100, 200 as in original design - // 2. count of items from last range is displayed below filter scale - // 3. filter scale has fixed image background that allows only 10 positions + $max_sql = str_replace('COUNT(*) AS count', 'MAX(' . $field_sql . ')', $sql); + $max_value = $this->Conn->GetOne($max_sql); - $range_sql = str_replace('COUNT(*) AS count', 'MIN(' . $field_sql . ') AS `MinValue`, MAX(' . $field_sql . ') AS `MaxValue`', $sql); - $range_values = $this->Conn->GetRow($range_sql); - - if ( !$range_values['MinValue'] && !$range_values['MaxValue'] ) { + if ( !$max_value ) { return ''; } - $range_start = $range_values['MinValue']; + $range_start = 0; $range_count = $object->GetDBField('RangeCount'); - $range_size = ceil( ($range_values['MaxValue'] - $range_values['MinValue']) / $range_count ); - $range_values['MaxValue'] = $range_start + $range_size * $range_count; // to compensate diff, created by "ceil" function usage + $max_value = $this->getClosestValue($max_value / $range_count) * $range_count; + $range_size = $max_value / $range_count; +// $range_size = ceil( $max_value / $range_count ); +// $max_value = $range_size * $range_count; // to compensate diff, created by "ceil" function usage + $formatter_class = $item_list->GetFieldOption($filter_field, 'formatter'); $options = Array (); @@ -126,7 +124,7 @@ } - $cache[$cache_key]['range_values'] = $range_values; + $cache[$cache_key]['max_value'] = $max_value; $cache[$cache_key]['options'] = $options; $count_clause = sprintf($count_clause, $this->Conn->qstr($option_key)); @@ -173,15 +171,17 @@ // set global vars to be used by jQuery UI slider if ( $filter_type == 'range' ) { - $range_count = $object->GetDBField('RangeCount'); - $range_values = $cache[$cache_key]['range_values']; + $max_value = $cache[$cache_key]['max_value']; - $this->Application->SetVar('min_range_value', $range_values['MinValue']); - $this->Application->SetVar('max_range_value', $range_values['MaxValue']); + $this->Application->SetVar('min_range_value', 0); + $this->Application->SetVar('max_range_value', $max_value); - $range_size = ceil( ($range_values['MaxValue'] - $range_values['MinValue']) / $range_count ); - $this->Application->SetVar('range_step', 1); // $range_size); + /*$range_count = $object->GetDBField('RangeCount'); + $range_size = ceil( $max_value / $range_count ); + $this->Application->SetVar('range_step', $range_size);*/ + $this->Application->SetVar('range_step', 1); + if ( $selected_value ) { list ($from_selected_value, $to_selected_value) = explode('-', $selected_value); @@ -189,8 +189,8 @@ $this->Application->SetVar('selected_to_range', $to_selected_value); } else { - $this->Application->SetVar('selected_from_range', $range_values['MinValue']); - $this->Application->SetVar('selected_to_range', $range_values['MaxValue']); + $this->Application->SetVar('selected_from_range', 0); + $this->Application->SetVar('selected_to_range', $max_value); } } @@ -202,6 +202,26 @@ } /** + * Returns next closest value to given one + * + * @param float $value + * @return int + * @access protected + */ + protected function getClosestValue($value) + { + $scale = Array (0, 1, 2, 5, 10, 20, 25, 30, 40, 50, 100, 150, 200, 250, 300, 400, 500, 1000, 1500, 2000, 2500, 3000, 5000, 10000); + + foreach ($scale as $scale_value) { + if ( $scale_value >= $value ) { + return $scale_value; + } + } + + return end($scale); + } + + /** * Filter input name * * @param Array $params