Index: trunk/core/kernel/db/db_event_handler.php =================================================================== diff -u -r2602 -r2615 --- trunk/core/kernel/db/db_event_handler.php (.../db_event_handler.php) (revision 2602) +++ trunk/core/kernel/db/db_event_handler.php (.../db_event_handler.php) (revision 2615) @@ -1220,6 +1220,39 @@ } /** + * Enter description here... + * + * @param kEvent $event + * @param string $search_field + * @param string $type + * @param string $value + * @param string $formatter_class + */ + function processRangeField(&$event, $search_field, $type, $value, $formatter_class) + { + $field = $search_field.'_'.$type; + $lang_current =& $this->Application->recallObject('lang.current'); + + $object =& $event->getObject(); + $dt_separator = getArrayValue( $object->GetFieldOptions($field_name), 'date_time_separator' ); + if(!$dt_separator) $dt_separator = ' '; + + $time = ($type == 'datefrom') ? mktime(0,0,0) : mktime(23,59,59); + $time = date( $lang_current->GetDBField('TimeFormat'), $time); + $full_value = $value.$dt_separator.$time; + + $formatter =& $this->Application->recallObject($formatter_class); + + $this->Application->StoreVar( $event->getPrefixSpecial().'_'.$field, $value); + $value_ts = $formatter->Parse($full_value, $search_field, $object); + $pseudo = getArrayValue($object->FieldErrors, $search_field, 'pseudo'); + if($pseudo) $this->Application->StoreVar($event->getPrefixSpecial().'_'.$field.'_error', $pseudo); + + return $value_ts; + } + + + /** * Ensures that popup will be closed automatically * and parent window will be refreshed with template * passed @@ -1255,8 +1288,26 @@ $keyword = $this->Application->GetVar( $event->getPrefixSpecial(true).'_search_keyword'); $this->Application->StoreVar( $event->getPrefixSpecial().'_search_keyword', $keyword); - if(!$keyword) + $custom_filters = $this->Application->GetVar('custom_filters'); + if($custom_filters) { + $custom_filters = getArrayValue($custom_filters, $event->getPrefixSpecial() ); + $has_custom_filters = false; + if($custom_filters) + { + foreach($custom_filters as $cf_name => $cf_value) + { + if($cf_value) + { + $has_custom_filters = true; + break; + } + } + } + } + + if(!$keyword && !$has_custom_filters) + { $this->OnSearchReset($event); return true; } @@ -1280,7 +1331,7 @@ // get field clause by formatter name and/or parameters $formatter = getArrayValue($object->Fields[$search_field],'formatter'); - switch ($formatter) + switch($formatter) { case 'kOptionsFormatter': $search_keys = Array(); @@ -1298,15 +1349,44 @@ $field_processed = true; break; - + + case 'kDateFormatter': + $custom_filter = getArrayValue($object->Fields[$search_field], 'custom_filter'); + if(!$custom_filter) + { + $field_processed = false; + break; + } + + $filter_value = Array(); + + $field_value = getArrayValue($custom_filters, $search_field.'_datefrom'); + $value = $this->processRangeField($event, $search_field, 'datefrom', $field_value, $formatter); + if($field_value) + { + $filter_value[] = $table_name.'`'.$search_field.'` >= '.$value; + } + + $field_value = getArrayValue($custom_filters, $search_field.'_dateto'); + $value = $this->processRangeField($event, $search_field, 'dateto', $field_value, $formatter); + if($field_value) + { + $filter_value[] = $table_name.'`'.$search_field.'` <= '.$value; + } + + $filter_value = '('.implode(') AND (', $filter_value).')'; + + $field_processed = true; + break; + default: $field_processed = false; break; } // if not already processed by formatter, then get clause by field type - if(!$field_processed) + if(!$field_processed && $keyword) { switch($field_type) { @@ -1359,6 +1439,24 @@ { $this->Application->RemoveVar($event->getPrefixSpecial().'_search_filter'); $this->Application->RemoveVar($event->getPrefixSpecial().'_search_keyword'); + + // remove all custom filters + $grid_name = $this->Application->GetVar('grid_name'); + $grids = $this->Application->getUnitOption($event->Prefix,'Grids'); + $search_fields = array_keys($grids[$grid_name]['Fields']); + + $object =& $event->getObject( Array('skip_autoload' => true) ); + + foreach($search_fields as $search_field) + { + $options = $object->GetFieldOptions($search_field); + $custom_filter = getArrayValue($options, 'custom_filter'); + if($custom_filter == 'date_range') + { + $this->Application->RemoveVar( $event->getPrefixSpecial().'_'.$search_field.'_datefrom'); + $this->Application->RemoveVar( $event->getPrefixSpecial().'_'.$search_field.'_dateto'); + } + } } /**