Page Menu
Home
In-Portal Phabricator
Search
Configure Global Search
Log In
Files
F1373551
addresses_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
Sat, Jan 31, 6:58 PM
Size
11 KB
Mime Type
text/x-php
Expires
Mon, Feb 2, 6:58 PM (3 h, 54 m)
Engine
blob
Format
Raw Data
Handle
883515
Attached To
rMINC Modules.In-Commerce
addresses_event_handler.php
View Options
<?php
/**
* @version $Id: addresses_event_handler.php 15061 2012-01-17 14:50:00Z alex $
* @package In-Commerce
* @copyright Copyright (C) 1997 - 2009 Intechnic. All rights reserved.
* @license Commercial License
* This software is protected by copyright law and international treaties.
* Unauthorized reproduction or unlicensed usage of the code of this program,
* or any portion of it may result in severe civil and criminal penalties,
* and will be prosecuted to the maximum extent possible under the law
* See http://www.in-portal.org/commercial-license for copyright notices and details.
*/
defined
(
'FULL_PATH'
)
or
die
(
'restricted access!'
);
class
AddressesEventHandler
extends
kDBEventHandler
{
/**
* Allows to override standard permission mapping
*
* @return void
* @access protected
* @see kEventHandler::$permMapping
*/
protected
function
mapPermissions
()
{
parent
::
mapPermissions
();
$permissions
=
Array
(
// user can view any form on front-end
'OnItemBuild'
=>
Array
(
'subitem'
=>
true
),
'OnUpdate'
=>
Array
(
'subitem'
=>
true
),
'OnCreate'
=>
Array
(
'subitem'
=>
true
),
'OnDelete'
=>
Array
(
'subitem'
=>
true
),
);
$this
->
permMapping
=
array_merge
(
$this
->
permMapping
,
$permissions
);
}
/**
* Returns special of main item for linking with sub-item
*
* @param kEvent $event
* @return string
* @access protected
*/
protected
function
getMainSpecial
(
kEvent
&
$event
)
{
return
''
;
}
/**
* Apply any custom changes to list's sql query
*
* @param kEvent $event
* @return void
* @access protected
* @see kDBEventHandler::OnListBuild()
*/
protected
function
SetCustomQuery
(
kEvent
&
$event
)
{
parent
::
SetCustomQuery
(
$event
);
if
(
$this
->
Application
->
isAdminUser
)
{
return
;
}
$object
=&
$event
->
getObject
();
/* @var $object kDBList */
$user_id
=
$this
->
Application
->
RecallVar
(
'user_id'
);
$object
->
addFilter
(
'myitems_user'
,
'%1$s.PortalUserId = '
.
$user_id
);
}
/**
* Makes "use as $type" mark unique among user addresses
*
* @param kDBItem $object
* @param string $type
*/
protected
function
processLastUsed
(&
$object
,
$type
)
{
$is_last
=
$object
->
GetDBField
(
'LastUsedAs'
.
$type
);
if
(
$is_last
)
{
$fields_hash
=
Array
(
'LastUsedAs'
.
$type
=>
0
);
$this
->
Conn
->
doUpdate
(
$fields_hash
,
$object
->
TableName
,
'PortalUserId = '
.
$object
->
GetDBField
(
'PortalUserId'
));
}
}
/**
* Ensures, that user have only one "use as billing" / "use as shipping" address
*
* @param kEvent $event
* @return void
* @access protected
*/
protected
function
OnBeforeItemUpdate
(
kEvent
&
$event
)
{
parent
::
OnBeforeItemUpdate
(
$event
);
$object
=&
$event
->
getObject
();
/* @var $object kDBItem */
if
(
!
$object
->
isLoaded
()
||
!
$this
->
checkItemStatus
(
$event
)
)
{
// not trivially loaded object OR not current user address
$event
->
status
=
kEvent
::
erPERM_FAIL
;
return
;
}
$cs_helper
=&
$this
->
Application
->
recallObject
(
'CountryStatesHelper'
);
/* @var $cs_helper kCountryStatesHelper */
$cs_helper
->
CheckStateField
(
$event
,
'State'
,
'Country'
);
$cs_helper
->
PopulateStates
(
$event
,
'State'
,
'Country'
);
$this
->
processLastUsed
(
$object
,
'Shipping'
);
$this
->
processLastUsed
(
$object
,
'Billing'
);
}
/**
* Updates kDBItem
*
* @param kEvent $event
* @return void
* @access protected
*/
protected
function
OnUpdate
(
kEvent
&
$event
)
{
parent
::
OnUpdate
(
$event
);
$this
->
setNextTemplate
(
$event
);
}
/**
* Creates new kDBItem
*
* @param kEvent $event
* @return void
* @access protected
*/
protected
function
OnCreate
(
kEvent
&
$event
)
{
parent
::
OnCreate
(
$event
);
$this
->
setNextTemplate
(
$event
);
}
/**
* Sets next template to be shown after address is added/updated
*
* @param kEvent $event
* @return void
* @access protected
*/
protected
function
setNextTemplate
(
kEvent
&
$event
)
{
if
(
$this
->
Application
->
isAdminUser
)
{
return
;
}
$event
->
SetRedirectParam
(
'opener'
,
's'
);
$next_template
=
$this
->
Application
->
GetVar
(
'next_template'
);
if
(
$next_template
)
{
$event
->
redirect
=
$next_template
;
}
}
/**
* Fills states for object country
*
* @param kEvent $event
* @return void
* @access protected
*/
protected
function
OnAfterItemLoad
(
kEvent
&
$event
)
{
parent
::
OnAfterItemLoad
(
$event
);
$cs_helper
=&
$this
->
Application
->
recallObject
(
'CountryStatesHelper'
);
/* @var $cs_helper kCountryStatesHelper */
$cs_helper
->
PopulateStates
(
$event
,
'State'
,
'Country'
);
}
/**
* [HOOK] Update Users table when address marked as ProfileAddress is changed via addr prefix object
*
* @param kEvent $event
* @return bool
* @access protected
*/
protected
function
OnUpdateProfileAddress
(
kEvent
&
$event
)
{
$object
=&
$event
->
getObject
(
Array
(
'skip_autoload'
=>
true
));
/* @var $object kDBItem */
if
(
!
$this
->
Application
->
isAdmin
)
{
$address_id
=
$this
->
getOrderAddressId
();
if
(
!
$address_id
)
{
return
true
;
}
$object
->
Load
(
$address_id
);
}
if
(
!
$object
->
GetDBField
(
'IsProfileAddress'
)
)
{
return
true
;
}
$field_map
=
Array
(
'Company'
=>
1
,
'Phone'
=>
1
,
'Fax'
=>
1
,
'Email'
=>
1
,
'Address1'
=>
'Street'
,
'Address2'
=>
'Street2'
,
'City'
=>
1
,
'State'
=>
1
,
'Zip'
=>
1
,
'Country'
=>
1
,
);
$user
=&
$this
->
Application
->
recallObject
(
$this
->
Application
->
isAdmin
?
'u'
:
'u.current'
);
/* @var $user UsersItem */
$user
->
setName
(
$object
->
GetDBField
(
'To'
)
);
foreach
(
$field_map
as
$src_field
=>
$dst_field
)
{
if
(
$dst_field
==
1
)
{
$dst_field
=
$src_field
;
}
$user
->
SetDBField
(
$dst_field
,
$object
->
GetDBField
(
$src_field
));
}
return
$user
->
Update
();
}
/**
* Returns ID of address, that is selected in address dropdown on shipping/billing step of checkout
*
* @return int
* @access protected
*/
protected
function
getOrderAddressId
()
{
$ret
=
false
;
if
(
$this
->
Application
->
GetVar
(
'billing_address_id'
)
>
0
)
{
$ret
=
$this
->
Application
->
GetVar
(
'billing_address_id'
);
}
elseif
(
$this
->
Application
->
GetVar
(
'shipping_address_id'
)
>
0
)
{
$ret
=
$this
->
Application
->
GetVar
(
'shipping_address_id'
);
}
return
$ret
;
}
/**
* [HOOK] Create user profile address based on Users table data
*
* @param kEvent $event
* @return bool
* @access protected
*/
protected
function
OnUpdateUserProfile
(
kEvent
&
$event
)
{
$user
=&
$event
->
MasterEvent
->
getObject
();
/* @var $user UsersItem */
$load_keys
=
Array
(
'PortalUserId'
=>
$user
->
GetID
(),
'IsProfileAddress'
=>
1
);
$object
=&
$this
->
Application
->
recallObject
(
$event
->
Prefix
.
'.-item'
,
null
,
Array
(
'skip_autoload'
=>
true
));
/* @var $object kDBItem */
$object
->
Load
(
$load_keys
);
$field_map
=
Array
(
'PortalUserId'
=>
1
,
'Company'
=>
1
,
'Phone'
=>
1
,
'Fax'
=>
1
,
'Email'
=>
1
,
'Address1'
=>
'Street'
,
'Address2'
=>
'Street2'
,
'City'
=>
1
,
'State'
=>
1
,
'Zip'
=>
1
,
'Country'
=>
1
,
);
$full_name
=
trim
(
$user
->
GetDBField
(
'FirstName'
)
.
' '
.
$user
->
GetDBField
(
'LastName'
));
$object
->
SetDBField
(
'To'
,
$full_name
);
$object
->
SetDBField
(
'IsProfileAddress'
,
1
);
foreach
(
$field_map
as
$dst_field
=>
$src_field
)
{
if
(
$src_field
==
1
)
{
$src_field
=
$dst_field
;
}
$object
->
SetDBField
(
$dst_field
,
$user
->
GetDBField
(
$src_field
));
}
$sql
=
'SELECT SUM(IF(LastUsedAsBilling = 1, 1, 0 )) AS HasBilling, SUM(IF(LastUsedAsShipping = 1, 1, 0)) AS HasShipping
FROM '
.
$object
->
TableName
.
'
WHERE PortalUserId = '
.
$user
->
GetID
();
$address_status
=
$this
->
Conn
->
GetRow
(
$sql
);
if
(
!
$address_status
[
'HasBilling'
]
)
{
$object
->
SetDBField
(
'LastUsedAsBilling'
,
1
);
}
if
(
!
$address_status
[
'HasShipping'
]
)
{
$object
->
SetDBField
(
'LastUsedAsShipping'
,
1
);
}
return
$object
->
isLoaded
()
?
$object
->
Update
()
:
$object
->
Create
();
}
/**
* Checks if user trying to manipulate address that he Owns (exception for Admins)
* (non permission-based)
*
* @param kEvent $event
* @return bool
* @access protected
*/
protected
function
checkItemStatus
(
kEvent
&
$event
)
{
if
(
$this
->
Application
->
isAdminUser
)
{
return
true
;
}
if
(
!
$this
->
Application
->
LoggedIn
()
)
{
return
false
;
}
$object
=&
$event
->
getObject
();
/* @var $object kDBItem */
if
(
!
$object
->
isLoaded
()
)
{
return
true
;
}
return
$object
->
GetDBField
(
'PortalUserId'
)
==
$this
->
Application
->
RecallVar
(
'user_id'
);
}
/**
* Ensures, that user have only one "use as billing" / "use as shipping" address
* Disables Guest ability to create addresses
*
* @param kEvent $event
* @return void
* @access protected
*/
protected
function
OnBeforeItemCreate
(
kEvent
&
$event
)
{
parent
::
OnBeforeItemCreate
(
$event
);
if
(
!
$this
->
Application
->
LoggedIn
()
)
{
$event
->
status
=
kEvent
::
erPERM_FAIL
;
return
;
}
$object
=&
$event
->
getObject
();
/* @var $object kDBItem */
if
(
!
$this
->
Application
->
isAdmin
)
{
$object
->
SetDBField
(
'PortalUserId'
,
$this
->
Application
->
RecallVar
(
'user_id'
));
}
$cs_helper
=&
$this
->
Application
->
recallObject
(
'CountryStatesHelper'
);
/* @var $cs_helper kCountryStatesHelper */
$cs_helper
->
CheckStateField
(
$event
,
'State'
,
'Country'
);
$cs_helper
->
PopulateStates
(
$event
,
'State'
,
'Country'
);
$this
->
processLastUsed
(
$object
,
'Shipping'
);
$this
->
processLastUsed
(
$object
,
'Billing'
);
}
/**
* Occurs before deleting item, id of item being
* deleted is stored as 'id' event param
*
* @param kEvent $event
* @return void
* @access protected
*/
protected
function
OnBeforeItemDelete
(
kEvent
&
$event
)
{
parent
::
OnBeforeItemDelete
(
$event
);
$object
=&
$event
->
getObject
();
/* @var $object kDBItem */
if
(
!
$object
->
isLoaded
()
||
!
$this
->
checkItemStatus
(
$event
)
)
{
// not trivially loaded object OR not current user address
$event
->
status
=
kEvent
::
erPERM_FAIL
;
return
;
}
}
/**
* Sets default country for new addresses to Latvia
*
* @param kEvent $event
* @return void
* @access protected
*/
protected
function
OnAfterConfigRead
(
kEvent
&
$event
)
{
parent
::
OnAfterConfigRead
(
$event
);
$site_helper
=&
$this
->
Application
->
recallObject
(
'SiteHelper'
);
/* @var $site_helper SiteHelper */
$fields
=
$this
->
Application
->
getUnitOption
(
$event
->
Prefix
,
'Fields'
);
$fields
[
'Country'
][
'default'
]
=
$site_helper
->
getDefaultCountry
(
'Shipping'
);
$this
->
Application
->
setUnitOption
(
$event
->
Prefix
,
'Fields'
,
$fields
);
}
/**
* [HOOK] Creates user addresses editing tab
*
* @param kEvent $event
*/
function
OnModifyUsersConfig
(&
$event
)
{
$title_presets
=
$this
->
Application
->
getUnitOption
(
$event
->
MasterEvent
->
Prefix
,
'TitlePresets'
);
$title_presets
[
'user_edit_addresses'
]
=
Array
(
'prefixes'
=>
Array
(
'u'
,
$event
->
Prefix
.
'_List'
),
'format'
=>
"#u_status# '#u_titlefield#' - !la_title_Addresses! (#"
.
$event
->
Prefix
.
"_recordcount#)"
);
$title_presets
[
'user_address_edit'
]
=
Array
(
'prefixes'
=>
Array
(
'u'
,
$event
->
Prefix
),
'new_status_labels'
=>
Array
(
$event
->
Prefix
=>
'!la_title_AddingAddress!'
),
'edit_status_labels'
=>
Array
(
$event
->
Prefix
=>
'!la_title_EditingAddress!'
),
'new_titlefield'
=>
Array
(
$event
->
Prefix
=>
'!la_title_NewAddress!'
),
'format'
=>
"#u_status# '#u_titlefield#' - #{$event->Prefix}_status#"
);
$this
->
Application
->
setUnitOption
(
$event
->
MasterEvent
->
Prefix
,
'TitlePresets'
,
$title_presets
);
$edit_tab_presets
=
$this
->
Application
->
getUnitOption
(
$event
->
MasterEvent
->
Prefix
,
'EditTabPresets'
);
$edit_tab_presets
[
'Default'
][]
=
Array
(
'title'
=>
'la_tab_Addresses'
,
't'
=>
'in-commerce/users/user_edit_addresses'
,
'priority'
=>
6
);
$this
->
Application
->
setUnitOption
(
$event
->
MasterEvent
->
Prefix
,
'EditTabPresets'
,
$edit_tab_presets
);
}
}
Event Timeline
Log In to Comment