Index: trunk/core/kernel/db/db_event_handler.php =================================================================== diff -u -N -r6647 -r6751 --- trunk/core/kernel/db/db_event_handler.php (.../db_event_handler.php) (revision 6647) +++ trunk/core/kernel/db/db_event_handler.php (.../db_event_handler.php) (revision 6751) @@ -653,8 +653,27 @@ } } - /** + * Adds filters found in session to object + * + * @param kEvent $event + * @param string $session_var variable name in session, where filter is stored + * @param string $filter_class filter class, e.g. FLT_SYSTEM, FLT_NORMAL, etc. + */ + function addStoredFilter(&$event, $session_var, $filter_class) + { + $filter_data = $this->Application->RecallVar($event->getPrefixSpecial().'_'.$session_var); + if ($filter_data) { + $object =& $event->getObject(); + $filter_data = unserialize($filter_data); + foreach ($filter_data as $filter_field => $filter_params) { + $filter_type = ($filter_params['type'] == 'having') ? HAVING_FILTER : WHERE_FILTER; + $object->addFilter($filter_field, $filter_params['value'], $filter_type, $filter_sub_type); + } + } + } + + /** * Add filters found in session * * @param kEvent $event @@ -663,16 +682,31 @@ { $object =& $event->getObject(); - $search_filter = $this->Application->RecallVar($event->getPrefixSpecial().'_search_filter'); - if($search_filter) - { - $search_filter = unserialize($search_filter); - foreach($search_filter as $search_field => $filter_params) - { + // add search filter + $filter_data = $this->Application->RecallVar($event->getPrefixSpecial().'_search_filter'); + if ($filter_data) { + $filter_data = unserialize($filter_data); + foreach ($filter_data as $filter_field => $filter_params) { $filter_type = ($filter_params['type'] == 'having') ? HAVING_FILTER : WHERE_FILTER; - $object->addFilter($search_field, $filter_params['value'], $filter_type, FLT_SEARCH); + $object->addFilter($filter_field, $filter_params['value'], $filter_type, FLT_SEARCH); } } + + // add custom filter + $custom_filters = $this->Application->RecallVar($event->getPrefixSpecial().'_custom_filter'); + if ($custom_filters) { + $grid_name = $event->getEventParam('grid'); + $custom_filters = unserialize($custom_filters); + if (isset($custom_filters[$grid_name])) { + foreach ($custom_filters[$grid_name] as $field_name => $field_options) { + list ($filter_type, $field_options) = each($field_options); + if ($field_options['value']) { + $filter_type = ($field_options['sql_filter_type'] == 'having') ? HAVING_FILTER : WHERE_FILTER; + $object->addFilter($field_name, $field_options['value'], $filter_type, FLT_CUSTOM); + } + } + } + } $view_filter = $this->Application->RecallVar($event->getPrefixSpecial().'_view_filter'); if($view_filter) @@ -1465,41 +1499,6 @@ } /** - * 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($search_field), 'date_time_separator' ); - if(!$dt_separator) $dt_separator = ' '; - - $time = ($type == 'datefrom') ? adodb_mktime(0,0,0) : adodb_mktime(23,59,59); - $time = adodb_date( $lang_current->GetDBField('InputTimeFormat'), $time); - $full_value = $value.$dt_separator.$time; - - $formatter =& $this->Application->recallObject($formatter_class); - - $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 -1; - } - return $value_ts; - } - - - /** * Ensures that popup will be closed automatically * and parent window will be refreshed with template * passed @@ -1532,6 +1531,7 @@ $this->Application->StoreVar('opener_stack', serialize($opener_stack)); } + /** * Create search filters based on search query * @@ -1541,192 +1541,9 @@ function OnSearch(&$event) { $event->setPseudoClass('_List'); - $object =& $event->getObject(); - - $search_keyword = $this->Application->GetVar( $event->getPrefixSpecial(true).'_search_keyword'); - $this->Application->StoreVar( $event->getPrefixSpecial().'_search_keyword', $search_keyword); - $search_keyword = str_replace('*', '%', $search_keyword); - - $custom_filters = $this->Application->RecallVar( $event->getPrefixSpecial().'_custom_filters'); - $custom_filters = $custom_filters ? unserialize($custom_filters) : Array(); - - $submit_custom_filters = $this->Application->GetVar('custom_filters'); - - if ($submit_custom_filters) { - $submit_custom_filters = getArrayValue($submit_custom_filters, $event->getPrefixSpecial() ); - - if ($submit_custom_filters) { - foreach ($submit_custom_filters as $cf_name => $cf_value) { - if ($cf_value) { - $custom_filters[$cf_name] = $cf_value; - } - else { - unset($custom_filters[$cf_name]); - } - } - } - } - $this->Application->StoreVar($event->getPrefixSpecial().'_custom_filters', serialize($custom_filters) ); - - if( !$search_keyword && !count($custom_filters) ) - { - $this->OnSearchReset($event); - return true; - } - - $grid_name = $this->Application->GetVar('grid_name'); - $grids = $this->Application->getUnitOption($event->Prefix,'Grids'); - $search_fields = array_keys($grids[$grid_name]['Fields']); - - $search_filter = Array(); + $search_helper =& $this->Application->recallObject('SearchHelper'); - $search_keywords = $search_helper->splitKeyword($search_keyword); - - foreach($search_fields as $search_field) - { - $filter_type = isset($object->VirtualFields[$search_field]) ? 'having' : 'where'; - $field_type = getArrayValue($object->Fields[$search_field],'type'); - if(!$field_type) $field_type = 'string'; // default LIKE filter for all fields without type - - $filter_value = ''; - - if (preg_match('/(.*)\.(.*)/', $search_field, $regs)) { - $table_name = '`'.$regs[1].'`.'; - $search_field = $regs[2]; - } - elseif ($filter_type == 'where') { - $table_name = '`'.$object->TableName.'`.'; - } - - $table_name = ($filter_type == 'where') ? $table_name : ''; - - // get field clause by formatter name and/or parameters - $formatter = getArrayValue($object->Fields[$search_field],'formatter'); - switch($formatter) - { - case 'kOptionsFormatter': - $search_keys = Array(); - - $field_value = getArrayValue($custom_filters, $search_field); - if ($field_value !== false) { - // if keyword passed through advanced search filter (e.g. on Visits lists section) - array_push($search_keys, $this->Conn->qstr($field_value)); - } - else { - // if keywords passed through simple search filter (on each grid) - $use_phrases = getArrayValue($object->Fields[$search_field], 'use_phrases'); - $field_options = $object->GetFieldOptions($search_field); - foreach ($field_options['options'] as $key => $val) { - foreach ($search_keywords as $keyword => $sign) { - $pattern = '#'.$keyword.'#i'; - if (!preg_match($pattern, $use_phrases ? $this->Application->Phrase($val) : $val)) { - if ($sign == '+') { - $filter_value = $table_name.'`'.$search_field.'` = NULL'; - break; - } - else { - continue; - } - } - - if ($sign == '+' || $sign == '') { - $search_keys[$key] = $this->Conn->qstr($key); - } - elseif($sign == '-') { - // if same value if found as exclusive too, then remove from search result - unset($search_keys[$key]); - } - } - } - } - - if ($search_keys) { - $filter_value = $table_name.'`'.$search_field.'` IN ('.implode(',', $search_keys).')'; - } - - $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'); - if($field_value) - { - $value = $this->processRangeField($event, $search_field, 'datefrom', $field_value, $formatter); - $filter_value[] = $table_name.'`'.$search_field.'` >= '.$value; - } - - $field_value = getArrayValue($custom_filters, $search_field.'_dateto'); - if($field_value) - { - $value = $this->processRangeField($event, $search_field, 'dateto', $field_value, $formatter); - $filter_value[] = $table_name.'`'.$search_field.'` <= '.$value; - } - - $filter_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 && $search_keywords) { - switch($field_type) - { - case 'int': - case 'integer': - case 'numeric': - $search_keys = Array(); - foreach ($search_keywords as $keyword => $sign) { - if (!is_numeric($keyword) || ($sign == '-')) continue; - $search_keys[] = $this->Conn->qstr($keyword); - } - - if ($search_keys) { - $filter_value = $table_name.'`'.$search_field.'` IN ('.implode(',', $search_keys).')'; - } - break; - - case 'double': - case 'float': - case 'real': - $search_keys = Array(); - foreach ($search_keywords as $keyword => $sign) { - $keyword = str_replace(',', '.', $keyword); - if (!is_numeric($keyword) || ($sign == '-')) continue; - $search_keys[] = 'ABS('.$table_name.'`'.$search_field.'` - '.$this->Conn->qstr($keyword).') <= 0.0001'; - } - - if ($search_keys) { - $filter_value = '('.implode(') OR (', $search_keys).')'; - } - break; - - case 'string': - $filter_value = $search_helper->buildWhereClause($search_keyword, Array($table_name.'`'.$search_field.'`')); - break; - } - } - - if ($filter_value) { - $search_filter[$search_field] = Array('type' => $filter_type, 'value' => $filter_value); - } - } - - $this->Application->StoreVar($event->getPrefixSpecial().'_search_filter', serialize($search_filter) ); + $search_helper->performSearch($event); } /** @@ -1740,7 +1557,7 @@ $this->Application->RemoveVar($event->getPrefixSpecial().'_search_filter'); $this->Application->RemoveVar($event->getPrefixSpecial().'_search_keyword'); - $this->Application->RemoveVar($event->getPrefixSpecial().'_custom_filters'); + $this->Application->RemoveVar($event->getPrefixSpecial().'_custom_filter'); } /**