Index: trunk/kernel/include/advsearch.php =================================================================== diff -u -N -r3282 -r4084 --- trunk/kernel/include/advsearch.php (.../advsearch.php) (revision 3282) +++ trunk/kernel/include/advsearch.php (.../advsearch.php) (revision 4084) @@ -89,109 +89,136 @@ $this->keywords = GetKeywords($keywords); } - function AddAdvancedField($TableName,$FieldName,$Verb,$Value,$conj) + function AddAdvancedField($TableName,$FieldName,$Verb,$Value,$conj, $main_prefix) { global $objSearchConfig, $objConfig; - static $x = 0; + static $x = 0, $customs_joined = Array(); if(!is_object($objSearchConfig)) $objSearchConfig = new clsSeachConfigList(); - if ($TableName==GetTablePrefix().'CustomField') - { + if ($TableName == GetTablePrefix().'CustomField') { + // stupid custom fields already have prefix in SearchConfig table (not for in-commerce module :D) $prefix = ''; } - else - { + else { $prefix = GetTablePrefix(); } $f = $prefix.$TableName.".".$FieldName; $FieldConfig = $objSearchConfig->GetItemByName($TableName,$FieldName); - if(is_object($FieldConfig)) + if(!is_object($FieldConfig)) { + return false; + } + + if ($FieldConfig->Get('ForeignField')) { + $x++; + $parts = explode(".",$FieldConfig->Get("ForeignField")); + $Table = $parts[0]; + $pseudo = 'c'.$x; + $Table = AddTablePrefix($Table); + $Field = $parts[1]; + $join = $FieldConfig->Get("JoinClause"); + $join = str_replace($Table, $pseudo, $join); + $join = str_replace("{ForeignTable}", $pseudo, $join); + $join = str_replace("{LocalTable}", $TableName, $join); + $join = str_replace("{Table}", AddTablePrefix($this->SourceTable), $join); + $join = '('.$join.' AND '.$pseudo.'.CustomFieldId='.$FieldConfig->Get('CustomFieldId').')'; + $this->AddRelationship($Table.' AS '.$pseudo, $join); + + // for items that does not have appropriate records in CustomMetaData table + if ($Verb == 'notcontains' || $Verb == 'isnot') + { + $or_not_null = ' OR '.$pseudo.'.'.$Field.' IS NULL'; + } + else + { + $or_not_null = ''; + } + + $FieldItem["where"] = str_replace('CustomMetaData', $pseudo, $FieldConfig->GetWhereClause($Verb,$Value)).$or_not_null; + $FieldItem["Field"] = $FieldConfig->Get("ForeignField"); + $FieldItem["Table"] = $pseudo; + $FieldItem["conjuction"] = $conj; + $FieldItem["weight"] = $FieldConfig->Get("Priority"); + } + else { - if(strlen($FieldConfig->Get("ForeignField"))>0) - { - $x++; - $parts = explode(".",$FieldConfig->Get("ForeignField")); - $Table = $parts[0]; - $pseudo = 'c'.$x; - $Table = AddTablePrefix($Table); - $Field = $parts[1]; - $join = $FieldConfig->Get("JoinClause"); - $join = str_replace($Table, $pseudo, $join); - $join = str_replace("{ForeignTable}", $pseudo, $join); - $join = str_replace("{LocalTable}", $TableName, $join); - $join = str_replace("{Table}", AddTablePrefix($this->SourceTable), $join); - $join = '('.$join.' AND '.$pseudo.'.CustomFieldId='.$FieldConfig->Get('CustomFieldId').')'; - $this->AddRelationship($Table.' AS '.$pseudo, $join); - - // for items that does not have appropriate records in CustomMetaData table - if ($Verb == 'notcontains' || $Verb == 'isnot') - { - $or_not_null = ' OR '.$pseudo.'.'.$Field.' IS NULL'; - } - else - { - $or_not_null = ''; - } - - $FieldItem["where"] = str_replace('CustomMetaData', $pseudo, $FieldConfig->GetWhereClause($Verb,$Value)).$or_not_null; - $FieldItem["Field"] = $FieldConfig->Get("ForeignField"); - $FieldItem["Table"] = $pseudo; - $FieldItem["conjuction"] = $conj; - $FieldItem["weight"] = $FieldConfig->Get("Priority"); - } - else - { - $classes = Array( 'Link' => '_clsLinkList', - 'News' => '_clsNewsList', - 'Topic' => '_clsTopicList', - 'Category' => 'clsCatList'); - $list_class = $classes[$TableName]; - $objList =& new $list_class(); - switch ($FieldName) - { - case 'HotItem': - $cutoff = $objList->GetHotValue(); - $Value == 1 ? $not = '' : $not = 'NOT '; - $where_clause = $FieldConfig->GetWhereClause($Verb, $Value); - $where_clause .= ' OR ('.AddTablePrefix($TableName).'.HotItem=2 AND '. - $not.'('.AddTablePrefix($TableName). - '.Hits>='.$cutoff.'))'; - break; - case 'PopItem': - $cutoff = $objList->GetPopValue(); - $Value == 1 ? $not = '' : $not = 'NOT '; - $where_clause = $FieldConfig->GetWhereClause($Verb, $Value); - $where_clause .= ' OR ('.AddTablePrefix($TableName).'.PopItem=2 AND '. - $not.'('.AddTablePrefix($TableName). - '.CachedRating>='.$cutoff.'))'; - break; - case 'NewItem': - $NewTime = $objConfig->Get($TableName.'_NewDays')*3600*24; - $Value == 1 ? $not = '' : $not = 'NOT '; - $where_clause = $FieldConfig->GetWhereClause($Verb, $Value); - $where_clause .= ' OR ('.AddTablePrefix($TableName).'.NewItem=2 AND '. - $not.'('.adodb_mktime().'-'.AddTablePrefix($TableName). - '.CreatedOn<'.$NewTime.'))'; - break; - default: - $where_clause = $FieldConfig->GetWhereClause($Verb, $Value); - } - $FieldItem = array(); - $FieldItem['Table'] = AddTablePrefix($TableName); - $FieldItem['Field'] = $FieldName; - $FieldItem['where'] = $FieldItem['Table'].'.'.$where_clause; - $FieldItem['conjuction'] = $conj; - $FieldItem['weight'] = $FieldConfig->Get('Priority'); - } - $this->FieldList[] = $FieldItem; - - unset($FieldItem); - } + $classes = Array( 'Link' => '_clsLinkList', + 'News' => '_clsNewsList', + 'Topic' => '_clsTopicList', + 'Category' => 'clsCatList'); + $list_class = getArrayValue($classes, $TableName); + if ($list_class) { + $objList =& new $list_class(); + } + + if ($FieldConfig->Get('CustomFieldId')) { + $ml_formatter =& $this->Application->recallObject('kMultiLanguage'); + $FieldConfig->Set('FieldName', $ml_formatter->LangFieldName('cust_'.$FieldConfig->Get('CustomFieldId'))); + } + + switch ($FieldName) + { + case 'HotItem': + $cutoff = $objList->GetHotValue(); + $Value == 1 ? $not = '' : $not = 'NOT '; + $where_clause = $FieldConfig->GetWhereClause($Verb, $Value); + $where_clause .= ' OR ('.AddTablePrefix($TableName).'.HotItem=2 AND '. + $not.'('.AddTablePrefix($TableName). + '.Hits>='.$cutoff.'))'; + break; + case 'PopItem': + $cutoff = $objList->GetPopValue(); + $Value == 1 ? $not = '' : $not = 'NOT '; + $where_clause = $FieldConfig->GetWhereClause($Verb, $Value); + $where_clause .= ' OR ('.AddTablePrefix($TableName).'.PopItem=2 AND '. + $not.'('.AddTablePrefix($TableName). + '.CachedRating>='.$cutoff.'))'; + break; + case 'NewItem': + $NewTime = $objConfig->Get($TableName.'_NewDays')*3600*24; + $Value == 1 ? $not = '' : $not = 'NOT '; + $where_clause = $FieldConfig->GetWhereClause($Verb, $Value); + $where_clause .= ' OR ('.AddTablePrefix($TableName).'.NewItem=2 AND '. + $not.'('.adodb_mktime().'-'.AddTablePrefix($TableName). + '.CreatedOn<'.$NewTime.'))'; + break; + default: + $where_clause = $FieldConfig->GetWhereClause($Verb, $Value); + break; + } + + $FieldItem = Array(); + if ($FieldConfig->Get('CustomFieldId')) { + if (!getArrayValue($customs_joined, $main_prefix)) { + $item_table = $this->Application->getUnitOption($main_prefix, 'TableName'); + $custom_table = $this->Application->getUnitOption($main_prefix.'-cdata', 'TableName'); + $this->AddRelationship($custom_table.' AS '.$main_prefix.'_custom_data', $main_prefix.'_custom_data.ResourceId = '.$item_table.'.ResourceId'); + $customs_joined[$main_prefix] = true; + } + + $FieldItem['Table'] = $main_prefix.'_custom_data'; + $FieldItem['Field'] = $FieldConfig->Get('FieldName'); + } + else { + $FieldItem['Table'] = AddTablePrefix($TableName); + $FieldItem['Field'] = $FieldName; + } + + $FieldItem['where'] = $FieldItem['Table'].'.'.$where_clause; + $FieldItem['conjuction'] = $conj; + $FieldItem['weight'] = $FieldConfig->Get('Priority'); + + + } + $this->FieldList[] = $FieldItem; + + unset($FieldItem); + } + /* function AddAdvancedCustomFields() {