Page Menu
Home
In-Portal Phabricator
Search
Configure Global Search
Log In
Files
F804539
cat_event_handler.php
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Wed, Feb 26, 1:18 PM
Size
31 KB
Mime Type
text/x-php
Expires
Fri, Feb 28, 1:18 PM (21 h, 5 m)
Engine
blob
Format
Raw Data
Handle
577054
Attached To
rINP In-Portal
cat_event_handler.php
View Options
<?php
$application
=&
kApplication
::
Instance
();
$application
->
Factory
->
includeClassFile
(
'kDBEventHandler'
);
class
kCatDBEventHandler
extends
InpDBEventHandler
{
function
OnCopy
(&
$event
)
{
$object
=
$event
->
getObject
();
$this
->
StoreSelectedIDs
(
$event
);
$ids
=
$this
->
getSelectedIDs
(
$event
);
$this
->
Application
->
StoreVar
(
$event
->
getPrefixSpecial
().
'_clipboard'
,
implode
(
','
,
$ids
));
$this
->
Application
->
StoreVar
(
$event
->
getPrefixSpecial
().
'_clipboard_mode'
,
'copy'
);
$this
->
Application
->
StoreVar
(
'ClipBoard'
,
'COPY-0.'
.
$object
->
TableName
.
'.ResourceId=0'
);
$event
->
redirect_params
=
Array
(
'opener'
=>
's'
,
'pass_events'
=>
true
);
//do not go up - STAY
}
function
OnCut
(&
$event
)
{
$object
=
$event
->
getObject
();
$this
->
StoreSelectedIDs
(
$event
);
$ids
=
$this
->
getSelectedIDs
(
$event
);
$this
->
Application
->
StoreVar
(
$event
->
getPrefixSpecial
().
'_clipboard'
,
implode
(
','
,
$ids
));
$this
->
Application
->
StoreVar
(
$event
->
getPrefixSpecial
().
'_clipboard_mode'
,
'cut'
);
$this
->
Application
->
StoreVar
(
'ClipBoard'
,
'CUT-0.'
.
$object
->
TableName
.
'.ResourceId=0'
);
$event
->
redirect_params
=
Array
(
'opener'
=>
's'
,
'pass_events'
=>
true
);
//do not go up - STAY
}
function
OnPaste
(&
$event
)
{
$ids
=
$this
->
Application
->
RecallVar
(
$event
->
getPrefixSpecial
().
'_clipboard'
);
if
(
$ids
==
''
)
{
$event
->
redirect
=
false
;
return
;
}
//recalling by different name, because we may get kDBList, if we recall just by prefix
$object
=&
$this
->
Application
->
recallObject
(
$event
->
getPrefixSpecial
().
'.item'
,
$event
->
Prefix
);
$this
->
prepareObject
(
$object
,
$event
);
if
(
$this
->
Application
->
RecallVar
(
$event
->
getPrefixSpecial
().
'_clipboard_mode'
)
==
'copy'
)
{
$ids_arr
=
explode
(
','
,
$ids
);
$temp
=&
$this
->
Application
->
recallObject
(
$event
->
getPrefixSpecial
().
'_TempHandler'
,
'kTempTablesHandler'
);
if
(
$ids_arr
)
{
$temp
->
CloneItems
(
$event
->
Prefix
,
$event
->
Special
,
$ids_arr
);
}
}
else
{
// mode == cut
$ids_arr
=
explode
(
','
,
$ids
);
foreach
(
$ids_arr
as
$id
)
{
$object
->
Load
(
$id
);
$object
->
MoveToCat
();
}
}
$event
->
status
=
erSUCCESS
;
}
/**
* Occurs when pasting category
*
* @param kEvent $event
*/
function
OnCatPaste
(&
$event
)
{
$inp_clipboard
=
$this
->
Application
->
RecallVar
(
'ClipBoard'
);
$inp_clipboard
=
explode
(
'-'
,
$inp_clipboard
,
2
);
if
(
$inp_clipboard
[
0
]
==
'COPY'
)
{
$saved_cat_id
=
$this
->
Application
->
GetVar
(
'm_cat_id'
);
$cat_ids
=
$event
->
getEventParam
(
'cat_ids'
);
$id_field
=
$this
->
Application
->
getUnitOption
(
$event
->
Prefix
,
'IDField'
);
$table
=
$this
->
Application
->
getUnitOption
(
$event
->
Prefix
,
'TableName'
);
$ids_sql
=
'SELECT '
.
$id_field
.
' FROM '
.
$table
.
' WHERE ResourceId IN (%s)'
;
$resource_ids_sql
=
'SELECT ItemResourceId FROM '
.
TABLE_PREFIX
.
'CategoryItems WHERE CategoryId = %s AND PrimaryCat = 1'
;
$this
->
Application
->
setUnitOption
(
$event
->
Prefix
,
'AutoLoad'
,
false
);
$object
=&
$this
->
Application
->
recallObject
(
$event
->
Prefix
.
'.item'
,
$event
->
Prefix
);
foreach
(
$cat_ids
as
$source_cat
=>
$dest_cat
)
{
$item_resource_ids
=
$this
->
Conn
->
GetCol
(
sprintf
(
$resource_ids_sql
,
$source_cat
)
);
if
(!
$item_resource_ids
)
continue
;
$this
->
Application
->
SetVar
(
'm_cat_id'
,
$dest_cat
);
$item_ids
=
$this
->
Conn
->
GetCol
(
sprintf
(
$ids_sql
,
implode
(
','
,
$item_resource_ids
)
)
);
$temp
=&
$this
->
Application
->
recallObject
(
$event
->
getPrefixSpecial
().
'_TempHandler'
,
'kTempTablesHandler'
);
if
(
$item_ids
)
$temp
->
CloneItems
(
$event
->
Prefix
,
$event
->
Special
,
$item_ids
);
}
$this
->
Application
->
setUnitOption
(
$event
->
Prefix
,
'AutoLoad'
,
true
);
$this
->
Application
->
SetVar
(
'm_cat_id'
,
$saved_cat_id
);
}
}
/**
* Enter description here...
*
* @param kEvent $event
*/
function
OnPreSaveAndOpenTranslator
(&
$event
)
{
$this
->
Application
->
SetVar
(
'allow_translation'
,
true
);
$object
=&
$event
->
getObject
();
$this
->
RemoveRequiredFields
(
$object
);
$event
->
CallSubEvent
(
'OnPreSave'
);
if
(
$event
->
status
==
erSUCCESS
)
{
// $url = $this->Application->HREF($t, '', Array('pass'=>'all', $event->getPrefixSpecial(true).'_id' => $object->GetId()));
// $field = $this->Application->GetVar('translator_field');
$cf_id
=
$this
->
Application
->
GetVar
(
'translator_cf_id'
);
if
(
$cf_id
)
{
$cv
=&
$this
->
Application
->
recallObject
(
'cv.-item'
,
null
,
Array
(
'skip_autoload'
=>
true
)
);
$load_params
=
Array
(
'CustomFieldId'
=>
$cf_id
,
'ResourceId'
=>
$object
->
GetDBField
(
'ResourceId'
)
);
if
(
!
$cv
->
Load
(
$load_params
)
)
{
$cv
->
SetFieldsFromHash
(
$load_params
);
$cv
->
Create
();
}
$this
->
Application
->
SetVar
(
'cv_id'
,
$cv
->
getID
()
);
}
$event
->
redirect
=
$this
->
Application
->
GetVar
(
'translator_t'
);
$event
->
redirect_params
=
Array
(
'pass'
=>
'all,trans,'
.
$this
->
Application
->
GetVar
(
'translator_prefixes'
),
$event
->
getPrefixSpecial
(
true
).
'_id'
=>
$object
->
GetId
(),
'trans_event'
=>
'OnLoad'
,
'trans_prefix'
=>
$this
->
Application
->
GetVar
(
'translator_prefixes'
),
'trans_field'
=>
$this
->
Application
->
GetVar
(
'translator_field'
),
);
// 1. SAVE LAST TEMPLATE TO SESSION
$last_template
=
$this
->
Application
->
RecallVar
(
'last_template'
);
preg_match
(
'/index4
\.
php
\|
'
.
$this
->
Application
->
GetSID
().
'-(.*):/U'
,
$last_template
,
$rets
);
$this
->
Application
->
StoreVar
(
'return_template'
,
$rets
[
1
]);
//$after_script = "openTranslator('".$event->getPrefixSpecial()."', '".$field."', '".$url."', '".$wnd_name."')";
}
// $this->Application->SetVar('after_script', $after_script);
// $event->redirect = false;
}
/**
* Apply scope clause
*
* @param kEvent $event
*/
function
SetCustomQuery
(&
$event
)
{
$object
=&
$event
->
getObject
();
if
(
$event
->
Special
!=
'showall'
)
{
if
(
$event
->
getEventParam
(
'parent_cat_id'
)
)
{
$parent_cat_id
=
$event
->
getEventParam
(
'parent_cat_id'
);
}
else
{
$parent_cat_id
=
$this
->
Application
->
GetVar
(
'c_id'
);
if
(!
$parent_cat_id
)
{
$parent_cat_id
=
$this
->
Application
->
GetVar
(
'm_cat_id'
);
}
if
(!
$parent_cat_id
)
{
$parent_cat_id
=
0
;
}
}
if
((
string
)
$parent_cat_id
!=
'any'
)
{
if
(
$event
->
getEventParam
(
'recursive'
))
{
$current_path
=
$this
->
Conn
->
GetOne
(
'SELECT ParentPath FROM '
.
TABLE_PREFIX
.
'Category WHERE CategoryId='
.
$parent_cat_id
);
$subcats
=
$this
->
Conn
->
GetCol
(
'SELECT CategoryId FROM '
.
TABLE_PREFIX
.
'Category WHERE ParentPath LIKE "'
.
$current_path
.
'%" '
);
$object
->
addFilter
(
'category_filter'
,
TABLE_PREFIX
.
'CategoryItems.CategoryId IN ('
.
implode
(
', '
,
$subcats
).
')'
);
}
else
{
$object
->
addFilter
(
'category_filter'
,
TABLE_PREFIX
.
'CategoryItems.CategoryId = '
.
$parent_cat_id
);
}
}
}
else
{
$object
->
addFilter
(
'primary_filter'
,
'PrimaryCat = 1'
);
}
$view_perm
=
1
;
$object
->
addFilter
(
'perm_filter'
,
'perm.PermId = '
.
$view_perm
);
if
(!
defined
(
'ADMIN'
))
{
$groups
=
explode
(
','
,
$this
->
Application
->
RecallVar
(
'UserGroups'
));
foreach
(
$groups
as
$group
)
{
$view_filters
[]
=
'FIND_IN_SET('
.
$group
.
', perm.acl) || ((NOT FIND_IN_SET('
.
$group
.
',perm.dacl)) AND perm.acl=
\'\'
)'
;
}
$view_filter
=
implode
(
' OR '
,
$view_filters
);
$object
->
addFilter
(
'perm_filter2'
,
$view_filter
);
}
if
(!
defined
(
'ADMIN'
))
{
$object
->
addFilter
(
'status_filter'
,
$object
->
TableName
.
'.Status = 1'
);
}
/*$list_type = $event->getEventParam('ListType');
switch($list_type)
{
case 'favorites':
$fav_table = $this->Application->getUnitOption('fav','TableName');
$user_id =& $this->Application->GetVar('u_id');
$sql = 'SELECT DISTINCT f.ResourceId
FROM '.$fav_table.' f
LEFT JOIN '.$object->TableName.' p ON p.ResourceId = f.ResourceId
WHERE f.PortalUserId = '.$user_id;
$ids = $this->Conn->GetCol($sql);
if(!$ids) $ids = Array(-1);
$object->addFilter('category_filter', TABLE_PREFIX.'CategoryItems.PrimaryCat = 1');
$object->addFilter('favorites_filter', '%1$s.`ResourceId` IN ('.implode(',',$ids).')');
break;
case 'search':
$search_results_table = TABLE_PREFIX.'ses_'.$this->Application->GetVar('sid').'_'.TABLE_PREFIX.'Search';
$sql = ' SELECT DISTINCT ResourceId
FROM '.$search_results_table.'
WHERE ItemType=11';
$ids = $this->Conn->GetCol($sql);
if(!$ids) $ids = Array(-1);
$object->addFilter('search_filter', '%1$s.`ResourceId` IN ('.implode(',',$ids).')');
break;
} */
}
/**
* Adds calculates fields for item statuses
*
* @param kCatDBItem $object
* @param kEvent $event
*/
function
PrepareObject
(&
$object
,
&
$event
)
{
$property_mappings
=
$this
->
Application
->
getUnitOption
(
$event
->
Prefix
,
'ItemPropertyMappings'
);
$new_days_var
=
getArrayValue
(
$property_mappings
,
'NewDays'
);
if
(
$new_days_var
)
{
$object
->
addCalculatedField
(
'IsNew'
,
' IF(%1$s.NewItem = 2,
IF(%1$s.CreatedOn >= (UNIX_TIMESTAMP() - '
.
$this
->
Application
->
ConfigValue
(
$new_days_var
).
'*3600*24), 1, 0),
%1$s.NewItem
)'
);
}
$hot_limit_var
=
getArrayValue
(
$property_mappings
,
'HotLimit'
);
if
(
$hot_limit_var
)
{
$sql
=
'SELECT Data FROM '
.
TABLE_PREFIX
.
'Cache WHERE VarName = "'
.
$hot_limit_var
.
'"'
;
$hot_limit
=
$this
->
Conn
->
GetOne
(
$sql
);
if
(
$hot_limit
===
false
)
$hot_limit
=
$this
->
CalculateHotLimit
(
$event
);
$object
->
addCalculatedField
(
'IsHot'
,
' IF(%1$s.HotItem = 2,
IF(%1$s.Hits >= '
.
$hot_limit
.
', 1, 0),
%1$s.HotItem
)'
);
}
$votes2pop_var
=
getArrayValue
(
$property_mappings
,
'VotesToPop'
);
$rating2pop_var
=
getArrayValue
(
$property_mappings
,
'RatingToPop'
);
if
(
$votes2pop_var
&&
$rating2pop_var
)
{
$object
->
addCalculatedField
(
'IsPop'
,
' IF(%1$s.PopItem = 2,
IF(%1$s.CachedVotesQty >= '
.
$this
->
Application
->
ConfigValue
(
$votes2pop_var
).
' AND %1$s.CachedRating >= '
.
$this
->
Application
->
ConfigValue
(
$rating2pop_var
).
', 1, 0),
%1$s.PopItem)'
);
}
}
function
CalculateHotLimit
(&
$event
)
{
$property_mappings
=
$this
->
Application
->
getUnitOption
(
$event
->
Prefix
,
'ItemPropertyMappings'
);
$hot_count_var
=
getArrayValue
(
$property_mappings
,
'HotCount'
);
$hot_limit_var
=
getArrayValue
(
$property_mappings
,
'HotLimit'
);
if
(
$hot_count_var
&&
$hot_limit_var
)
{
$last_hot
=
$this
->
Application
->
ConfigValue
(
$hot_count_var
)
-
1
;
$sql
=
'SELECT Hits FROM '
.
$this
->
Application
->
getUnitOption
(
$event
->
Prefix
,
'TableName'
).
'
ORDER BY Hits DESC
LIMIT '
.
$last_hot
.
', 1'
;
$res
=
$this
->
Conn
->
GetCol
(
$sql
);
$hot_limit
=
(
double
)
array_shift
(
$res
);
$this
->
Conn
->
Query
(
'REPLACE INTO '
.
TABLE_PREFIX
.
'Cache VALUES ("'
.
$hot_limit_var
.
'", "'
.
$hot_limit
.
'", '
.
mktime
().
')'
);
return
$hot_limit
;
}
return
0
;
}
/**
* Enter description here...
*
* @param kEvent $event
*/
function
OnBeforeItemUpdate
(&
$event
)
{
$object
=&
$event
->
getObject
();
if
(
$this
->
Application
->
IsAdmin
()
&&
(
$this
->
Application
->
GetVar
(
'Hits_original'
)
!==
false
)
&&
floor
(
$this
->
Application
->
GetVar
(
'Hits_original'
))
!=
$object
->
GetDBField
(
'Hits'
)
)
{
$sql
=
'SELECT MAX(Hits) FROM '
.
$this
->
Application
->
getUnitOption
(
$event
->
Prefix
,
'TableName'
).
'
WHERE FLOOR(Hits) = '
.
$object
->
GetDBField
(
'Hits'
);
$hits
=
(
$res
=
$this
->
Conn
->
GetOne
(
$sql
)
)
?
$res
+
0.000001
:
$object
->
GetDBField
(
'Hits'
);
$object
->
SetDBField
(
'Hits'
,
$hits
);
}
}
function
OnAfterItemUpdate
(&
$event
)
{
$this
->
CalculateHotLimit
(
$event
);
}
/**
* Makes simple search for products
* based on keywords string
*
* @param kEvent $event
* @todo Change all hardcoded Products table & In-Commerce module usage to dynamic usage from item config !!!
*/
function
OnSimpleSearch
(&
$event
)
{
if
(
$this
->
Application
->
GetVar
(
'INPORTAL_ON'
)
&&
!(
$this
->
Application
->
GetVar
(
'Action'
)
==
'm_simple_search'
))
{
return
;
}
$event
->
redirect
=
false
;
$search_table
=
TABLE_PREFIX
.
'ses_'
.
$this
->
Application
->
GetVar
(
'sid'
).
'_'
.
TABLE_PREFIX
.
'Search'
;
$keywords
=
trim
(
$this
->
Application
->
GetVar
(
'keywords'
));
if
(
!
$this
->
Application
->
GetVar
(
'INPORTAL_ON'
)
)
{
$keywords
=
unhtmlentities
(
$keywords
);
}
$query_object
=&
$this
->
Application
->
recallObject
(
'HTTPQuery'
);
$sql
=
'SHOW TABLES LIKE "'
.
$search_table
.
'"'
;
if
(!
isset
(
$query_object
->
Get
[
'keywords'
])
&&
!
isset
(
$query_object
->
Post
[
'keywords'
])
&&
$this
->
Conn
->
Query
(
$sql
))
{
return
;
// used when navigating by pages or changing sorting in search results
}
if
(!
$keywords
||
strlen
(
$keywords
)
<
$this
->
Application
->
ConfigValue
(
'Search_MinKeyword_Length'
))
{
$this
->
Conn
->
Query
(
'DROP TABLE IF EXISTS '
.
$search_table
);
$this
->
Application
->
SetVar
(
'keywords_too_short'
,
1
);
return
;
// if no or too short keyword entered, doing nothing
}
$this
->
Application
->
StoreVar
(
'keywords'
,
$keywords
);
$keywords
=
strtr
(
$keywords
,
Array
(
'%'
=>
'
\\
%'
,
'_'
=>
'
\\
_'
));
$event
->
setPseudoClass
(
'_List'
);
$object
=&
$event
->
getObject
();
$this
->
Application
->
SetVar
(
$event
->
getPrefixSpecial
().
'_Page'
,
1
);
$lang
=
$this
->
Application
->
GetVar
(
'm_lang'
);
$product_table
=
$this
->
Application
->
getUnitOption
(
'p'
,
'TableName'
);
$sql
=
' SELECT * FROM '
.
$this
->
Application
->
getUnitOption
(
'confs'
,
'TableName'
).
'
WHERE ModuleName="In-Commerce"
AND SimpleSearch=1'
;
$search_config
=
$this
->
Conn
->
Query
(
$sql
,
'FieldName'
);
$field_list
=
array_keys
(
$search_config
);
$join_clauses
=
Array
();
// field processing
$weight_sum
=
0
;
foreach
(
$field_list
as
$key
=>
$field
)
{
$options
=
$object
->
getFieldOptions
(
$field
);
$local_table
=
TABLE_PREFIX
.
$search_config
[
$field
][
'TableName'
];
$weight_sum
+=
$search_config
[
$field
][
'Priority'
];
// counting weight sum; used when making relevance clause
// processing multilingual fields
if
(
$options
[
'formatter'
]
==
'kMultiLanguage'
)
{
$field_list
[
$key
]
=
'l'
.
$lang
.
'_'
.
$field
;
}
// processing fields from other tables
if
(
$foreign_field
=
$search_config
[
$field
][
'ForeignField'
])
{
$exploded
=
explode
(
':'
,
$foreign_field
,
2
);
if
(
$exploded
[
0
]
==
'CALC'
)
{
unset
(
$field_list
[
$key
]);
continue
;
// ignoring having type clauses in simple search
/*$user_object =& $this->Application->recallObject('u');
$user_groups = $user_object->GetDBField('PortalUserId') ?
implode(',', $this->Conn->GetCol(' SELECT GroupId
FROM '.TABLE_PREFIX.'UserGroup
WHERE PortalUserId='.$user_object->GetDBField('PortalUserId'))) : 0;
$having_list[$key] = str_replace('{PREFIX}', TABLE_PREFIX, $exploded[1]);
$join_clause = str_replace('{PREFIX}', TABLE_PREFIX, $search_config[$field]['JoinClause']);
$join_clause = str_replace('{USER_GROUPS}', $user_groups, $join_clause);
$join_clause = ' LEFT JOIN '.$join_clause;
$join_clauses[] = $join_clause;*/
}
else
{
$exploded
=
explode
(
'.'
,
$foreign_field
);
$foreign_table
=
TABLE_PREFIX
.
$exploded
[
0
];
$alias_counter
++;
$alias
=
't'
.
$alias_counter
;
$field_list
[
$key
]
=
$alias
.
'.'
.
$exploded
[
1
];
$join_clause
=
str_replace
(
'{ForeignTable}'
,
$alias
,
$search_config
[
$field
][
'JoinClause'
]);
$join_clause
=
str_replace
(
'{LocalTable}'
,
$product_table
,
$join_clause
);
if
(
$search_config
[
$field
][
'CustomFieldId'
])
{
$join_clause
.=
' AND '
.
$alias
.
'.CustomFieldId='
.
$search_config
[
$field
][
'CustomFieldId'
];
}
$join_clauses
[]
=
' LEFT JOIN '
.
$foreign_table
.
' '
.
$alias
.
'
ON '
.
$join_clause
;
}
}
else
{
// processing fields from local table
$field_list
[
$key
]
=
$local_table
.
'.'
.
$field_list
[
$key
];
}
}
// keyword string processing
$normal_keywords
=
Array
();
$plus_keywords
=
Array
();
$minus_keywords
=
Array
();
for
(
$i
=
0
;
$i
<
strlen
(
$keywords
);
$i
++)
{
if
(
substr
(
$keywords
,
$i
,
1
)
==
' '
)
continue
;
$extra_skip
=
0
;
switch
(
substr
(
$keywords
,
$i
,
1
))
{
case
'+'
:
if
(
substr
(
$keywords
,
$i
+
1
,
1
)
==
'"'
)
{
$keyword_start
=
$i
+
2
;
$keyword_end
=
strpos
(
$keywords
,
'"'
,
$i
+
2
);
$extra_skip
=
2
;
}
else
{
$keyword_start
=
$i
+
1
;
$keyword_end
=
strpos
(
$keywords
,
' '
,
$i
+
1
);
$extra_skip
=
0
;
}
$target_array
=&
$plus_keywords
;
break
;
case
'-'
:
if
(
substr
(
$keywords
,
$i
+
1
,
1
)
==
'"'
)
{
$keyword_start
=
$i
+
2
;
$keyword_end
=
strpos
(
$keywords
,
'"'
,
$i
+
2
);
$extra_skip
=
2
;
}
else
{
$keyword_start
=
$i
+
1
;
$keyword_end
=
strpos
(
$keywords
,
' '
,
$i
+
1
);
$extra_skip
=
0
;
}
$target_array
=&
$minus_keywords
;
break
;
case
'"'
:
$keyword_start
=
$i
+
1
;
$keyword_end
=
strpos
(
$keywords
,
'"'
,
$i
+
1
);
$extra_skip
=
1
;
$target_array
=&
$normal_keywords
;
break
;
default
:
$keyword_start
=
$i
;
$keyword_end
=
strpos
(
$keywords
,
' '
,
$i
+
1
);
$target_array
=&
$normal_keywords
;
}
if
(
$keyword_end
===
false
)
{
$keyword_end
=
strlen
(
$keywords
);
}
$keyword_length
=
$keyword_end
-
$keyword_start
;
$keyword
=
substr
(
$keywords
,
$keyword_start
,
$keyword_length
);
if
(
strlen
(
$keyword
)
>=
$this
->
Application
->
ConfigValue
(
'Search_MinKeyword_Length'
))
{
$target_array
[]
=
addcslashes
(
$keyword
,
'"'
);
}
$i
+=
$keyword_length
+
$extra_skip
;
}
// preparing conditions
$normal_conditions
=
Array
();
$plus_conditions
=
Array
();
$minus_conditions
=
Array
();
foreach
(
$normal_keywords
as
$keyword
)
{
$normal_conditions
[]
=
implode
(
' LIKE "%'
.
$keyword
.
'%" OR '
,
$field_list
).
' LIKE "%'
.
$keyword
.
'%"'
;
}
foreach
(
$plus_keywords
as
$keyword
)
{
$plus_conditions
[]
=
implode
(
' LIKE "%'
.
$keyword
.
'%" OR '
,
$field_list
).
' LIKE "%'
.
$keyword
.
'%"'
;
}
foreach
(
$minus_keywords
as
$keyword
)
{
foreach
(
$field_list
as
$field
)
{
$condition
[]
=
$field
.
' NOT LIKE "%'
.
$keyword
.
'%" OR '
.
$field
.
' IS NULL'
;
}
$minus_conditions
[]
=
'('
.
implode
(
') AND ('
,
$condition
).
')'
;
}
// building where clause
if
(
$normal_conditions
)
{
$where_clause
=
'('
.
implode
(
') OR ('
,
$normal_conditions
).
')'
;
}
else
{
$where_clause
=
'1'
;
}
if
(
$plus_conditions
)
{
$where_clause
=
'('
.
$where_clause
.
') AND ('
.
implode
(
') AND ('
,
$plus_conditions
).
')'
;
}
if
(
$minus_conditions
)
{
$where_clause
=
'('
.
$where_clause
.
') AND ('
.
implode
(
') AND ('
,
$minus_conditions
).
')'
;
}
$where_clause
=
$where_clause
.
' AND '
.
$product_table
.
'.Status=1'
;
if
(
$this
->
Application
->
GetVar
(
'Action'
)
==
'm_simple_subsearch'
)
// subsearch, In-portal
{
if
(
$event
->
getEventParam
(
'ResultIds'
)
)
{
$where_clause
.=
' AND '
.
$product_table
.
'.ResourceId IN ('
.
implode
(
','
,
$event
->
specificParams
[
'ResultIds'
]).
')'
;
}
}
if
(
$event
->
MasterEvent
&&
$event
->
MasterEvent
->
Name
==
'OnListBuild'
)
// subsearch, k4
{
if
(
$event
->
MasterEvent
->
getEventParam
(
'ResultIds'
)
)
{
$where_clause
.=
' AND '
.
$product_table
.
'.ResourceId IN ('
.
implode
(
','
,
$event
->
MasterEvent
->
getEventParam
(
'ResultIds'
)).
')'
;
}
}
// building having clause
// making relevance clause
$positive_words
=
array_merge
(
$normal_keywords
,
$plus_keywords
);
$this
->
Application
->
StoreVar
(
'highlight_keywords'
,
serialize
(
$positive_words
));
$revelance_parts
=
Array
();
reset
(
$search_config
);
foreach
(
$field_list
as
$field
)
{
$config_elem
=
each
(
$search_config
);
$weight
=
$search_config
[
$field
][
'Priority'
];
$revelance_parts
[]
=
'IF('
.
$field
.
' LIKE "%'
.
implode
(
' '
,
$positive_words
).
'%", '
.
$weight_sum
.
', 0)'
;
foreach
(
$positive_words
as
$keyword
)
{
$revelance_parts
[]
=
'IF('
.
$field
.
' LIKE "%'
.
$keyword
.
'%", '
.
$config_elem
[
'value'
][
'Priority'
].
', 0)'
;
}
}
$rel_keywords
=
$this
->
Application
->
ConfigValue
(
'SearchRel_DefaultKeyword_products'
)
/
100
;
$rel_pop
=
$this
->
Application
->
ConfigValue
(
'SearchRel_DefaultPop_products'
)
/
100
;
$rel_rating
=
$this
->
Application
->
ConfigValue
(
'SearchRel_DefaultRating_products'
)
/
100
;
$relevance_clause
=
'('
.
implode
(
' + '
,
$revelance_parts
).
') / '
.
$weight_sum
.
' * '
.
$rel_keywords
;
$relevance_clause
.=
' + (Hits + 1) / (MAX(Hits) + 1) * '
.
$rel_pop
;
$relevance_clause
.=
' + (CachedRating + 1) / (MAX(CachedRating) + 1) * '
.
$rel_rating
;
// building final search query
if
(
!
$this
->
Application
->
GetVar
(
'INPORTAL_ON'
)
)
{
$this
->
Conn
->
Query
(
'DROP TABLE IF EXISTS '
.
$search_table
);
// erase old search table if clean k4 event
}
if
(
$this
->
Conn
->
Query
(
'SHOW TABLES LIKE "'
.
$search_table
.
'"'
))
{
$select_intro
=
'INSERT INTO '
.
$search_table
.
' (Relevance, ItemId, ResourceId, ItemType, EdPick) '
;
}
else
{
$select_intro
=
'CREATE TABLE '
.
$search_table
.
' AS '
;
}
$sql
=
$select_intro
.
' SELECT '
.
$relevance_clause
.
' AS Relevance,
'
.
$product_table
.
'.ProductId AS ItemId,
'
.
$product_table
.
'.ResourceId,
11 AS ItemType,
'
.
$product_table
.
'.EditorsPick AS EdPick
FROM '
.
$object
->
TableName
.
'
'
.
implode
(
' '
,
$join_clauses
).
'
WHERE '
.
$where_clause
.
'
GROUP BY '
.
$product_table
.
'.ProductId'
;
$res
=
$this
->
Conn
->
Query
(
$sql
);
}
/**
* Enter description here...
*
* @param kEvent $event
*/
function
OnSubSearch
(&
$event
)
{
$search_table
=
TABLE_PREFIX
.
'ses_'
.
$this
->
Application
->
GetVar
(
'sid'
).
'_'
.
TABLE_PREFIX
.
'Search'
;
$sql
=
'SHOW TABLES LIKE "'
.
$search_table
.
'"'
;
if
(
$this
->
Conn
->
Query
(
$sql
))
{
$sql
=
'SELECT DISTINCT ResourceId FROM '
.
$search_table
;
$ids
=
$this
->
Conn
->
GetCol
(
$sql
);
}
$event
->
setEventParam
(
'ResultIds'
,
$ids
);
$event
->
CallSubEvent
(
'OnSimpleSearch'
);
}
/**
* Enter description here...
*
* @param kEvent $event
* @todo Change all hardcoded Products table & In-Commerce module usage to dynamic usage from item config !!!
*/
function
OnAdvancedSearch
(&
$event
)
{
$query_object
=&
$this
->
Application
->
recallObject
(
'HTTPQuery'
);
if
(!
isset
(
$query_object
->
Post
[
'andor'
]))
{
return
;
// used when navigating by pages or changing sorting in search results
}
$this
->
Application
->
RemoveVar
(
'keywords'
);
$this
->
Application
->
RemoveVar
(
'Search_Keywords'
);
$sql
=
' SELECT * FROM '
.
$this
->
Application
->
getUnitOption
(
'confs'
,
'TableName'
).
'
WHERE ModuleName="In-Commerce"
AND AdvancedSearch=1'
;
$search_config
=
$this
->
Conn
->
Query
(
$sql
);
$lang
=
$this
->
Application
->
GetVar
(
'm_lang'
);
$object
=&
$event
->
getObject
();
$object
->
SetPage
(
1
);
$user_object
=&
$this
->
Application
->
recallObject
(
'u'
);
$product_table
=
$this
->
Application
->
getUnitOption
(
'p'
,
'TableName'
);
$keywords
=
$this
->
Application
->
GetVar
(
'value'
);
$verbs
=
$this
->
Application
->
GetVar
(
'verb'
);
$glues
=
$this
->
Application
->
GetVar
(
'andor'
);
$and_conditions
=
Array
();
$or_conditions
=
Array
();
$and_having_conditions
=
Array
();
$or_having_conditions
=
Array
();
$join_clauses
=
Array
();
$highlight_keywords
=
Array
();
$relevance_parts
=
Array
();
$condition_patterns
=
Array
(
'any'
=>
'%s LIKE %s'
,
'contains'
=>
'%s LIKE %s'
,
'notcontains'
=>
'(NOT (%1$s LIKE %2$s) OR %1$s IS NULL)'
,
'is'
=>
'%s = %s'
,
'isnot'
=>
'(%1$s != %2$s OR %1$s IS NULL)'
);
$alias_counter
=
0
;
$weight_sum
=
0
;
// processing fields and preparing conditions
foreach
(
$search_config
as
$record
)
{
$field
=
$record
[
'FieldName'
];
$join_clause
=
''
;
$condition_mode
=
'WHERE'
;
// field processing
$options
=
$object
->
getFieldOptions
(
$field
);
$local_table
=
TABLE_PREFIX
.
$record
[
'TableName'
];
$weight_sum
+=
$record
[
'Priority'
];
// counting weight sum; used when making relevance clause
// processing multilingual fields
if
(
$options
[
'formatter'
]
==
'kMultiLanguage'
)
{
$field_name
=
'l'
.
$lang
.
'_'
.
$field
;
}
else
{
$field_name
=
$field
;
}
// processing fields from other tables
if
(
$foreign_field
=
$record
[
'ForeignField'
])
{
$exploded
=
explode
(
':'
,
$foreign_field
,
2
);
if
(
$exploded
[
0
]
==
'CALC'
)
{
$user_groups
=
$user_object
->
GetDBField
(
'PortalUserId'
)
?
implode
(
','
,
$this
->
Conn
->
GetCol
(
' SELECT GroupId
FROM '
.
TABLE_PREFIX
.
'UserGroup
WHERE PortalUserId='
.
$user_object
->
GetDBField
(
'PortalUserId'
)))
:
0
;
$field_name
=
str_replace
(
'{PREFIX}'
,
TABLE_PREFIX
,
$exploded
[
1
]);
$join_clause
=
str_replace
(
'{PREFIX}'
,
TABLE_PREFIX
,
$record
[
'JoinClause'
]);
$join_clause
=
str_replace
(
'{USER_GROUPS}'
,
$user_groups
,
$join_clause
);
$join_clause
=
' LEFT JOIN '
.
$join_clause
;
$condition_mode
=
'HAVING'
;
}
else
{
$exploded
=
explode
(
'.'
,
$foreign_field
);
$foreign_table
=
TABLE_PREFIX
.
$exploded
[
0
];
$alias_counter
++;
$alias
=
't'
.
$alias_counter
;
$field_name
=
$alias
.
'.'
.
$exploded
[
1
];
$join_clause
=
str_replace
(
'{ForeignTable}'
,
$alias
,
$record
[
'JoinClause'
]);
$join_clause
=
str_replace
(
'{LocalTable}'
,
$product_table
,
$join_clause
);
if
(
$record
[
'CustomFieldId'
])
{
$join_clause
.=
' AND '
.
$alias
.
'.CustomFieldId='
.
$record
[
'CustomFieldId'
];
}
$join_clause
=
' LEFT JOIN '
.
$foreign_table
.
' '
.
$alias
.
'
ON '
.
$join_clause
;
}
}
else
{
// processing fields from local table
$field_name
=
$local_table
.
'.'
.
$field_name
;
}
$condition
=
''
;
switch
(
$record
[
'FieldType'
])
{
case
'text'
:
if
(
!
$this
->
Application
->
GetVar
(
'INPORTAL_ON'
)
)
{
$keywords
[
$field
]
=
unhtmlentities
(
$keywords
[
$field
]
);
}
if
(
strlen
(
$keywords
[
$field
])
>=
$this
->
Application
->
ConfigValue
(
'Search_MinKeyword_Length'
))
{
$highlight_keywords
[]
=
$keywords
[
$field
];
if
(
in_array
(
$verbs
[
$field
],
Array
(
'any'
,
'contains'
,
'notcontains'
))
)
{
$keywords
[
$field
]
=
'%'
.
strtr
(
$keywords
[
$field
],
Array
(
'%'
=>
'
\\
%'
,
'_'
=>
'
\\
_'
)).
'%'
;
}
$condition
=
sprintf
(
$condition_patterns
[
$verbs
[
$field
]],
$field_name
,
$this
->
Conn
->
qstr
(
$keywords
[
$field
]
));
}
break
;
case
'boolean'
:
if
(
$keywords
[
$field
]
!=
-
1
)
{
$property_mappings
=
$this
->
Application
->
getUnitOption
(
$event
->
Prefix
,
'ItemPropertyMappings'
);
switch
(
$field
)
{
case
'HotItem'
:
$hot_limit_var
=
getArrayValue
(
$property_mappings
,
'HotLimit'
);
if
(
$hot_limit_var
)
{
$sql
=
'SELECT Data FROM '
.
TABLE_PREFIX
.
'Cache WHERE VarName="'
.
$hot_limit_var
.
'"'
;
$hot_limit
=
(
int
)
$this
->
Conn
->
GetOne
(
$sql
);
$condition
=
'IF('
.
$product_table
.
'.HotItem = 2,
IF('
.
$product_table
.
'.Hits >= '
.
$hot_limit
.
', 1, 0), '
.
$product_table
.
'.HotItem) = '
.
$keywords
[
$field
];
}
break
;
case
'PopItem'
:
$votes2pop_var
=
getArrayValue
(
$property_mappings
,
'VotesToPop'
);
$rating2pop_var
=
getArrayValue
(
$property_mappings
,
'RatingToPop'
);
if
(
$votes2pop_var
&&
$rating2pop_var
)
{
$condition
=
'IF('
.
$product_table
.
'.PopItem = 2, IF('
.
$product_table
.
'.CachedVotesQty >= '
.
$this
->
Application
->
ConfigValue
(
$votes2pop_var
).
' AND '
.
$product_table
.
'.CachedRating >= '
.
$this
->
Application
->
ConfigValue
(
$rating2pop_var
).
', 1, 0), '
.
$product_table
.
'.PopItem) = '
.
$keywords
[
$field
];
}
break
;
case
'NewItem'
:
$new_days_var
=
getArrayValue
(
$property_mappings
,
'NewDays'
);
if
(
$new_days_var
)
{
$condition
=
'IF('
.
$product_table
.
'.NewItem = 2,
IF('
.
$product_table
.
'.CreatedOn >= (UNIX_TIMESTAMP() - '
.
$this
->
Application
->
ConfigValue
(
$new_days_var
).
'*3600*24), 1, 0), '
.
$product_table
.
'.NewItem) = '
.
$keywords
[
$field
];
}
break
;
case
'EditorsPick'
:
$condition
=
$product_table
.
'.EditorsPick = '
.
$keywords
[
$field
];
break
;
}
}
break
;
case
'range'
:
$range_conditions
=
Array
();
if
(
$keywords
[
$field
.
'_from'
]
&&
!
preg_match
(
"/[^0-9]/i"
,
$keywords
[
$field
.
'_from'
]))
{
$range_conditions
[]
=
$field_name
.
' >= '
.
$keywords
[
$field
.
'_from'
];
}
if
(
$keywords
[
$field
.
'_to'
]
&&
!
preg_match
(
"/[^0-9]/i"
,
$keywords
[
$field
.
'_to'
]))
{
$range_conditions
[]
=
$field_name
.
' <= '
.
$keywords
[
$field
.
'_to'
];
}
if
(
$range_conditions
)
{
$condition
=
implode
(
' AND '
,
$range_conditions
);
}
break
;
case
'date'
:
if
(
$keywords
[
$field
])
{
if
(
in_array
(
$keywords
[
$field
],
Array
(
'today'
,
'yesterday'
))
)
{
$current_time
=
getdate
();
$day_begin
=
mktime
(
0
,
0
,
0
,
$current_time
[
'mon'
],
$current_time
[
'mday'
],
$current_time
[
'year'
]);
$time_mapping
=
Array
(
'today'
=>
$day_begin
,
'yesterday'
=>
(
$day_begin
-
86400
));
$min_time
=
$time_mapping
[
$keywords
[
$field
]];
}
else
{
$time_mapping
=
Array
(
'last_week'
=>
604800
,
'last_month'
=>
2628000
,
'last_3_months'
=>
7884000
,
'last_6_months'
=>
15768000
,
'last_year'
=>
31536000
);
$min_time
=
mktime
()
-
$time_mapping
[
$keywords
[
$field
]];
}
$condition
=
$field_name
.
' > '
.
$min_time
;
}
break
;
}
if
(
$condition
)
{
if
(
$join_clause
)
{
$join_clauses
[]
=
$join_clause
;
}
$relevance_parts
[]
=
'IF('
.
$condition
.
', '
.
$record
[
'Priority'
].
', 0)'
;
if
(
$glues
[
$field
]
==
1
)
// and
{
if
(
$condition_mode
==
'WHERE'
)
{
$and_conditions
[]
=
$condition
;
}
else
{
$and_having_conditions
[]
=
$condition
;
}
}
else
// or
{
if
(
$condition_mode
==
'WHERE'
)
{
$or_conditions
[]
=
$condition
;
}
else
{
$or_having_conditions
[]
=
$condition
;
}
}
}
}
$this
->
Application
->
StoreVar
(
'highlight_keywords'
,
serialize
(
$highlight_keywords
));
// making relevance clause
if
(
$relevance_parts
)
{
$rel_keywords
=
$this
->
Application
->
ConfigValue
(
'SearchRel_DefaultKeyword_products'
)
/
100
;
$rel_pop
=
$this
->
Application
->
ConfigValue
(
'SearchRel_DefaultPop_products'
)
/
100
;
$rel_rating
=
$this
->
Application
->
ConfigValue
(
'SearchRel_DefaultRating_products'
)
/
100
;
$relevance_clause
=
'('
.
implode
(
' + '
,
$relevance_parts
).
') / '
.
$weight_sum
.
' * '
.
$rel_keywords
;
$relevance_clause
.=
' + (Hits + 1) / (MAX(Hits) + 1) * '
.
$rel_pop
;
$relevance_clause
.=
' + (CachedRating + 1) / (MAX(CachedRating) + 1) * '
.
$rel_rating
;
}
else
{
$relevance_clause
=
'0'
;
}
// building having clause
if
(
$or_having_conditions
)
{
$and_having_conditions
[]
=
'('
.
implode
(
' OR '
,
$or_having_conditions
).
')'
;
}
$having_clause
=
implode
(
' AND '
,
$and_having_conditions
);
$having_clause
=
$having_clause
?
' HAVING '
.
$having_clause
:
''
;
// building where clause
if
(
$or_conditions
)
{
$and_conditions
[]
=
'('
.
implode
(
' OR '
,
$or_conditions
).
')'
;
}
// $and_conditions[] = $product_table.'.Status = 1';
$where_clause
=
implode
(
' AND '
,
$and_conditions
);
if
(!
$where_clause
)
{
if
(
$having_clause
)
{
$where_clause
=
'1'
;
}
else
{
$where_clause
=
'0'
;
$this
->
Application
->
SetVar
(
'adv_search_error'
,
1
);
}
}
$where_clause
.=
' AND '
.
$product_table
.
'.Status = 1'
;
// building final search query
$search_table
=
TABLE_PREFIX
.
'ses_'
.
$this
->
Application
->
GetVar
(
'sid'
).
'_'
.
TABLE_PREFIX
.
'Search'
;
$this
->
Conn
->
Query
(
'DROP TABLE IF EXISTS '
.
$search_table
);
$sql
=
' CREATE TABLE '
.
$search_table
.
'
SELECT '
.
$relevance_clause
.
' AS Relevance,
'
.
$product_table
.
'.ProductId AS ItemId,
'
.
$product_table
.
'.ResourceId AS ResourceId,
11 AS ItemType,
'
.
$product_table
.
'.EditorsPick AS EdPick
FROM '
.
$product_table
.
'
'
.
implode
(
' '
,
$join_clauses
).
'
WHERE '
.
$where_clause
.
'
GROUP BY '
.
$product_table
.
'.ProductId'
.
$having_clause
;
$res
=
$this
->
Conn
->
Query
(
$sql
);
}
}
?>
Event Timeline
Log In to Comment