clsItemCollection();
$this->SourceTable = $SearchSource;
$this->SetResultTable($SearchSource,$DataClass);
$this->FieldList = array();
$this->Relationships = array();
$this->Ignored_Words = array();
$this->WhereClauses = array();
$this->FieldWeight = array();
$this->Keywords = GetKeywords("");
$this->SearchType = 0; //simple
$this->RequiredRelevance=0;
$this->PctRelevance = $objConfig->Get("SearchRel_DefaultKeyword")/100;
$this->PctPop = $objConfig->Get("SearchRel_DefaultPop")/100;
$this->PctRating = $objConfig->Get("SearchRel_DefaultRating")/100;
if(!is_object($objSearchConfig))
$objSearchConfig = new clsSearchConfigList();
$objSearchConfig->Clear();
if ($ItemType == 0) {
$objSearchConfig->Query_Item("SELECT * FROM ".$objSearchConfig->SourceTable." WHERE TableName='$SearchSource' AND AdvancedSearch=1 ORDER BY DisplayOrder");
}
else {
$tables = Array(1 => 'Category', 2 => 'News',
3 => 'Topic', 4 => 'Link',
11 => 'Products');
$table = $tables[$ItemType];
$sql = "SELECT sc.* FROM ".$objSearchConfig->SourceTable." AS sc LEFT JOIN ".GetTablePrefix()."CustomField AS cf ON sc.CustomFieldId = cf.CustomFieldId WHERE TableName='$table' OR ((TableName='".GetTablePrefix()."CustomField' OR TableName='CustomField') AND cf.Type = $ItemType) AND AdvancedSearch=1 ORDER BY sc.DisplayOrder";
$objSearchConfig->Query_Item($sql);
}
}
function SetResultTable($SearchSource,$DataClass)
{
global $objSession;
//$this->ResultTable = $objSession->GetSessionKey()."_Search";
$this->ResultTable = $objSession->GetSessionTable('Search', '');
$this->classname= $DataClass;
}
function LoadSearchResults($Start=0,$PerPage=NULL)
{
if($PerPage)
{
$limit = "LIMIT $Start,$PerPage";
}
$sql = "SELECT * FROM ".$this->ResultTable." ".$limit;
$this->Clear();
$rs = $this->adodbConnection->Execute($sql);
return $this->Query_Item($sql);
}
function SetCategoryClause($whereclause)
{
$this->CatClause=$whereclause;
}
function AddRelationship($JoinTable,$JoinExpression=NULL)
{
$this->Relationships[$JoinTable]=$JoinExpression;
}
function SetKeywords($keywords)
{
$this->Phrase=$keywords;
$this->keywords = GetKeywords($keywords);
}
function AddAdvancedField($TableName,$FieldName,$Verb,$Value,$conj, $main_prefix)
{
global $objSearchConfig, $objConfig;
static $x = 0, $customs_joined = Array();
// echo 'Adding ADVANCED SearchField: ['.$TableName.']; ['.$FieldName.']; ['.$Verb.']; ['.$Value.']; ['.$conj.']
';
$ml_formatter =& $this->Application->recallObject('kMultiLanguage');
if(!is_object($objSearchConfig))
$objSearchConfig = new clsSeachConfigList();
if ($TableName == GetTablePrefix().'CustomField') {
// stupid custom fields already have prefix in SearchConfig table (not for in-commerce module :D)
$prefix = '';
}
else {
$prefix = GetTablePrefix();
}
$f = $prefix.$TableName.".".$FieldName;
$FieldConfig = $objSearchConfig->GetItemByName($TableName,$FieldName);
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 {
$classes = Array(
'Link' => '_clsLinkList',
'News' => '_clsNewsList',
'Topic' => '_clsTopicList',
'Category' => 'clsCatList');
$list_class = getArrayValue($classes, $TableName);
if ($list_class) {
$objList = new $list_class();
}
$prefix_fields = $this->Application->getUnitOption($main_prefix, 'Fields');
if (isset($prefix_fields[$FieldName]) && $prefix_fields[$FieldName]['formatter'] == 'kMultiLanguage') {
$FieldConfig->Set('FieldName', $ml_formatter->LangFieldName($FieldName));
}
if ($FieldConfig->Get('CustomFieldId')) {
$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;
// create search record
$this->SearchLogRecord[] = language('la_Field').' "'.$FieldConfig->getHumanField().'" '.$FieldConfig->getHumanVerb($Verb).' '.language('la_Value').' "'.$FieldConfig->getHumanValue($Value).'" '.language('lu_'.$conj);
unset($FieldItem);
}
function getKeywords(&$FieldConfig)
{
$ret = implode('
', $this->SearchLogRecord);
return preg_replace('/(.*) '.preg_quote(language('lu_and'), '/').'|'.preg_quote(language('lu_or'), '/').'$/is', '\\1', $ret);
}
/* function AddAdvancedCustomFields()
{
$sql = "SELECT * FROM ".GetTablePrefix()."SearchConfig WHERE TableName='".$this->SourceTable."' AND AdvancedSearch=1 AND CustomFieldId>0";
//echo $sql;
foreach($this->Relationships as $Table=>$clause)
{
if(strlen($Table)>0 && $Table != "Category")
$sql .= " OR TableName='".$Table."'";
}
$ctable = GetTablePrefix()."CustomMetaData";
$rs = $this->adodbConnection->Execute($sql);
$CustomJoined = FALSE;
while($rs && !$rs->EOF)
{
$x = $rs->fields["CustomFieldId"];
$t = $ctable." as c".$x;
$join = "(c$x.ResourceId=".GetTablePrefix().$this->SourceTable.".ResourceId AND c$x.CustomFieldId=".$rs->fields["CustomFieldId"].")";
$this->AddRelationship($t,$join);
$f = "c".$x.".Value ";
$this->FieldList[] = $f;
$this->FieldWeight[$f] = $rs->fields["Priority"];
$rs->MoveNext();
}
}
function AddAdvancedFields()
{
$sql = "SELECT * FROM ".GetTablePrefix()."SearchConfig WHERE TableName='".$this->SourceTable."' AND AdvancedSearch=1 AND CustomFieldId=0";
//echo $sql;
foreach($this->Relationships as $Table=>$clause)
{
if(strlen($Table)>0 && $Table != "Category")
$sql .= " OR TableName='".$Table."'";
}
$rs = $this->adodbConnection->Execute($sql);
while($rs && !$rs->EOF)
{
$f = GetTablePrefix().$rs->fields["TableName"].".".$rs->fields["FieldName"];
$this->FieldList[] = $f;
$this->FieldWeight[$f] = $rs->fields["Priority"];
$rs->MoveNext();
}
$this->AddAdvancedCustomFields();
}*/
/* ready to write the code to build the query and go */
function BuildWhereClause()
{
$where = "";
foreach($this->FieldList as $f)
$where .= " (".$f["where"].") ".$f["conjuction"];
$cut_length = substr($where, -2) == 'OR' ? 2 : substr($where, -3) == 'AND' ? 3 : 0;
$where = substr($where, 0, strlen($where) - $cut_length);
return $where;
}
function PerformSearch($ItemType,$OrderBy=NULL,$InitTable=FALSE, $idlist=NULL)
{
static $SelectSQL, $OldItemType;
global $objSession, $objItemTypes;
// add recrod to log
$objSearchList = new clsSearchLogList();
$objSearchList->UpdateKeyword($this->getKeywords(), 1);
$ctype = $objItemTypes->GetItem($ItemType);
$idField = $ctype->Get("SourceTable")."Id";
$this->SourceTable = AddTablePrefix($ctype->Get("SourceTable"));
$result=0;
$PopField = $ctype->Get("PopField");
$RateField = $ctype->Get("RateField");
$typestr = str_pad($ItemType,2,"0",STR_PAD_LEFT);
$SelectSQL = "SELECT ".$this->SourceTable.".".$idField." as ItemId, ". $this->SourceTable.".Priority as Relevance, ".$this->SourceTable.".ResourceId, CONCAT($typestr) as ItemType, EditorsPick as EdPick FROM ".$this->SourceTable." ";
foreach($this->Relationships as $JoinTable=>$OnClause)
{
$SelectSQL .= "LEFT JOIN $JoinTable ON ($OnClause) ";
}
$first=1;
$WhereClause = $this->BuildWhereClause();
if(strlen($WhereClause)>0)
{
$SelectSQL .= " WHERE ".$WhereClause;
}
$SelectSQL .= " GROUP BY $idField ";
//echo $SelectSQL;
$this->adodbConnection->Execute("DROP TABLE IF EXISTS ".$this->ResultTable);
$full_sql = "CREATE TABLE ".$this->ResultTable." ".$indexSQL.$SelectSQL;
$this->adodbConnection->Execute($full_sql);
// if advanced seaech used, then delete simple search keywords
$objSession->SetVariable('Search_Keywords', '');
//print_pre($full_sql);
}
function BuildIndexes()
{
$sql = "ALTER TABLE ".$this->ResultTable." ADD INDEX (Relevance), ";
$sql .="ADD INDEX (ItemId), ";
$sql .="ADD INDEX (ItemType), ";
$sql .=" ADD INDEX sorting (EdPick,Relevance)";
$this->adodbConnection->Execute($sql);
}
function Result_IdList()
{
/* returns an array contain a resource ID list */
$sql = "SELECT DISTINCT(ResourceId) FROM ".$this->ResultTable;
$rs = $this->adodbConnection->Execute($sql);
$result = array();
while($rs && !$rs->EOF)
{
$result[] = $rs->fields["ResourceId"];
$rs->MoveNext();
}
return $result;
}
function SetRelevence($ItemType, $IdField)
{
}
}
?>