Page Menu
Home
In-Portal Phabricator
Search
Configure Global Search
Log In
Files
F804737
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, 4:43 PM
Size
72 KB
Mime Type
text/x-php
Expires
Fri, Feb 28, 4:43 PM (12 h, 34 m)
Engine
blob
Format
Raw Data
Handle
577163
Attached To
rINP In-Portal
cat_event_handler.php
View Options
<?php
$application
=&
kApplication
::
Instance
();
$application
->
Factory
->
includeClassFile
(
'kDBEventHandler'
);
class
kCatDBEventHandler
extends
kDBEventHandler
{
/**
* Allows to override standart permission mapping
*
*/
function
mapPermissions
()
{
parent
::
mapPermissions
();
$permissions
=
Array
(
'OnExport'
=>
Array
(
'self'
=>
'view|advanced:export'
),
'OnExportBegin'
=>
Array
(
'self'
=>
'view|advanced:export'
),
'OnSaveSettings'
=>
Array
(
'self'
=>
'add|edit|advanced:import'
),
'OnBeforeDeleteOriginal'
=>
Array
(
'self'
=>
'edit|advanced:approve'
),
'OnCancelAction'
=>
Array
(
'self'
=>
true
),
);
$this
->
permMapping
=
array_merge
(
$this
->
permMapping
,
$permissions
);
}
/**
* Load item if id is available
*
* @param kEvent $event
*/
function
LoadItem
(&
$event
)
{
$object
=&
$event
->
getObject
();
$id
=
$this
->
getPassedID
(
$event
);
if
(
$object
->
Load
(
$id
))
{
$actions
=&
$this
->
Application
->
recallObject
(
'kActions'
);
$actions
->
Set
(
$event
->
Prefix_Special
.
'_id'
,
$object
->
GetID
()
);
$use_pending_editing
=
$this
->
Application
->
getUnitOption
(
$event
->
Prefix
,
'UsePendingEditing'
);
if
(
$use_pending_editing
&&
$event
->
Special
!=
'original'
)
{
$this
->
Application
->
SetVar
(
$event
->
Prefix
.
'.original_id'
,
$object
->
GetDBField
(
'OrgId'
));
}
}
else
{
$object
->
setID
(
$id
);
}
}
/**
* Checks permissions of user
*
* @param kEvent $event
*/
function
CheckPermission
(&
$event
)
{
if
(!
$this
->
Application
->
IsAdmin
())
{
if
(
$event
->
Name
==
'OnSetSortingDirect'
)
{
// allow sorting on front event without view permission
return
true
;
}
}
if
(
$event
->
Name
==
'OnExport'
)
{
// save category_id before doing export
$this
->
Application
->
LinkVar
(
'm_cat_id'
);
}
if
(
$event
->
Name
==
'OnNew'
&&
preg_match
(
'/(.*)
\/
import$/'
,
$this
->
Application
->
GetVar
(
't'
),
$rets
))
{
// redirect to item import template, where permission (import) category will be chosen)
$root_category
=
$this
->
Application
->
findModule
(
'Path'
,
$rets
[
1
].
'/'
,
'RootCat'
);
$this
->
Application
->
StoreVar
(
'm_cat_id'
,
$root_category
);
}
$check_events
=
Array
(
'OnEdit'
,
'OnSave'
,
'OnMassDelete'
);
if
(
in_array
(
$event
->
Name
,
$check_events
))
{
// check each id from selected individually and only if all are allowed proceed next
if
(
$event
->
Name
==
'OnSave'
)
{
$selected_ids
=
implode
(
','
,
$this
->
getSelectedIDs
(
$event
,
true
));
if
(!
$selected_ids
)
{
$selected_ids
=
0
;
// when saving newly created item (OnPreCreate -> OnPreSave -> OnSave)
}
}
else
{
$selected_ids
=
implode
(
','
,
$this
->
StoreSelectedIDs
(
$event
));
}
$perm_value
=
true
;
if
(
strlen
(
$selected_ids
))
{
$perm_helper
=&
$this
->
Application
->
recallObject
(
'PermissionsHelper'
);
/* @var $perm_helper kPermissionsHelper */
$items
=
$perm_helper
->
GetCategoryItemData
(
$event
->
Prefix
,
$selected_ids
);
$check_method
=
(
$event
->
Name
==
'OnMassDelete'
)
?
'DeleteCheckPermission'
:
'ModifyCheckPermission'
;
foreach
(
$items
as
$item_id
=>
$item_data
)
{
if
(
$perm_helper
->
$check_method
(
$item_data
[
'CreatedById'
],
$item_data
[
'CategoryId'
],
$event
->
Prefix
)
==
0
)
{
// one of items selected has no permission
$perm_value
=
false
;
break
;
}
}
if
(!
$perm_value
)
{
$event
->
status
=
erPERM_FAIL
;
}
}
else
{
trigger_error
(
'IDs not passed to '
.
$event
->
getPrefixSpecial
().
':CheckPermission'
,
E_USER_WARNING
);
}
return
$perm_value
;
}
return
parent
::
CheckPermission
(
$event
);
}
/**
* Add selected items to clipboard with mode = COPY (CLONE)
*
* @param kEvent $event
*/
function
OnCopy
(&
$event
)
{
$this
->
Application
->
RemoveVar
(
'clipboard'
);
$clipboard_helper
=&
$this
->
Application
->
recallObject
(
'ClipboardHelper'
);
$clipboard_helper
->
setClipboard
(
$event
,
'copy'
,
$this
->
StoreSelectedIDs
(
$event
));
}
/**
* Add selected items to clipboard with mode = CUT
*
* @param kEvent $event
*/
function
OnCut
(&
$event
)
{
$this
->
Application
->
RemoveVar
(
'clipboard'
);
$clipboard_helper
=&
$this
->
Application
->
recallObject
(
'ClipboardHelper'
);
$clipboard_helper
->
setClipboard
(
$event
,
'cut'
,
$this
->
StoreSelectedIDs
(
$event
));
}
/**
* Performs category item paste
*
* @param kEvent $event
*/
function
OnPaste
(&
$event
)
{
if
(
$this
->
Application
->
CheckPermission
(
'SYSTEM_ACCESS.READONLY'
,
1
))
{
return
;
}
$clipboard_data
=
$event
->
getEventParam
(
'clipboard_data'
);
if
(!
$clipboard_data
[
'cut'
]
&&
!
$clipboard_data
[
'copy'
])
{
return
false
;
}
if
(
$clipboard_data
[
'copy'
])
{
$temp
=&
$this
->
Application
->
recallObject
(
$event
->
getPrefixSpecial
().
'_TempHandler'
,
'kTempTablesHandler'
);
$this
->
Application
->
SetVar
(
'ResetCatBeforeClone'
,
1
);
$temp
->
CloneItems
(
$event
->
Prefix
,
$event
->
Special
,
$clipboard_data
[
'copy'
]);
}
if
(
$clipboard_data
[
'cut'
])
{
$object
=&
$this
->
Application
->
recallObject
(
$event
->
getPrefixSpecial
().
'.item'
,
$event
->
Prefix
,
Array
(
'skip_autoload'
=>
true
));
foreach
(
$clipboard_data
[
'cut'
]
as
$id
)
{
$object
->
Load
(
$id
);
$object
->
MoveToCat
();
}
}
}
/**
* Return type clauses for list bulding on front
*
* @param kEvent $event
* @return Array
*/
function
getTypeClauses
(&
$event
)
{
$types
=
$event
->
getEventParam
(
'types'
);
$types
=
$types
?
explode
(
','
,
$types
)
:
Array
();
$except_types
=
$event
->
getEventParam
(
'except'
);
$except_types
=
$except_types
?
explode
(
','
,
$except_types
)
:
Array
();
$type_clauses
=
Array
();
$user_id
=
$this
->
Application
->
RecallVar
(
'user_id'
);
$owner_field
=
$this
->
getOwnerField
(
$event
->
Prefix
);
$type_clauses
[
'my_items'
][
'include'
]
=
'%1$s.'
.
$owner_field
.
' = '
.
$user_id
;
$type_clauses
[
'my_items'
][
'except'
]
=
'%1$s.'
.
$owner_field
.
' <> '
.
$user_id
;
$type_clauses
[
'my_items'
][
'having_filter'
]
=
false
;
$type_clauses
[
'pick'
][
'include'
]
=
'%1$s.EditorsPick = 1 AND '
.
TABLE_PREFIX
.
'CategoryItems.PrimaryCat = 1'
;
$type_clauses
[
'pick'
][
'except'
]
=
'%1$s.EditorsPick! = 1 AND '
.
TABLE_PREFIX
.
'CategoryItems.PrimaryCat = 1'
;
$type_clauses
[
'pick'
][
'having_filter'
]
=
false
;
$type_clauses
[
'hot'
][
'include'
]
=
'`IsHot` = 1 AND PrimaryCat = 1'
;
$type_clauses
[
'hot'
][
'except'
]
=
'`IsHot`! = 1 AND PrimaryCat = 1'
;
$type_clauses
[
'hot'
][
'having_filter'
]
=
true
;
$type_clauses
[
'pop'
][
'include'
]
=
'`IsPop` = 1 AND PrimaryCat = 1'
;
$type_clauses
[
'pop'
][
'except'
]
=
'`IsPop`! = 1 AND PrimaryCat = 1'
;
$type_clauses
[
'pop'
][
'having_filter'
]
=
true
;
$type_clauses
[
'new'
][
'include'
]
=
'`IsNew` = 1 AND PrimaryCat = 1'
;
$type_clauses
[
'new'
][
'except'
]
=
'`IsNew`! = 1 AND PrimaryCat = 1'
;
$type_clauses
[
'new'
][
'having_filter'
]
=
true
;
$type_clauses
[
'displayed'
][
'include'
]
=
''
;
$displayed
=
$this
->
Application
->
GetVar
(
$event
->
Prefix
.
'_displayed_ids'
);
if
(
$displayed
)
{
$id_field
=
$this
->
Application
->
getUnitOption
(
$event
->
Prefix
,
'IDField'
);
$type_clauses
[
'displayed'
][
'except'
]
=
'%1$s.'
.
$id_field
.
' NOT IN ('
.
$displayed
.
')'
;
}
else
{
$type_clauses
[
'displayed'
][
'except'
]
=
''
;
}
$type_clauses
[
'displayed'
][
'having_filter'
]
=
false
;
if
(
in_array
(
'search'
,
$types
)
||
in_array
(
'search'
,
$except_types
))
{
$event_mapping
=
Array
(
'simple'
=>
'OnSimpleSearch'
,
'subsearch'
=>
'OnSubSearch'
,
'advanced'
=>
'OnAdvancedSearch'
);
if
(
$this
->
Application
->
GetVar
(
'INPORTAL_ON'
)
&&
$this
->
Application
->
GetVar
(
'Action'
)
==
'm_simple_subsearch'
)
{
$type
=
'subsearch'
;
}
else
{
$type
=
$this
->
Application
->
GetVar
(
'search_type'
)
?
$this
->
Application
->
GetVar
(
'search_type'
)
:
'simple'
;
}
if
(
$keywords
=
$event
->
getEventParam
(
'keyword_string'
))
// processing keyword_string param of ListProducts tag
{
$this
->
Application
->
SetVar
(
'keywords'
,
$keywords
);
$type
=
'simple'
;
}
$search_event
=
$event_mapping
[
$type
];
$this
->
$search_event
(
$event
);
$search_table
=
TABLE_PREFIX
.
'ses_'
.
$this
->
Application
->
GetSID
().
'_'
.
TABLE_PREFIX
.
'Search'
;
$sql
=
'SHOW TABLES LIKE "'
.
$search_table
.
'"'
;
if
(
$this
->
Conn
->
Query
(
$sql
))
{
$search_res_ids
=
$this
->
Conn
->
GetCol
(
'SELECT ResourceId FROM '
.
$search_table
);
}
if
(
isset
(
$search_res_ids
)
&&
$search_res_ids
)
{
$type_clauses
[
'search'
][
'include'
]
=
'%1$s.ResourceId IN ('
.
implode
(
','
,
$search_res_ids
).
') AND PrimaryCat = 1'
;
$type_clauses
[
'search'
][
'except'
]
=
'%1$s.ResourceId NOT IN ('
.
implode
(
','
,
$search_res_ids
).
') AND PrimaryCat = 1'
;
}
else
{
$type_clauses
[
'search'
][
'include'
]
=
'0'
;
$type_clauses
[
'search'
][
'except'
]
=
'1'
;
}
$type_clauses
[
'search'
][
'having_filter'
]
=
false
;
}
if
(
in_array
(
'related'
,
$types
)
||
in_array
(
'related'
,
$except_types
))
{
$related_to
=
$event
->
getEventParam
(
'related_to'
);
if
(!
$related_to
)
{
$related_prefix
=
$event
->
Prefix
;
}
else
{
$sql
=
'SELECT Prefix
FROM '
.
TABLE_PREFIX
.
'ItemTypes
WHERE ItemName = '
.
$this
->
Conn
->
qstr
(
$related_to
);
$related_prefix
=
$this
->
Conn
->
GetOne
(
$sql
);
}
$rel_table
=
$this
->
Application
->
getUnitOption
(
'rel'
,
'TableName'
);
$item_type
=
$this
->
Application
->
getUnitOption
(
$event
->
Prefix
,
'ItemType'
);
$p_item
=&
$this
->
Application
->
recallObject
(
$related_prefix
.
'.current'
,
null
,
Array
(
'skip_autoload'
=>
true
));
$p_item
->
Load
(
$this
->
Application
->
GetVar
(
$related_prefix
.
'_id'
)
);
$p_resource_id
=
$p_item
->
GetDBField
(
'ResourceId'
);
$sql
=
'SELECT SourceId, TargetId FROM '
.
$rel_table
.
'
WHERE
(Enabled = 1)
AND (
(Type = 0 AND SourceId = '
.
$p_resource_id
.
' AND TargetType = '
.
$item_type
.
')
OR
(Type = 1
AND (
(SourceId = '
.
$p_resource_id
.
' AND TargetType = '
.
$item_type
.
')
OR
(TargetId = '
.
$p_resource_id
.
' AND SourceType = '
.
$item_type
.
')
)
)
)'
;
$related_ids_array
=
$this
->
Conn
->
Query
(
$sql
);
$related_ids
=
Array
();
foreach
(
$related_ids_array
as
$key
=>
$record
)
{
$related_ids
[]
=
$record
[
$record
[
'SourceId'
]
==
$p_resource_id
?
'TargetId'
:
'SourceId'
];
}
if
(
count
(
$related_ids
)
>
0
)
{
$type_clauses
[
'related'
][
'include'
]
=
'%1$s.ResourceId IN ('
.
implode
(
','
,
$related_ids
).
') AND PrimaryCat = 1'
;
$type_clauses
[
'related'
][
'except'
]
=
'%1$s.ResourceId NOT IN ('
.
implode
(
','
,
$related_ids
).
') AND PrimaryCat = 1'
;
}
else
{
$type_clauses
[
'related'
][
'include'
]
=
'0'
;
$type_clauses
[
'related'
][
'except'
]
=
'1'
;
}
$type_clauses
[
'related'
][
'having_filter'
]
=
false
;
}
if
(
in_array
(
'favorites'
,
$types
)
||
in_array
(
'favorites'
,
$except_types
))
{
$sql
=
'SELECT ResourceId
FROM '
.
$this
->
Application
->
getUnitOption
(
'fav'
,
'TableName'
).
'
WHERE PortalUserId = '
.
$this
->
Application
->
RecallVar
(
'user_id'
);
$favorite_ids
=
$this
->
Conn
->
GetCol
(
$sql
);
if
(
$favorite_ids
)
{
$type_clauses
[
'favorites'
][
'include'
]
=
'%1$s.ResourceId IN ('
.
implode
(
','
,
$favorite_ids
).
') AND PrimaryCat = 1'
;
$type_clauses
[
'favorites'
][
'except'
]
=
'%1$s.ResourceId NOT IN ('
.
implode
(
','
,
$favorite_ids
).
') AND PrimaryCat = 1'
;
}
else
{
$type_clauses
[
'favorites'
][
'include'
]
=
0
;
$type_clauses
[
'favorites'
][
'except'
]
=
1
;
}
$type_clauses
[
'favorites'
][
'having_filter'
]
=
false
;
}
return
$type_clauses
;
}
/**
* Returns SQL clause, that will help to select only data from specified category & it's children
*
* @param int $category_id
* @return string
*/
function
getCategoryLimitClause
(
$category_id
)
{
if
(!
$category_id
)
{
return
false
;
}
$sql
=
'SELECT TreeLeft, TreeRight
FROM '
.
TABLE_PREFIX
.
'Category
WHERE CategoryId = '
.
$category_id
;
$tree_indexes
=
$this
->
Conn
->
GetRow
(
$sql
);
return
TABLE_PREFIX
.
'Category.TreeLeft BETWEEN '
.
$tree_indexes
[
'TreeLeft'
].
' AND '
.
$tree_indexes
[
'TreeRight'
];
}
/**
* Apply filters to list
*
* @param kEvent $event
*/
function
SetCustomQuery
(&
$event
)
{
parent
::
SetCustomQuery
(
$event
);
$object
=&
$event
->
getObject
();
// add category filter if needed
if
(
$event
->
Special
!=
'showall'
)
{
if
(
$event
->
getEventParam
(
'parent_cat_id'
)
!==
false
)
{
$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'
))
{
$filter_clause
=
$this
->
getCategoryLimitClause
(
$parent_cat_id
);
if
(
$filter_clause
!==
false
)
{
$object
->
addFilter
(
'category_filter'
,
$filter_clause
);
}
$object
->
addFilter
(
'primary_filter'
,
'PrimaryCat = 1'
);
}
else
{
$object
->
addFilter
(
'category_filter'
,
TABLE_PREFIX
.
'CategoryItems.CategoryId = '
.
$parent_cat_id
);
}
}
}
else
{
$object
->
addFilter
(
'primary_filter'
,
'PrimaryCat = 1'
);
}
// add permission filter
if
(
$this
->
Application
->
RecallVar
(
'user_id'
)
==
-
1
)
{
// for "root" CATEGORY.VIEW permission is checked for items lists too
$view_perm
=
1
;
}
else
{
// for any real user itemlist view permission is checked instead of CATEGORY.VIEW
$count_helper
=&
$this
->
Application
->
recallObject
(
'CountHelper'
);
/* @var $count_helper kCountHelper */
list
(
$view_perm
,
$view_filter
)
=
$count_helper
->
GetPermissionClause
(
$event
->
Prefix
,
'perm'
);
$object
->
addFilter
(
'perm_filter2'
,
$view_filter
);
}
$object
->
addFilter
(
'perm_filter'
,
'perm.PermId = '
.
$view_perm
);
$types
=
$event
->
getEventParam
(
'types'
);
$this
->
applyItemStatusFilter
(
$object
,
$types
);
$except_types
=
$event
->
getEventParam
(
'except'
);
$type_clauses
=
$this
->
getTypeClauses
(
$event
);
// convert prepared type clauses into list filters
$includes_or_filter
=&
$this
->
Application
->
makeClass
(
'kMultipleFilter'
);
$includes_or_filter
->
setType
(
FLT_TYPE_OR
);
$excepts_and_filter
=&
$this
->
Application
->
makeClass
(
'kMultipleFilter'
);
$excepts_and_filter
->
setType
(
FLT_TYPE_AND
);
$includes_or_filter_h
=&
$this
->
Application
->
makeClass
(
'kMultipleFilter'
);
$includes_or_filter_h
->
setType
(
FLT_TYPE_OR
);
$excepts_and_filter_h
=&
$this
->
Application
->
makeClass
(
'kMultipleFilter'
);
$excepts_and_filter_h
->
setType
(
FLT_TYPE_AND
);
if
(
$types
)
{
$types_array
=
explode
(
','
,
$types
);
for
(
$i
=
0
;
$i
<
sizeof
(
$types_array
);
$i
++)
{
$type
=
trim
(
$types_array
[
$i
]);
if
(
isset
(
$type_clauses
[
$type
]))
{
if
(
$type_clauses
[
$type
][
'having_filter'
])
{
$includes_or_filter_h
->
removeFilter
(
'filter_'
.
$type
);
$includes_or_filter_h
->
addFilter
(
'filter_'
.
$type
,
$type_clauses
[
$type
][
'include'
]);
}
else
{
$includes_or_filter
->
removeFilter
(
'filter_'
.
$type
);
$includes_or_filter
->
addFilter
(
'filter_'
.
$type
,
$type_clauses
[
$type
][
'include'
]);
}
}
}
}
if
(
$except_types
)
{
$except_types_array
=
explode
(
','
,
$except_types
);
for
(
$i
=
0
;
$i
<
sizeof
(
$except_types_array
);
$i
++)
{
$type
=
trim
(
$except_types_array
[
$i
]);
if
(
isset
(
$type_clauses
[
$type
]))
{
if
(
$type_clauses
[
$type
][
'having_filter'
])
{
$excepts_and_filter_h
->
removeFilter
(
'filter_'
.
$type
);
$excepts_and_filter_h
->
addFilter
(
'filter_'
.
$type
,
$type_clauses
[
$type
][
'except'
]);
}
else
{
$excepts_and_filter
->
removeFilter
(
'filter_'
.
$type
);
$excepts_and_filter
->
addFilter
(
'filter_'
.
$type
,
$type_clauses
[
$type
][
'except'
]);
}
}
}
}
/*if ( !$this->Application->IsAdmin() ) {
$object->addFilter('expire_filter', '%1$s.Expire IS NULL OR %1$s.Expire > UNIX_TIMESTAMP()');
}*/
/*$list_type = $event->getEventParam('ListType');
switch($list_type)
{
case 'favorites':
$fav_table = $this->Application->getUnitOption('fav','TableName');
$user_id =& $this->Application->RecallVar('user_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->GetSID().'_'.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;
} */
$object
->
addFilter
(
'includes_filter'
,
$includes_or_filter
);
$object
->
addFilter
(
'excepts_filter'
,
$excepts_and_filter
);
$object
->
addFilter
(
'includes_filter_h'
,
$includes_or_filter_h
,
HAVING_FILTER
);
$object
->
addFilter
(
'excepts_filter_h'
,
$excepts_and_filter_h
,
HAVING_FILTER
);
}
/**
* Adds filter that filters out items with non-required statuses
*
* @param kDBList $object
* @param string $types
*/
function
applyItemStatusFilter
(&
$object
,
$types
)
{
// Link1 (before modifications) [Status = 1, OrgId = NULL], Link2 (after modifications) [Status = -2, OrgId = Link1_ID]
$pending_editing
=
$this
->
Application
->
getUnitOption
(
$object
->
Prefix
,
'UsePendingEditing'
);
if
(
!
$this
->
Application
->
IsAdmin
()
)
{
$types
=
explode
(
','
,
$types
);
if
(
in_array
(
'my_items'
,
$types
))
{
$allow_statuses
=
Array
(
STATUS_ACTIVE
,
STATUS_PENDING
,
STATUS_PENDING_EDITING
);
$object
->
addFilter
(
'status_filter'
,
'%1$s.Status IN ('
.
implode
(
','
,
$allow_statuses
).
')'
);
if
(
$pending_editing
)
{
$user_id
=
$this
->
Application
->
RecallVar
(
'user_id'
);
$this
->
applyPendingEditingFilter
(
$object
,
$user_id
);
}
}
else
{
$object
->
addFilter
(
'status_filter'
,
'%1$s.Status = 1'
);
if
(
$pending_editing
)
{
// if category item uses pending editing abilities, then in no cases show pending copies on front
$object
->
addFilter
(
'original_filter'
,
'%1$s.OrgId = 0 OR %1$s.OrgId IS NULL'
);
}
}
}
else
{
if
(
$pending_editing
)
{
$this
->
applyPendingEditingFilter
(
$object
);
}
}
}
/**
* Adds filter, that removes live items if they have pending editing copies
*
* @param kDBList $object
* @param int $user_id
*/
function
applyPendingEditingFilter
(&
$object
,
$user_id
=
null
)
{
$sql
=
'SELECT OrgId
FROM '
.
$object
->
TableName
.
'
WHERE Status = '
.
STATUS_PENDING_EDITING
.
' AND OrgId IS NOT NULL'
;
if
(
isset
(
$user_id
))
{
$owner_field
=
$this
->
getOwnerField
(
$object
->
Prefix
);
$sql
.=
' AND '
.
$owner_field
.
' = '
.
$user_id
;
}
$pending_ids
=
$this
->
Conn
->
GetCol
(
$sql
);
if
(
$pending_ids
)
{
$object
->
addFilter
(
'no_original_filter'
,
'%1$s.'
.
$object
->
IDField
.
' NOT IN ('
.
implode
(
','
,
$pending_ids
).
')'
);
}
}
/**
* Adds calculates fields for item statuses
*
* @param kCatDBItem $object
* @param kEvent $event
*/
function
prepareObject
(&
$object
,
&
$event
)
{
$this
->
prepareItemStatuses
(
$event
);
$object
->
addCalculatedField
(
'CachedNavbar'
,
'l'
.
$this
->
Application
->
GetVar
(
'm_lang'
).
'_CachedNavbar'
);
if
(
$event
->
Special
==
'export'
||
$event
->
Special
==
'import'
)
{
$export_helper
=&
$this
->
Application
->
recallObject
(
'CatItemExportHelper'
);
$export_helper
->
prepareExportColumns
(
$event
);
}
}
/**
* Creates calculated fields for all item statuses based on config settings
*
* @param kEvent $event
*/
function
prepareItemStatuses
(&
$event
)
{
$object
=&
$event
->
getObject
(
Array
(
'skip_autoload'
=>
true
)
);
$property_map
=
$this
->
Application
->
getUnitOption
(
$event
->
Prefix
,
'ItemPropertyMappings'
);
if
(!
$property_map
)
{
return
;
}
// new items
$object
->
addCalculatedField
(
'IsNew'
,
' IF(%1$s.NewItem = 2,
IF(%1$s.CreatedOn >= (UNIX_TIMESTAMP() - '
.
$this
->
Application
->
ConfigValue
(
$property_map
[
'NewDays'
]).
'*3600*24), 1, 0),
%1$s.NewItem
)'
);
// hot items (cache updated every hour)
$sql
=
'SELECT Data
FROM '
.
TABLE_PREFIX
.
'Cache
WHERE (VarName = "'
.
$property_map
[
'HotLimit'
].
'") AND (Cached >'
.(
adodb_mktime
()
-
3600
).
')'
;
$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.'
.
$property_map
[
'ClickField'
].
' >= '
.
$hot_limit
.
', 1, 0),
%1$s.HotItem
)'
);
// popular items
$object
->
addCalculatedField
(
'IsPop'
,
' IF(%1$s.PopItem = 2,
IF(%1$s.CachedVotesQty >= '
.
$this
->
Application
->
ConfigValue
(
$property_map
[
'MinPopVotes'
]).
' AND %1$s.CachedRating >= '
.
$this
->
Application
->
ConfigValue
(
$property_map
[
'MinPopRating'
]).
', 1, 0),
%1$s.PopItem)'
);
}
function
CalculateHotLimit
(&
$event
)
{
$property_map
=
$this
->
Application
->
getUnitOption
(
$event
->
Prefix
,
'ItemPropertyMappings'
);
if
(!
$property_map
)
{
return
;
}
$click_field
=
$property_map
[
'ClickField'
];
$last_hot
=
$this
->
Application
->
ConfigValue
(
$property_map
[
'MaxHotNumber'
])
-
1
;
$sql
=
'SELECT '
.
$click_field
.
' FROM '
.
$this
->
Application
->
getUnitOption
(
$event
->
Prefix
,
'TableName'
).
'
ORDER BY '
.
$click_field
.
' DESC
LIMIT '
.
$last_hot
.
', 1'
;
$res
=
$this
->
Conn
->
GetCol
(
$sql
);
$hot_limit
=
(
double
)
array_shift
(
$res
);
$this
->
Conn
->
Query
(
'REPLACE INTO '
.
TABLE_PREFIX
.
'Cache (VarName, Data, Cached) VALUES ("'
.
$property_map
[
'HotLimit'
].
'", "'
.
$hot_limit
.
'", '
.
adodb_mktime
().
')'
);
return
$hot_limit
;
return
0
;
}
/**
* Enter description here...
*
* @param kEvent $event
*/
function
OnBeforeItemUpdate
(&
$event
)
{
$property_map
=
$this
->
Application
->
getUnitOption
(
$event
->
Prefix
,
'ItemPropertyMappings'
);
if
(!
$property_map
)
{
return
;
}
$click_field
=
$property_map
[
'ClickField'
];
$object
=&
$event
->
getObject
();
if
(
$this
->
Application
->
IsAdmin
()
&&
(
$this
->
Application
->
GetVar
(
$click_field
.
'_original'
)
!==
false
)
&&
floor
(
$this
->
Application
->
GetVar
(
$click_field
.
'_original'
))
!=
$object
->
GetDBField
(
$click_field
)
)
{
$sql
=
'SELECT MAX('
.
$click_field
.
') FROM '
.
$this
->
Application
->
getUnitOption
(
$event
->
Prefix
,
'TableName'
).
'
WHERE FLOOR('
.
$click_field
.
') = '
.
$object
->
GetDBField
(
$click_field
);
$hits
=
(
$res
=
$this
->
Conn
->
GetOne
(
$sql
)
)
?
$res
+
0.000001
:
$object
->
GetDBField
(
$click_field
);
$object
->
SetDBField
(
$click_field
,
$hits
);
}
}
/**
* Load price from temp table if product mode is temp table
*
* @param kEvent $event
*/
function
OnAfterItemLoad
(&
$event
)
{
$special
=
substr
(
$event
->
Special
,
-
6
);
$object
=&
$event
->
getObject
();
/* @var $object kCatDBItem */
if
(
$special
==
'import'
||
$special
==
'export'
)
{
$image_data
=
$object
->
getPrimaryImageData
();
if
(
$image_data
)
{
$thumbnail_image
=
$image_data
[
$image_data
[
'LocalThumb'
]
?
'ThumbPath'
:
'ThumbUrl'
];
if
(
$image_data
[
'SameImages'
])
{
$full_image
=
''
;
}
else
{
$full_image
=
$image_data
[
$image_data
[
'LocalImage'
]
?
'LocalPath'
:
'Url'
];
}
$object
->
SetDBField
(
'ThumbnailImage'
,
$thumbnail_image
);
$object
->
SetDBField
(
'FullImage'
,
$full_image
);
$object
->
SetDBField
(
'ImageAlt'
,
$image_data
[
'AltName'
]);
}
}
// substituiting pending status value for pending editing
if
(
$object
->
HasField
(
'OrgId'
)
&&
$object
->
GetDBField
(
'OrgId'
)
>
0
&&
$object
->
GetDBField
(
'Status'
)
==
-
2
)
{
$options
=
$object
->
Fields
[
'Status'
][
'options'
];
foreach
(
$options
as
$key
=>
$val
)
{
if
(
$key
==
2
)
$key
=
-
2
;
$new_options
[
$key
]
=
$val
;
}
$object
->
Fields
[
'Status'
][
'options'
]
=
$new_options
;
}
// linking existing images for item with virtual fields
$image_helper
=&
$this
->
Application
->
recallObject
(
'ImageHelper'
);
/* @var $image_helper ImageHelper */
$image_helper
->
LoadItemImages
(
$object
);
// set item's additional categories to virtual field (used in editing)
$item_categories
=
$this
->
getItemCategories
(
$object
->
GetDBField
(
'ResourceId'
));
$object
->
SetDBField
(
'MoreCategories'
,
$item_categories
?
'|'
.
implode
(
'|'
,
$item_categories
).
'|'
:
''
);
}
function
OnAfterItemUpdate
(&
$event
)
{
$this
->
CalculateHotLimit
(
$event
);
if
(
substr
(
$event
->
Special
,
-
6
)
==
'import'
)
{
$this
->
setCustomExportColumns
(
$event
);
}
if
(!
$this
->
Application
->
IsAdmin
())
{
$image_helper
=&
$this
->
Application
->
recallObject
(
'ImageHelper'
);
/* @var $image_helper ImageHelper */
$object
=&
$event
->
getObject
();
/* @var $object kDBItem */
// process image upload in virtual fields
$image_helper
->
SaveItemImages
(
$object
);
if
(
$event
->
Special
!=
'-item'
)
{
// don't touch categories during cloning
$this
->
processAdditionalCategories
(
$object
,
'update'
);
}
}
}
/**
* sets values for import process
*
* @param kEvent $event
*/
function
OnAfterItemCreate
(&
$event
)
{
if
(
substr
(
$event
->
Special
,
-
6
)
==
'import'
)
{
$this
->
setCustomExportColumns
(
$event
);
}
if
(!
$this
->
Application
->
IsAdmin
())
{
$image_helper
=&
$this
->
Application
->
recallObject
(
'ImageHelper'
);
/* @var $image_helper ImageHelper */
$object
=&
$event
->
getObject
();
/* @var $object kDBItem */
// process image upload in virtual fields
$image_helper
->
SaveItemImages
(
$object
);
if
(
$event
->
Special
!=
'-item'
)
{
// don't touch categories during cloning
$this
->
processAdditionalCategories
(
$object
,
'create'
);
}
}
}
/**
* Make record to search log
*
* @param string $keywords
* @param int $search_type 0 - simple search, 1 - advanced search
*/
function
saveToSearchLog
(
$keywords
,
$search_type
=
0
)
{
$sql
=
'UPDATE '
.
TABLE_PREFIX
.
'SearchLog
SET Indices = Indices + 1
WHERE Keyword = '
.
$this
->
Conn
->
qstr
(
$keywords
).
' AND SearchType = '
.
$search_type
;
// 0 - simple search, 1 - advanced search
$this
->
Conn
->
Query
(
$sql
);
if
(
$this
->
Conn
->
getAffectedRows
()
==
0
)
{
$fields_hash
=
Array
(
'Keyword'
=>
$keywords
,
'Indices'
=>
1
,
'SearchType'
=>
$search_type
);
$this
->
Conn
->
doInsert
(
$fields_hash
,
TABLE_PREFIX
.
'SearchLog'
);
}
}
/**
* 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
->
GetSID
().
'_'
.
TABLE_PREFIX
.
'Search'
;
$keywords
=
unhtmlentities
(
trim
(
$this
->
Application
->
GetVar
(
'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
);
if
(!
$this
->
Application
->
GetVar
(
'INPORTAL_ON'
))
{
// don't save search log, because in-portal already saved it
$this
->
saveToSearchLog
(
$keywords
,
0
);
// 0 - simple search, 1 - advanced search
}
$keywords
=
strtr
(
$keywords
,
Array
(
'%'
=>
'
\\
%'
,
'_'
=>
'
\\
_'
));
$event
->
setPseudoClass
(
'_List'
);
$object
=&
$event
->
getObject
();
$this
->
Application
->
SetVar
(
$event
->
getPrefixSpecial
().
'_Page'
,
1
);
$lang
=
$this
->
Application
->
GetVar
(
'm_lang'
);
$items_table
=
$this
->
Application
->
getUnitOption
(
$event
->
Prefix
,
'TableName'
);
$module_name
=
$this
->
Application
->
findModule
(
'Var'
,
$event
->
Prefix
,
'Name'
);
$sql
=
' SELECT * FROM '
.
$this
->
Application
->
getUnitOption
(
'confs'
,
'TableName'
).
'
WHERE ModuleName="'
.
$module_name
.
'"
AND SimpleSearch=1'
;
$search_config
=
$this
->
Conn
->
Query
(
$sql
,
'FieldName'
);
$field_list
=
array_keys
(
$search_config
);
$join_clauses
=
Array
();
// field processing
$weight_sum
=
0
;
$alias_counter
=
0
;
$custom_fields
=
$this
->
Application
->
getUnitOption
(
$event
->
Prefix
,
'CustomFields'
);
if
(
$custom_fields
)
{
$custom_table
=
$this
->
Application
->
getUnitOption
(
$event
->
Prefix
.
'-cdata'
,
'TableName'
);
$join_clauses
[]
=
' LEFT JOIN '
.
$custom_table
.
' custom_data ON '
.
$items_table
.
'.ResourceId = custom_data.ResourceId'
;
}
// what field in search config becomes what field in sql (key - new field, value - old field (from searchconfig table))
$search_config_map
=
Array
();
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
(
getArrayValue
(
$options
,
'formatter'
)
==
'kMultiLanguage'
)
{
$field_list
[
$key
.
'_primary'
]
=
'l'
.
$this
->
Application
->
GetDefaultLanguageId
().
'_'
.
$field
;
$field_list
[
$key
]
=
'l'
.
$lang
.
'_'
.
$field
;
if
(!
isset
(
$search_config
[
$field
][
'ForeignField'
]))
{
$field_list
[
$key
.
'_primary'
]
=
$local_table
.
'.'
.
$field_list
[
$key
.
'_primary'
];
$search_config_map
[
$field_list
[
$key
.
'_primary'
]
]
=
$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_groups = $this->Application->RecallVar('UserGroups');
$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
{
$multi_lingual
=
false
;
if
(
$exploded
[
0
]
==
'MULTI'
)
{
$multi_lingual
=
true
;
$foreign_field
=
$exploded
[
1
];
}
$exploded
=
explode
(
'.'
,
$foreign_field
);
// format: table.field_name
$foreign_table
=
TABLE_PREFIX
.
$exploded
[
0
];
$alias_counter
++;
$alias
=
't'
.
$alias_counter
;
if
(
$multi_lingual
)
{
$field_list
[
$key
]
=
$alias
.
'.'
.
'l'
.
$lang
.
'_'
.
$exploded
[
1
];
$field_list
[
$key
.
'_primary'
]
=
'l'
.
$this
->
Application
->
GetDefaultLanguageId
().
'_'
.
$field
;
$search_config_map
[
$field_list
[
$key
]
]
=
$field
;
$search_config_map
[
$field_list
[
$key
.
'_primary'
]
]
=
$field
;
}
else
{
$field_list
[
$key
]
=
$alias
.
'.'
.
$exploded
[
1
];
$search_config_map
[
$field_list
[
$key
]
]
=
$field
;
}
$join_clause
=
str_replace
(
'{ForeignTable}'
,
$alias
,
$search_config
[
$field
][
'JoinClause'
]);
$join_clause
=
str_replace
(
'{LocalTable}'
,
$items_table
,
$join_clause
);
$join_clauses
[]
=
' LEFT JOIN '
.
$foreign_table
.
' '
.
$alias
.
'
ON '
.
$join_clause
;
}
}
else
{
// processing fields from local table
if
(
$search_config
[
$field
][
'CustomFieldId'
])
{
$local_table
=
'custom_data'
;
$field_list
[
$key
]
=
'l'
.
$lang
.
'_cust_'
.
array_search
(
$field_list
[
$key
],
$custom_fields
);
}
$field_list
[
$key
]
=
$local_table
.
'.'
.
$field_list
[
$key
];
$search_config_map
[
$field_list
[
$key
]
]
=
$field
;
}
}
// keyword string processing
$search_helper
=&
$this
->
Application
->
recallObject
(
'SearchHelper'
);
$where_clause
=
$search_helper
->
buildWhereClause
(
$keywords
,
$field_list
);
$search_scope
=
$this
->
Application
->
GetVar
(
'search_scope'
);
if
(
$search_scope
==
'category'
)
{
$category_id
=
$this
->
Application
->
GetVar
(
'm_cat_id'
);
$category_filter
=
$this
->
getCategoryLimitClause
(
$category_id
);
if
(
$category_filter
!==
false
)
{
$join_clauses
[]
=
' LEFT JOIN '
.
TABLE_PREFIX
.
'CategoryItems ON '
.
TABLE_PREFIX
.
'CategoryItems.ItemResourceId = '
.
$items_table
.
'.ResourceId'
;
$join_clauses
[]
=
' LEFT JOIN '
.
TABLE_PREFIX
.
'Category ON '
.
TABLE_PREFIX
.
'Category.CategoryId = '
.
TABLE_PREFIX
.
'CategoryItems.CategoryId'
;
$where_clause
=
'('
.
$this
->
getCategoryLimitClause
(
$category_id
).
') AND '
.
$where_clause
;
}
}
$where_clause
=
$where_clause
.
' AND '
.
$items_table
.
'.Status=1'
;
if
(
$this
->
Application
->
GetVar
(
'Action'
)
==
'm_simple_subsearch'
)
// subsearch, In-portal
{
if
(
$event
->
getEventParam
(
'ResultIds'
)
)
{
$where_clause
.=
' AND '
.
$items_table
.
'.ResourceId IN ('
.
implode
(
','
,
$event
->
specificParams
[
'ResultIds'
]).
')'
;
}
}
if
(
$event
->
MasterEvent
&&
$event
->
MasterEvent
->
Name
==
'OnListBuild'
)
// subsearch, k4
{
if
(
$event
->
MasterEvent
->
getEventParam
(
'ResultIds'
)
)
{
$where_clause
.=
' AND '
.
$items_table
.
'.ResourceId IN ('
.
implode
(
','
,
$event
->
MasterEvent
->
getEventParam
(
'ResultIds'
)).
')'
;
}
}
// making relevance clause
$positive_words
=
$search_helper
->
getPositiveKeywords
(
$keywords
);
$this
->
Application
->
StoreVar
(
'highlight_keywords'
,
serialize
(
$positive_words
));
$revelance_parts
=
Array
();
reset
(
$search_config
);
foreach
(
$field_list
as
$field
)
{
$config_elem
=
$search_config
[
$search_config_map
[
$field
]
];
$weight
=
$config_elem
[
'Priority'
];
$revelance_parts
[]
=
'IF('
.
$field
.
' LIKE "%'
.
implode
(
' '
,
$positive_words
).
'%", '
.
$weight_sum
.
', 0)'
;
foreach
(
$positive_words
as
$keyword
)
{
$revelance_parts
[]
=
'IF('
.
$field
.
' LIKE "%'
.
$keyword
.
'%", '
.
$weight
.
', 0)'
;
}
}
$conf_postfix
=
$this
->
Application
->
getUnitOption
(
$event
->
Prefix
,
'SearchConfigPostfix'
);
$rel_keywords
=
$this
->
Application
->
ConfigValue
(
'SearchRel_Keyword_'
.
$conf_postfix
)
/
100
;
$rel_pop
=
$this
->
Application
->
ConfigValue
(
'SearchRel_Pop_'
.
$conf_postfix
)
/
100
;
$rel_rating
=
$this
->
Application
->
ConfigValue
(
'SearchRel_Rating_'
.
$conf_postfix
)
/
100
;
$relevance_clause
=
'('
.
implode
(
' + '
,
$revelance_parts
).
') / '
.
$weight_sum
.
' * '
.
$rel_keywords
;
if
(
$rel_pop
&&
isset
(
$object
->
Fields
[
'Hits'
]))
{
$relevance_clause
.=
' + (Hits + 1) / (MAX(Hits) + 1) * '
.
$rel_pop
;
}
if
(
$rel_rating
&&
isset
(
$object
->
Fields
[
'CachedRating'
]))
{
$relevance_clause
.=
' + (CachedRating + 1) / (MAX(CachedRating) + 1) * '
.
$rel_rating
;
}
// building final search query
if
(!
$this
->
Application
->
GetVar
(
'do_not_drop_search_table'
)
&&
!
$this
->
Application
->
GetVar
(
'INPORTAL_ON'
))
{
$this
->
Conn
->
Query
(
'DROP TABLE IF EXISTS '
.
$search_table
);
// erase old search table if clean k4 event
$this
->
Application
->
SetVar
(
'do_not_drop_search_table'
,
true
);
}
$search_table_exists
=
$this
->
Conn
->
Query
(
'SHOW TABLES LIKE "'
.
$search_table
.
'"'
);
if
(
$search_table_exists
)
{
$select_intro
=
'INSERT INTO '
.
$search_table
.
' (Relevance, ItemId, ResourceId, ItemType, EdPick) '
;
}
else
{
$select_intro
=
'CREATE TABLE '
.
$search_table
.
' AS '
;
}
$edpick_clause
=
$this
->
Application
->
getUnitOption
(
$event
->
Prefix
.
'.EditorsPick'
,
'Fields'
)
?
$items_table
.
'.EditorsPick'
:
'0'
;
$sql
=
$select_intro
.
' SELECT '
.
$relevance_clause
.
' AS Relevance,
'
.
$items_table
.
'.'
.
$this
->
Application
->
getUnitOption
(
$event
->
Prefix
,
'IDField'
).
' AS ItemId,
'
.
$items_table
.
'.ResourceId,
'
.
$this
->
Application
->
getUnitOption
(
$event
->
Prefix
,
'ItemType'
).
' AS ItemType,
'
.
$edpick_clause
.
' AS EdPick
FROM '
.
$object
->
TableName
.
'
'
.
implode
(
' '
,
$join_clauses
).
'
WHERE '
.
$where_clause
.
'
GROUP BY '
.
$items_table
.
'.'
.
$this
->
Application
->
getUnitOption
(
$event
->
Prefix
,
'IDField'
);
$res
=
$this
->
Conn
->
Query
(
$sql
);
}
/**
* Enter description here...
*
* @param kEvent $event
*/
function
OnSubSearch
(&
$event
)
{
$search_table
=
TABLE_PREFIX
.
'ses_'
.
$this
->
Application
->
GetSID
().
'_'
.
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
);
$product_table
=
$this
->
Application
->
getUnitOption
(
'p'
,
'TableName'
);
$search_keywords
=
$this
->
Application
->
GetVar
(
'value'
);
// will not be changed
$keywords
=
$this
->
Application
->
GetVar
(
'value'
);
// will be changed down there
$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
;
$custom_fields
=
$this
->
Application
->
getUnitOption
(
$event
->
Prefix
,
'CustomFields'
);
if
(
$custom_fields
)
{
$custom_table
=
$this
->
Application
->
getUnitOption
(
$event
->
Prefix
.
'-cdata'
,
'TableName'
);
$join_clauses
[]
=
' LEFT JOIN '
.
$custom_table
.
' custom_data ON '
.
$product_table
.
'.ResourceId = custom_data.ResourceId'
;
}
$search_log
=
''
;
$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
(
getArrayValue
(
$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
=
$this
->
Application
->
RecallVar
(
'UserGroups'
);
$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
];
if
(
$record
[
'CustomFieldId'
])
{
$exploded
[
1
]
=
'l'
.
$lang
.
'_'
.
$exploded
[
1
];
}
$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
if
(
$record
[
'CustomFieldId'
])
{
$local_table
=
'custom_data'
;
$field_name
=
'l'
.
$lang
.
'_cust_'
.
array_search
(
$field_name
,
$custom_fields
);
}
$field_name
=
$local_table
.
'.'
.
$field_name
;
}
$condition
=
''
;
switch
(
$record
[
'FieldType'
])
{
case
'text'
:
$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
=
adodb_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
=
adodb_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
;
}
}
// create search log record
$search_log_data
=
Array
(
'search_config'
=>
$record
,
'verb'
=>
getArrayValue
(
$verbs
,
$field
),
'value'
=>
(
$record
[
'FieldType'
]
==
'range'
)
?
$search_keywords
[
$field
.
'_from'
].
'|'
.
$search_keywords
[
$field
.
'_to'
]
:
$search_keywords
[
$field
]);
$search_log
[]
=
$this
->
Application
->
Phrase
(
'la_Field'
).
' "'
.
$this
->
getHuman
(
'Field'
,
$search_log_data
).
'" '
.
$this
->
getHuman
(
'Verb'
,
$search_log_data
).
' '
.
$this
->
Application
->
Phrase
(
'la_Value'
).
' '
.
$this
->
getHuman
(
'Value'
,
$search_log_data
).
' '
.
$this
->
Application
->
Phrase
(
$glues
[
$field
]
==
1
?
'lu_And'
:
'lu_Or'
);
}
}
$search_log
=
implode
(
'<br />'
,
$search_log
);
$search_log
=
preg_replace
(
'/(.*) '
.
preg_quote
(
$this
->
Application
->
Phrase
(
'lu_and'
),
'/'
).
'|'
.
preg_quote
(
$this
->
Application
->
Phrase
(
'lu_or'
),
'/'
).
'$/is'
,
'
\\
1'
,
$search_log
);
$this
->
saveToSearchLog
(
$search_log
,
1
);
// advanced search
$this
->
Application
->
StoreVar
(
'highlight_keywords'
,
serialize
(
$highlight_keywords
));
// making relevance clause
if
(
$relevance_parts
)
{
$rel_keywords
=
$this
->
Application
->
ConfigValue
(
'SearchRel_Keyword_products'
)
/
100
;
$rel_pop
=
$this
->
Application
->
ConfigValue
(
'SearchRel_Pop_products'
)
/
100
;
$rel_rating
=
$this
->
Application
->
ConfigValue
(
'SearchRel_Rating_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
->
GetSID
().
'_'
.
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
);
}
function
getHuman
(
$type
,
$search_data
)
{
$type
=
ucfirst
(
strtolower
(
$type
));
extract
(
$search_data
);
switch
(
$type
)
{
case
'Field'
:
return
$this
->
Application
->
Phrase
(
$search_config
[
'DisplayName'
]);
break
;
case
'Verb'
:
return
$verb
?
$this
->
Application
->
Phrase
(
'lu_advsearch_'
.
$verb
)
:
''
;
break
;
case
'Value'
:
switch
(
$search_config
[
'FieldType'
])
{
case
'date'
:
$values
=
Array
(
0
=>
'lu_comm_Any'
,
'today'
=>
'lu_comm_Today'
,
'yesterday'
=>
'lu_comm_Yesterday'
,
'last_week'
=>
'lu_comm_LastWeek'
,
'last_month'
=>
'lu_comm_LastMonth'
,
'last_3_months'
=>
'lu_comm_Last3Months'
,
'last_6_months'
=>
'lu_comm_Last6Months'
,
'last_year'
=>
'lu_comm_LastYear'
);
$ret
=
$this
->
Application
->
Phrase
(
$values
[
$value
]);
break
;
case
'range'
:
$value
=
explode
(
'|'
,
$value
);
return
$this
->
Application
->
Phrase
(
'lu_comm_From'
).
' "'
.
$value
[
0
].
'" '
.
$this
->
Application
->
Phrase
(
'lu_comm_To'
).
' "'
.
$value
[
1
].
'"'
;
break
;
case
'boolean'
:
$values
=
Array
(
1
=>
'lu_comm_Yes'
,
0
=>
'lu_comm_No'
,
-
1
=>
'lu_comm_Both'
);
$ret
=
$this
->
Application
->
Phrase
(
$values
[
$value
]);
break
;
case
'text'
:
$ret
=
$value
;
break
;
}
return
'"'
.
$ret
.
'"'
;
break
;
}
}
/**
* Set's correct page for list
* based on data provided with event
*
* @param kEvent $event
* @access private
* @see OnListBuild
*/
function
SetPagination
(&
$event
)
{
// get PerPage (forced -> session -> config -> 10)
$per_page
=
$this
->
getPerPage
(
$event
);
$object
=&
$event
->
getObject
();
$object
->
SetPerPage
(
$per_page
);
$this
->
Application
->
StoreVarDefault
(
$event
->
getPrefixSpecial
().
'_Page'
,
1
);
$page
=
$this
->
Application
->
GetVar
(
$event
->
getPrefixSpecial
().
'_Page'
);
if
(!
$page
)
{
$page
=
$this
->
Application
->
GetVar
(
$event
->
getPrefixSpecial
(
true
).
'_Page'
);
}
if
(!
$page
)
{
if
(
$this
->
Application
->
RewriteURLs
()
)
{
$page
=
$this
->
Application
->
GetVar
(
$event
->
Prefix
.
'_Page'
);
if
(!
$page
)
{
$page
=
$this
->
Application
->
RecallVar
(
$event
->
Prefix
.
'_Page'
);
}
if
(
$page
)
$this
->
Application
->
StoreVar
(
$event
->
getPrefixSpecial
().
'_Page'
,
$page
);
}
else
{
$page
=
$this
->
Application
->
RecallVar
(
$event
->
getPrefixSpecial
().
'_Page'
);
}
}
else
{
$this
->
Application
->
StoreVar
(
$event
->
getPrefixSpecial
().
'_Page'
,
$page
);
}
if
(
!
$event
->
getEventParam
(
'skip_counting'
)
)
{
$pages
=
$object
->
GetTotalPages
();
if
(
$page
>
$pages
)
{
$this
->
Application
->
StoreVar
(
$event
->
getPrefixSpecial
().
'_Page'
,
1
);
$page
=
1
;
}
}
/*$cur_per_page = $per_page;
$per_page = $event->getEventParam('per_page');
if ($per_page == 'list_next') {
$cur_page = $page;
$object =& $this->Application->recallObject($event->Prefix);
$object->SetPerPage(1);
$cur_item_index = $object->CurrentIndex;
$page = ($cur_page-1) * $cur_per_page + $cur_item_index + 1;
$object->SetPerPage(1);
}*/
$object
->
SetPage
(
$page
);
}
/* === RELATED TO IMPORT/EXPORT: BEGIN === */
/**
* Shows export dialog
*
* @param kEvent $event
*/
function
OnExport
(&
$event
)
{
// use old fasion (in-portal) grid
$selector_name
=
$this
->
Application
->
getUnitOption
(
$event
->
Prefix
,
'CatalogSelectorName'
);
if
(
$selector_name
)
{
$selected_ids
=
$this
->
Application
->
GetVar
(
$selector_name
);
}
else
{
$selected_ids
=
$this
->
StoreSelectedIDs
(
$event
);
if
(
implode
(
','
,
$selected_ids
)
==
''
)
{
// K4 fix when no ids found bad selected ids array is formed
$selected_ids
=
false
;
}
}
$selected_cats_ids
=
$this
->
Application
->
GetVar
(
'export_categories'
);
$this
->
Application
->
StoreVar
(
$event
->
Prefix
.
'_export_ids'
,
$selected_ids
?
implode
(
','
,
$selected_ids
)
:
''
);
$this
->
Application
->
StoreVar
(
$event
->
Prefix
.
'_export_cats_ids'
,
$selected_cats_ids
);
$export_helper
=&
$this
->
Application
->
recallObject
(
'CatItemExportHelper'
);
$event
->
redirect
=
$export_helper
->
getModuleFolder
(
$event
).
'/export'
;
$redirect_params
=
Array
(
'm_opener'
=>
'd'
,
$this
->
Prefix
.
'.export_event'
=>
'OnNew'
,
'pass'
=>
'all,'
.
$this
->
Prefix
.
'.export'
);
$event
->
setRedirectParams
(
$redirect_params
);
}
/**
* Performs each export step & displays progress percent
*
* @param kEvent $event
*/
function
OnExportProgress
(&
$event
)
{
$export_object
=&
$this
->
Application
->
recallObject
(
'CatItemExportHelper'
);
/* @var $export_object kCatDBItemExportHelper */
$event
=
new
kEvent
(
$event
->
getPrefixSpecial
().
':OnDummy'
);
$action_method
=
'perform'
.
ucfirst
(
$event
->
Special
);
$field_values
=
$export_object
->
$action_method
(
$event
);
// finish code is done from JS now
if
(
$field_values
[
'start_from'
]
==
$field_values
[
'total_records'
])
{
if
(
$event
->
Special
==
'import'
)
{
$this
->
Application
->
StoreVar
(
'PermCache_UpdateRequired'
,
1
);
$this
->
Application
->
Redirect
(
'in-portal/categories/cache_updater'
,
Array
(
'm_opener'
=>
'r'
,
'pass'
=>
'm'
,
'continue'
=>
1
,
'no_amp'
=>
1
));
}
elseif
(
$event
->
Special
==
'export'
)
{
$template
=
$this
->
Application
->
getUnitOption
(
$event
->
Prefix
,
'ModuleFolder'
).
'/'
.
$event
->
Special
.
'_finish'
;
$this
->
Application
->
Redirect
(
$template
,
Array
(
'pass'
=>
'all'
));
}
}
$export_options
=
$export_object
->
loadOptions
(
$event
);
echo
$export_options
[
'start_from'
]
*
100
/
$export_options
[
'total_records'
];
$event
->
status
=
erSTOP
;
}
/**
* Returns specific to each item type columns only
*
* @param kEvent $event
* @return Array
*/
function
getCustomExportColumns
(&
$event
)
{
return
Array
(
'__VIRTUAL__ThumbnailImage'
=>
'ThumbnailImage'
,
'__VIRTUAL__FullImage'
=>
'FullImage'
,
'__VIRTUAL__ImageAlt'
=>
'ImageAlt'
);
}
/**
* Sets non standart virtual fields (e.g. to other tables)
*
* @param kEvent $event
*/
function
setCustomExportColumns
(&
$event
)
{
$this
->
restorePrimaryImage
(
$event
);
}
/**
* Create/Update primary image record in info found in imported data
*
* @param kEvent $event
*/
function
restorePrimaryImage
(&
$event
)
{
$object
=&
$event
->
getObject
();
$has_image_info
=
$object
->
GetDBField
(
'ImageAlt'
)
&&
(
$object
->
GetDBField
(
'ThumbnailImage'
)
||
$object
->
GetDBField
(
'FullImage'
));
if
(!
$has_image_info
)
{
return
false
;
}
$image_data
=
$object
->
getPrimaryImageData
();
$image
=&
$this
->
Application
->
recallObject
(
'img'
,
null
,
Array
(
'skip_autoload'
=>
true
));
if
(
$image_data
)
{
$image
->
Load
(
$image_data
[
'ImageId'
]);
}
else
{
$image
->
Clear
();
$image
->
SetDBField
(
'Name'
,
'main'
);
$image
->
SetDBField
(
'DefaultImg'
,
1
);
$image
->
SetDBField
(
'ResourceId'
,
$object
->
GetDBField
(
'ResourceId'
));
}
$image
->
SetDBField
(
'AltName'
,
$object
->
GetDBField
(
'ImageAlt'
));
if
(
$object
->
GetDBField
(
'ThumbnailImage'
))
{
$thumbnail_field
=
$this
->
isURL
(
$object
->
GetDBField
(
'ThumbnailImage'
)
)
?
'ThumbUrl'
:
'ThumbPath'
;
$image
->
SetDBField
(
$thumbnail_field
,
$object
->
GetDBField
(
'ThumbnailImage'
)
);
$image
->
SetDBField
(
'LocalThumb'
,
$thumbnail_field
==
'ThumbPath'
?
1
:
0
);
}
if
(!
$object
->
GetDBField
(
'FullImage'
))
{
$image
->
SetDBField
(
'SameImages'
,
1
);
}
else
{
$image
->
SetDBField
(
'SameImages'
,
0
);
$full_field
=
$this
->
isURL
(
$object
->
GetDBField
(
'FullImage'
)
)
?
'Url'
:
'LocalPath'
;
$image
->
SetDBField
(
$full_field
,
$object
->
GetDBField
(
'FullImage'
)
);
$image
->
SetDBField
(
'LocalImage'
,
$full_field
==
'LocalPath'
?
1
:
0
);
}
if
(
$image
->
isLoaded
())
{
$image
->
Update
();
}
else
{
$image
->
Create
();
}
}
function
isURL
(
$path
)
{
return
preg_match
(
'#(http|https)://(.*)#'
,
$path
);
}
/**
* Prepares item for import/export operations
*
* @param kEvent $event
*/
function
OnNew
(&
$event
)
{
parent
::
OnNew
(
$event
);
if
(
$event
->
Special
==
'import'
||
$event
->
Special
==
'export'
)
{
$export_helper
=&
$this
->
Application
->
recallObject
(
'CatItemExportHelper'
);
$export_helper
->
setRequiredFields
(
$event
);
$this
->
Application
->
StoreVar
(
'ImportCategory'
,
0
);
}
}
/**
* Process items selected in item_selector
*
* @param kEvent $event
*/
function
OnProcessSelected
(&
$event
)
{
$selected_ids
=
$this
->
Application
->
GetVar
(
'selected_ids'
);
$dst_field
=
$this
->
Application
->
RecallVar
(
'dst_field'
);
if
(
$dst_field
==
'ItemCategory'
)
{
// Item Edit -> Categories Tab -> New Categories
$object
=&
$event
->
getObject
();
$category_ids
=
explode
(
','
,
$selected_ids
[
'c'
]);
foreach
(
$category_ids
as
$category_id
)
{
$object
->
assignToCategory
(
$category_id
);
}
}
if
(
$dst_field
==
'ImportCategory'
)
{
// Tools -> Import -> Item Import -> Select Import Category
$this
->
Application
->
StoreVar
(
'ImportCategory'
,
$selected_ids
[
'c'
]);
// $this->Application->StoreVar($event->getPrefixSpecial().'_ForceNotValid', 1); // not to loose import/export values on form refresh
$this
->
Application
->
SetVar
(
$event
->
getPrefixSpecial
().
'_id'
,
0
);
$this
->
Application
->
SetVar
(
$event
->
getPrefixSpecial
().
'_event'
,
'OnExportBegin'
);
$passed
=
$this
->
Application
->
GetVar
(
'passed'
);
$this
->
Application
->
SetVar
(
'passed'
,
$passed
.
','
.
$event
->
getPrefixSpecial
());
$event
->
setEventParam
(
'pass_events'
,
true
);
}
$this
->
finalizePopup
(
$event
);
}
/**
* Saves Import/Export settings to session
*
* @param kEvent $event
*/
function
OnSaveSettings
(&
$event
)
{
$event
->
redirect
=
false
;
$items_info
=
$this
->
Application
->
GetVar
(
$event
->
getPrefixSpecial
(
true
)
);
if
(
$items_info
)
{
list
(
$id
,
$field_values
)
=
each
(
$items_info
);
$object
=&
$event
->
getObject
(
Array
(
'skip_autoload'
=>
true
)
);
$object
->
SetFieldsFromHash
(
$field_values
);
$field_values
[
'ImportFilename'
]
=
$object
->
GetDBField
(
'ImportFilename'
);
//if upload formatter has renamed the file during moving !!!
$field_values
[
'ImportSource'
]
=
2
;
$field_values
[
'ImportLocalFilename'
]
=
$object
->
GetDBField
(
'ImportFilename'
);
$items_info
[
$id
]
=
$field_values
;
$this
->
Application
->
StoreVar
(
$event
->
getPrefixSpecial
().
'_ItemsInfo'
,
serialize
(
$items_info
));
}
}
function
OnCancelAction
(&
$event
)
{
$event
->
redirect_params
=
Array
(
'pass'
=>
'all,'
.
$event
->
GetPrefixSpecial
());
$event
->
redirect
=
$this
->
Application
->
GetVar
(
'cancel_template'
);
}
/* === RELATED TO IMPORT/EXPORT: END === */
/**
* Stores item's owner login into separate field together with id
*
* @param kEvent $event
* @param string $id_field
* @param string $cached_field
*/
function
cacheItemOwner
(&
$event
,
$id_field
,
$cached_field
)
{
$object
=&
$event
->
getObject
();
$user_id
=
$object
->
GetDBField
(
$id_field
);
$options
=
$object
->
GetFieldOptions
(
$id_field
);
if
(
isset
(
$options
[
'options'
][
$user_id
]))
{
$object
->
SetDBField
(
$cached_field
,
$options
[
'options'
][
$user_id
]);
}
else
{
$id_field
=
$this
->
Application
->
getUnitOption
(
'u'
,
'IDField'
);
$table_name
=
$this
->
Application
->
getUnitOption
(
'u'
,
'TableName'
);
$sql
=
'SELECT Login
FROM '
.
$table_name
.
'
WHERE '
.
$id_field
.
' = '
.
$user_id
;
$object
->
SetDBField
(
$cached_field
,
$this
->
Conn
->
GetOne
(
$sql
));
}
}
/**
* Saves item beeing edited into temp table
*
* @param kEvent $event
*/
function
OnPreSave
(&
$event
)
{
parent
::
OnPreSave
(
$event
);
$use_pending_editing
=
$this
->
Application
->
getUnitOption
(
$event
->
Prefix
,
'UsePendingEditing'
);
if
(
$event
->
status
==
erSUCCESS
&&
$use_pending_editing
)
{
// decision: clone or not clone
$object
=&
$event
->
getObject
();
if
(
$object
->
GetID
()
==
0
||
$object
->
GetDBField
(
'OrgId'
)
>
0
)
{
// new items or cloned items shouldn't be cloned again
return
true
;
}
$perm_helper
=&
$this
->
Application
->
recallObject
(
'PermissionsHelper'
);
$owner_field
=
$this
->
getOwnerField
(
$event
->
Prefix
);
if
(
$perm_helper
->
ModifyCheckPermission
(
$object
->
GetDBField
(
$owner_field
),
$object
->
GetDBField
(
'CategoryId'
),
$event
->
Prefix
)
==
2
)
{
// 1. clone original item
$temp_handler
=&
$this
->
Application
->
recallObject
(
$event
->
getPrefixSpecial
().
'_TempHandler'
,
'kTempTablesHandler'
);
$cloned_ids
=
$temp_handler
->
CloneItems
(
$event
->
Prefix
,
$event
->
Special
,
Array
(
$object
->
GetID
()),
null
,
null
,
null
,
true
);
$ci_table
=
$this
->
Application
->
GetTempName
(
TABLE_PREFIX
.
'CategoryItems'
);
// 2. delete record from CategoryItems (about cloned item) that was automatically created during call of Create method of kCatDBItem
$sql
=
'SELECT ResourceId
FROM '
.
$object
->
TableName
.
'
WHERE '
.
$object
->
IDField
.
' = '
.
$cloned_ids
[
0
];
$clone_resource_id
=
$this
->
Conn
->
GetOne
(
$sql
);
$sql
=
'DELETE FROM '
.
$ci_table
.
'
WHERE ItemResourceId = '
.
$clone_resource_id
.
' AND PrimaryCat = 1'
;
$this
->
Conn
->
Query
(
$sql
);
// 3. copy main item categoryitems to cloned item
$sql
=
' INSERT INTO '
.
$ci_table
.
' (CategoryId, ItemResourceId, PrimaryCat, ItemPrefix, Filename)
SELECT CategoryId, '
.
$clone_resource_id
.
' AS ItemResourceId, PrimaryCat, ItemPrefix, Filename
FROM '
.
$ci_table
.
'
WHERE ItemResourceId = '
.
$object
->
GetDBField
(
'ResourceId'
);
$this
->
Conn
->
Query
(
$sql
);
// 4. put cloned id to OrgId field of item being cloned
$sql
=
'UPDATE '
.
$object
->
TableName
.
'
SET OrgId = '
.
$object
->
GetID
().
'
WHERE '
.
$object
->
IDField
.
' = '
.
$cloned_ids
[
0
];
$this
->
Conn
->
Query
(
$sql
);
// 5. substitute id of item being cloned with clone id
$this
->
Application
->
SetVar
(
$event
->
getPrefixSpecial
().
'_id'
,
$cloned_ids
[
0
]);
$selected_ids
=
$this
->
getSelectedIDs
(
$event
,
true
);
$selected_ids
[
array_search
(
$object
->
GetID
(),
$selected_ids
)
]
=
$cloned_ids
[
0
];
$this
->
StoreSelectedIDs
(
$event
,
$selected_ids
);
// 6. delete original item from temp table
$temp_handler
->
DeleteItems
(
$event
->
Prefix
,
$event
->
Special
,
Array
(
$object
->
GetID
()));
}
}
}
/**
* Sets default expiration based on module setting
*
* @param kEvent $event
*/
function
OnPreCreate
(&
$event
)
{
parent
::
OnPreCreate
(
$event
);
if
(
$event
->
status
==
erSUCCESS
)
{
$object
=&
$event
->
getObject
();
$owner_field
=
$this
->
getOwnerField
(
$event
->
Prefix
);
$object
->
SetDBField
(
$owner_field
,
$this
->
Application
->
RecallVar
(
'user_id'
));
}
}
/**
* Occures before original item of item in pending editing got deleted (for hooking only)
*
* @param kEvent $event
*/
function
OnBeforeDeleteOriginal
(&
$event
)
{
}
/**
* Occures before an item is cloneded
* Id of ORIGINAL item is passed as event' 'id' param
* Do not call object' Update method in this event, just set needed fields!
*
* @param kEvent $event
*/
function
OnBeforeClone
(&
$event
)
{
if
(
$this
->
Application
->
GetVar
(
'ResetCatBeforeClone'
))
{
$object
=&
$event
->
getObject
();
$object
->
SetDBField
(
'CategoryId'
,
null
);
}
}
/**
* Set status for new category item based on user permission in category
*
* @param kEvent $event
*/
function
OnBeforeItemCreate
(&
$event
)
{
if
(
$this
->
Application
->
IsAdmin
())
{
return
true
;
}
$use_pending_editing
=
$this
->
Application
->
getUnitOption
(
$event
->
Prefix
,
'UsePendingEditing'
);
if
(
$use_pending_editing
)
{
$object
=&
$event
->
getObject
();
/* @var $object kDBItem */
$perm_helper
=&
$this
->
Application
->
recallObject
(
'PermissionsHelper'
);
/* @var $perm_helper kPermissionsHelper */
$primary_category
=
$object
->
GetDBField
(
'CategoryId'
)
>
0
?
$object
->
GetDBField
(
'CategoryId'
)
:
$this
->
Application
->
GetVar
(
'm_cat_id'
);
$item_status
=
$perm_helper
->
AddCheckPermission
(
$primary_category
,
$event
->
Prefix
);
if
(
$item_status
==
STATUS_DISABLED
)
{
$event
->
status
=
erFAIL
;
return
false
;
}
else
{
$object
->
SetDBField
(
'Status'
,
$item_status
);
}
}
}
/**
* Creates category item & redirects to confirmation template (front-end only)
*
* @param kEvent $event
*/
function
OnCreate
(&
$event
)
{
parent
::
OnCreate
(
$event
);
$this
->
SetFrontRedirectTemplate
(
$event
,
'suggest'
);
}
/**
* Returns item's categories (allows to exclude primary category)
*
* @param int $resource_id
* @param bool $with_primary
* @return Array
*/
function
getItemCategories
(
$resource_id
,
$with_primary
=
false
)
{
$sql
=
'SELECT CategoryId
FROM '
.
TABLE_PREFIX
.
'CategoryItems
WHERE (ItemResourceId = '
.
$resource_id
.
')'
;
if
(!
$with_primary
)
{
$sql
.=
' AND (PrimaryCat = 0)'
;
}
return
$this
->
Conn
->
GetCol
(
$sql
);
}
/**
* Adds new and removes old additional categories from category item
*
* @param kCatDBItem $object
*/
function
processAdditionalCategories
(&
$object
,
$mode
)
{
$process_categories
=
$object
->
GetDBField
(
'MoreCategories'
);
if
(
$process_categories
===
''
)
{
// field was not in submit & have default value (when no categories submitted, then value is null)
return
;
}
if
(
$mode
==
'create'
)
{
// prevents first additional category to become primary
$object
->
assignPrimaryCategory
();
}
$process_categories
=
$process_categories
?
explode
(
'|'
,
substr
(
$process_categories
,
1
,
-
1
))
:
Array
();
$existing_categories
=
$this
->
getItemCategories
(
$object
->
GetDBField
(
'ResourceId'
));
$add_categories
=
array_diff
(
$process_categories
,
$existing_categories
);
foreach
(
$add_categories
as
$category_id
)
{
$object
->
assignToCategory
(
$category_id
);
}
$remove_categories
=
array_diff
(
$existing_categories
,
$process_categories
);
foreach
(
$remove_categories
as
$category_id
)
{
$object
->
removeFromCategory
(
$category_id
);
}
}
/**
* Creates category item & redirects to confirmation template (front-end only)
*
* @param kEvent $event
*/
function
OnUpdate
(&
$event
)
{
$use_pending
=
$this
->
Application
->
getUnitOption
(
$event
->
Prefix
,
'UsePendingEditing'
);
if
(
$this
->
Application
->
IsAdmin
()
||
!
$use_pending
)
{
parent
::
OnUpdate
(
$event
);
$this
->
SetFrontRedirectTemplate
(
$event
,
'modify'
);
return
;
}
$object
=&
$event
->
getObject
(
Array
(
'skip_autoload'
=>
true
));
/* @var $object kCatDBItem */
$items_info
=
$this
->
Application
->
GetVar
(
$event
->
getPrefixSpecial
(
true
));
if
(
$items_info
)
{
$perm_helper
=&
$this
->
Application
->
recallObject
(
'PermissionsHelper'
);
/* @var $perm_helper kPermissionsHelper */
$temp_handler
=&
$this
->
Application
->
recallObject
(
$event
->
getPrefixSpecial
().
'_TempHandler'
,
'kTempTablesHandler'
);
/* @var $temp_handler kTempTablesHandler */
$owner_field
=
$this
->
getOwnerField
(
$event
->
Prefix
);
$image_helper
=&
$this
->
Application
->
recallObject
(
'ImageHelper'
);
/* @var $image_helper ImageHelper */
foreach
(
$items_info
as
$id
=>
$field_values
)
{
$object
->
Load
(
$id
);
$edit_perm
=
$perm_helper
->
ModifyCheckPermission
(
$object
->
GetDBField
(
$owner_field
),
$object
->
GetDBField
(
'CategoryId'
),
$event
->
Prefix
);
if
(
$use_pending
&&
!
$object
->
GetDBField
(
'OrgId'
)
&&
(
$edit_perm
==
STATUS_PENDING
))
{
// pending editing enabled + not pending copy -> get/create pending copy & save changes to it
$original_id
=
$object
->
GetID
();
$original_resource_id
=
$object
->
GetDBField
(
'ResourceId'
);
$image_helper
->
PreserveItemImages
(
$field_values
);
$object
->
Load
(
$original_id
,
'OrgId'
);
if
(!
$object
->
isLoaded
())
{
// 1. user has no pending copy of live item -> clone live item
$cloned_ids
=
$temp_handler
->
CloneItems
(
$event
->
Prefix
,
$event
->
Special
,
Array
(
$original_id
),
null
,
null
,
null
,
true
);
$object
->
Load
(
$cloned_ids
[
0
]);
$object
->
SetFieldsFromHash
(
$field_values
);
// 1a. delete record from CategoryItems (about cloned item) that was automatically created during call of Create method of kCatDBItem
$ci_table
=
$this
->
Application
->
getUnitOption
(
'ci'
,
'TableName'
);
$sql
=
'DELETE FROM '
.
$ci_table
.
'
WHERE ItemResourceId = '
.
$object
->
GetDBField
(
'ResourceId'
).
' AND PrimaryCat = 1'
;
$this
->
Conn
->
Query
(
$sql
);
// 1b. copy main item categoryitems to cloned item
$sql
=
'INSERT INTO '
.
$ci_table
.
' (CategoryId, ItemResourceId, PrimaryCat, ItemPrefix, Filename)
SELECT CategoryId, '
.
$object
->
GetDBField
(
'ResourceId'
).
' AS ItemResourceId, PrimaryCat, ItemPrefix, Filename
FROM '
.
$ci_table
.
'
WHERE ItemResourceId = '
.
$original_resource_id
;
$this
->
Conn
->
Query
(
$sql
);
// 1c. put cloned id to OrgId field of item being cloned
$object
->
SetDBField
(
'Status'
,
STATUS_PENDING_EDITING
);
$object
->
SetDBField
(
'OrgId'
,
$original_id
);
}
else
{
// 2. user has pending copy of live item -> just update field values
$object
->
SetFieldsFromHash
(
$field_values
);
}
// update id in request (used for redirect in mod-rewrite mode)
$this
->
Application
->
SetVar
(
$event
->
getPrefixSpecial
().
'_id'
,
$object
->
GetID
());
}
else
{
// 3. already editing pending copy -> just update field values
$object
->
SetFieldsFromHash
(
$field_values
);
}
if
(
$object
->
Update
())
{
$event
->
status
=
erSUCCESS
;
}
else
{
$event
->
status
=
erFAIL
;
$event
->
redirect
=
false
;
break
;
}
}
}
$this
->
SetFrontRedirectTemplate
(
$event
,
'modify'
);
}
/**
* Sets next template to one required for front-end after adding/modifying item
*
* @param kEvent $event
* @param string $template_key - {suggest,modify}
*/
function
SetFrontRedirectTemplate
(&
$event
,
$template_key
)
{
if
(
$this
->
Application
->
IsAdmin
()
||
$event
->
status
!=
erSUCCESS
)
{
return
;
}
// prepare redirect template
$object
=&
$event
->
getObject
();
$is_active
=
(
$object
->
GetDBField
(
'Status'
)
==
STATUS_ACTIVE
);
$next_template
=
$is_active
?
'confirm_template'
:
'pending_confirm_template'
;
$event
->
redirect
=
$this
->
Application
->
GetVar
(
$template_key
.
'_'
.
$next_template
);
$event
->
SetRedirectParam
(
'opener'
,
's'
);
// send email events
$perm_prefix
=
$this
->
Application
->
getUnitOption
(
$event
->
Prefix
,
'PermItemPrefix'
);
switch
(
$event
->
Name
)
{
case
'OnCreate'
:
$event_suffix
=
$is_active
?
'ADD'
:
'ADD.PENDING'
;
$owner_field
=
$this
->
getOwnerField
(
$event
->
Prefix
);
$this
->
Application
->
EmailEventAdmin
(
$perm_prefix
.
'.'
.
$event_suffix
);
// there are no ADD.PENDING event for admin :(
$this
->
Application
->
EmailEventUser
(
$perm_prefix
.
'.'
.
$event_suffix
,
$object
->
GetDBField
(
$owner_field
));
break
;
case
'OnUpdate'
:
$event_suffix
=
$is_active
?
'MODIFY'
:
'MODIFY.PENDING'
;
$this
->
Application
->
EmailEventAdmin
(
$perm_prefix
.
'.'
.
$event_suffix
);
// there are no ADD.PENDING event for admin :(
$this
->
Application
->
EmailEventUser
(
$perm_prefix
.
'.'
.
$event_suffix
,
$object
->
GetDBField
(
'ModifiedById'
));
break
;
}
}
/**
* Apply same processing to each item beeing selected in grid
*
* @param kEvent $event
* @access private
*/
function
iterateItems
(&
$event
)
{
if
(
$event
->
Name
!=
'OnMassApprove'
&&
$event
->
Name
!=
'OnMassDecline'
)
{
return
parent
::
iterateItems
(
$event
);
}
if
(
$this
->
Application
->
CheckPermission
(
'SYSTEM_ACCESS.READONLY'
,
1
))
{
return
;
}
$object
=&
$event
->
getObject
(
Array
(
'skip_autoload'
=>
true
)
);
$ids
=
$this
->
StoreSelectedIDs
(
$event
);
if
(
$ids
)
{
foreach
(
$ids
as
$id
)
{
$object
->
Load
(
$id
);
switch
(
$event
->
Name
)
{
case
'OnMassApprove'
:
$ret
=
$object
->
ApproveChanges
();
break
;
case
'OnMassDecline'
:
$ret
=
$object
->
DeclineChanges
();
break
;
}
if
(!
$ret
)
{
$event
->
status
=
erFAIL
;
$event
->
redirect
=
false
;
break
;
}
}
}
$this
->
clearSelectedIDs
(
$event
);
}
/**
* Deletes items & preserves clean env
*
* @param kEvent $event
*/
function
OnDelete
(&
$event
)
{
parent
::
OnDelete
(
$event
);
if
(
$event
->
status
==
erSUCCESS
&&
!
$this
->
Application
->
IsAdmin
())
{
$event
->
SetRedirectParam
(
'pass'
,
'm'
);
$event
->
SetRedirectParam
(
'm_cat_id'
,
0
);
}
}
/**
* Checks, that currently loaded item is allowed for viewing (non permission-based)
*
* @param kEvent $event
* @return bool
*/
function
checkItemStatus
(&
$event
)
{
$object
=&
$event
->
getObject
();
if
(!
$object
->
isLoaded
())
{
return
true
;
}
$status
=
$object
->
GetDBField
(
'Status'
);
$user_id
=
$this
->
Application
->
RecallVar
(
'user_id'
);
$owner_field
=
$this
->
getOwnerField
(
$event
->
Prefix
);
if
((
$status
==
-
2
||
$status
==
STATUS_PENDING
)
&&
(
$object
->
GetDBField
(
$owner_field
)
==
$user_id
))
{
return
true
;
}
return
$status
==
STATUS_ACTIVE
;
}
/**
* Set sorting directly to session
*
* @param kEvent $event
*/
function
OnSetSortingDirect
(&
$event
)
{
$combined
=
$this
->
Application
->
GetVar
(
$event
->
Prefix
.
'_CombinedSorting'
);
if
(
$combined
)
{
list
(
$field
,
$dir
)
=
explode
(
'|'
,
$combined
);
$this
->
Application
->
StoreVar
(
$event
->
Prefix
.
'_Sort1'
,
$field
);
$this
->
Application
->
StoreVar
(
$event
->
Prefix
.
'_Sort1_Dir'
,
$dir
);
return
;
}
$field_pos
=
$this
->
Application
->
GetVar
(
$event
->
Prefix
.
'_SortPos'
);
$this
->
Application
->
LinkVar
(
$event
->
Prefix
.
'_Sort'
.
$field_pos
,
$event
->
Prefix
.
'_Sort'
.
$field_pos
);
$this
->
Application
->
LinkVar
(
$event
->
Prefix
.
'_Sort'
.
$field_pos
.
'_Dir'
,
$event
->
Prefix
.
'_Sort'
.
$field_pos
.
'_Dir'
);
}
/**
* Set's correct sorting for list
* based on data provided with event
*
* @param kEvent $event
* @access private
* @see OnListBuild
*/
function
SetSorting
(&
$event
)
{
if
(!
$this
->
Application
->
IsAdmin
())
{
$event
->
setEventParam
(
'same_special'
,
true
);
}
parent
::
SetSorting
(
$event
);
}
/**
* Returns current per-page setting for list
*
* @param kEvent $event
* @return int
*/
function
getPerPage
(&
$event
)
{
if
(!
$this
->
Application
->
IsAdmin
())
{
$event
->
setEventParam
(
'same_special'
,
true
);
}
return
parent
::
getPerPage
(
$event
);
}
function
getOwnerField
(
$prefix
)
{
$owner_field
=
$this
->
Application
->
getUnitOption
(
$prefix
,
'OwnerField'
);
if
(!
$owner_field
)
{
$owner_field
=
'CreatedById'
;
}
return
$owner_field
;
}
/**
* Creates virtual image fields for item
*
* @param kEvent $event
*/
function
OnAfterConfigRead
(&
$event
)
{
$image_helper
=&
$this
->
Application
->
recallObject
(
'ImageHelper'
);
/* @var $image_helper ImageHelper */
$image_helper
->
createItemImages
(
$event
->
Prefix
);
}
}
?>
Event Timeline
Log In to Comment