Index: trunk/core/kernel/db/db_tag_processor.php
===================================================================
diff -u -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 -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 -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 -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 -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 -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();