Index: trunk/core/kernel/db/db_tag_processor.php =================================================================== diff -u -N -r2581 -r2615 --- trunk/core/kernel/db/db_tag_processor.php (.../db_tag_processor.php) (revision 2581) +++ trunk/core/kernel/db/db_tag_processor.php (.../db_tag_processor.php) (revision 2615) @@ -1258,6 +1258,83 @@ if (!$list->Counted) $list->CountRecs(); return $list->RecordsCount; } + + /** + * Range filter field name + * + * @param Array $params + * @return string + */ + function RangeName($params) + { + $field = $this->SelectParam($params, 'field,name'); + return 'custom_filters['.$this->getPrefixSpecial().']['.$field.'_'.$params['type'].']'; + } + + /** + * Return range filter field value + * + * @param Array $params + * @return string + */ + function RangeValue($params) + { + $field = $this->SelectParam($params, 'field,name'); + + $var_name = $this->getPrefixSpecial(true).'_'.$field.'_'.$params['type']; + $ses_var_name = $this->getPrefixSpecial().'_'.$field.'_'.$params['type']; + + $value = $this->Application->GetVar($var_name); + + return $this->Application->GetLinkedVar($var_name, $ses_var_name, $value); + } + + function RangeFormat($params) + { + $field = $params['field']; + $object =& $this->Application->recallObject($this->getPrefixSpecial(),$this->Prefix.'_List', $params); + + $options = $object->GetFieldOptions($field); + + $formatter_class = getArrayValue($options,'formatter'); + if($formatter_class) + { + $formatter =& $this->Application->recallObject($formatter_class); + $human_format = getArrayValue($params,'human'); + $edit_size = getArrayValue($params,'edit_size'); + $sample = getArrayValue($params,'sample'); + if($sample) + { + return $formatter->GetSample($field, $options, $object); + } + elseif($human_format || $edit_size) + { + $format = $formatter->HumanFormat($options['format']); + return $edit_size ? strlen($format) : $format; + } + } + + return $options['format']; + } + + /** + * Returns error of range field + * + * @param unknown_type $params + * @return unknown + */ + function RangeError($params) + { + $field = $this->SelectParam($params, 'field,name'); + + $error_var_name = $this->getPrefixSpecial().'_'.$field.'_'.$params['type'].'_error'; + $error_msg = $this->Application->RecallVar($error_var_name); + if($error_msg) + { + $this->Application->StoreVar($error_var_name, ''); + } + return $error_msg; + } } ?> \ No newline at end of file Index: trunk/kernel/admin_templates/incs/script.js =================================================================== diff -u -N -r2308 -r2615 --- trunk/kernel/admin_templates/incs/script.js (.../script.js) (revision 2308) +++ trunk/kernel/admin_templates/incs/script.js (.../script.js) (revision 2615) @@ -339,8 +339,9 @@ submit_event($prefix_special,'OnSearch'); } -function search_reset($prefix_special) +function search_reset($prefix_special, $grid_name) { + set_hidden_field('grid_name', $grid_name); submit_event($prefix_special,'OnSearchReset'); } Index: trunk/core/units/visits/visits_config.php =================================================================== diff -u -N -r2608 -r2615 --- trunk/core/units/visits/visits_config.php (.../visits_config.php) (revision 2608) +++ trunk/core/units/visits/visits_config.php (.../visits_config.php) (revision 2615) @@ -69,7 +69,7 @@ 'Fields' => Array( 'VisitId' => Array(), - 'VisitDate' => Array('type' => 'int', 'formatter'=>'kDateFormatter', 'filter_type'=>'range', 'not_null' => '1','default' => '0'), + 'VisitDate' => Array('type' => 'int', 'formatter'=>'kDateFormatter', 'custom_filter' => 'date_range', 'not_null' => '1','default' => '0'), 'Referer' => Array('type' => 'string','not_null' => '1','default' => ''), 'IPAddress' => Array('type' => 'string','not_null' => '1','default' => ''), 'AffiliateId' => Array('type'=>'int','formatter'=>'kLEFTFormatter','options'=>Array(0=>'lu_none'),'left_sql'=>'SELECT %s FROM '.TABLE_PREFIX.'Affiliates af LEFT JOIN '.TABLE_PREFIX.'PortalUser pu ON pu.PortalUserId = af.PortalUserId WHERE `%s` = \'%s\'','left_key_field'=>'AffiliateId','left_title_field'=>'Login','not_null'=>1,'default'=>0), Index: trunk/core/kernel/db/db_event_handler.php =================================================================== diff -u -N -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'); + } + } } /** Index: trunk/kernel/units/visits/visits_config.php =================================================================== diff -u -N -r2608 -r2615 --- trunk/kernel/units/visits/visits_config.php (.../visits_config.php) (revision 2608) +++ trunk/kernel/units/visits/visits_config.php (.../visits_config.php) (revision 2615) @@ -69,7 +69,7 @@ 'Fields' => Array( 'VisitId' => Array(), - 'VisitDate' => Array('type' => 'int', 'formatter'=>'kDateFormatter', 'filter_type'=>'range', 'not_null' => '1','default' => '0'), + 'VisitDate' => Array('type' => 'int', 'formatter'=>'kDateFormatter', 'custom_filter' => 'date_range', 'not_null' => '1','default' => '0'), 'Referer' => Array('type' => 'string','not_null' => '1','default' => ''), 'IPAddress' => Array('type' => 'string','not_null' => '1','default' => ''), 'AffiliateId' => Array('type'=>'int','formatter'=>'kLEFTFormatter','options'=>Array(0=>'lu_none'),'left_sql'=>'SELECT %s FROM '.TABLE_PREFIX.'Affiliates af LEFT JOIN '.TABLE_PREFIX.'PortalUser pu ON pu.PortalUserId = af.PortalUserId WHERE `%s` = \'%s\'','left_key_field'=>'AffiliateId','left_title_field'=>'Login','not_null'=>1,'default'=>0), Index: trunk/kernel/admin_templates/incs/grid_blocks.tpl =================================================================== diff -u -N -r2602 -r2615 --- trunk/kernel/admin_templates/incs/grid_blocks.tpl (.../grid_blocks.tpl) (revision 2602) +++ trunk/kernel/admin_templates/incs/grid_blocks.tpl (.../grid_blocks.tpl) (revision 2615) @@ -50,7 +50,7 @@ document.getElementById('_search_keyword').onkeydown = search_keydown; Toolbars['_search'] = new ToolBar('icon16_'); Toolbars['_search'].AddButton( new ToolBarButton('search', '', function() { search('','') } ) ); - Toolbars['_search'].AddButton( new ToolBarButton('search_reset', '', function() { search_reset('') } ) ); + Toolbars['_search'].AddButton( new ToolBarButton('search_reset', '', function() { search_reset('','') } ) ); Toolbars['_search'].Render();