Index: admin_templates/discounts/coupon_clone_selector.tpl
===================================================================
--- admin_templates/discounts/coupon_clone_selector.tpl (revision 14103)
+++ admin_templates/discounts/coupon_clone_selector.tpl (working copy)
@@ -31,42 +31,10 @@
-
-
-
-
-
\ No newline at end of file
+
\ No newline at end of file
Index: admin_templates/discounts/coupons_list.tpl
===================================================================
--- admin_templates/discounts/coupons_list.tpl (revision 14103)
+++ admin_templates/discounts/coupons_list.tpl (working copy)
@@ -28,7 +28,7 @@
a_toolbar.AddButton( new ToolBarButton('clone', '',
function() {
//set_event('sc', 'OnSaveCreated');
- openSelector('coup', '', '', '500x260');
+ openSelector('coup', '', '', '500x260', 'OnPrepareClone');
} ) );
a_toolbar.AddButton( new ToolBarSeparator('sep1') );
Index: units/coupons/coupons_config.php
===================================================================
--- units/coupons/coupons_config.php (revision 14103)
+++ units/coupons/coupons_config.php (working copy)
@@ -134,6 +134,11 @@
'NumberOfUses' => Array ('type' => 'int', 'default' => 1),
),
+ 'VirtualFields' => Array (
+ 'CouponCount' => Array ('type' => 'int', 'min_value_inc' => 1, 'default' => 1),
+ 'DefaultExpiration' => Array ('type' => 'int', 'formatter' => 'kDateFormatter', 'default' => NULL),
+ ),
+
'Grids' => Array(
'Default' => Array(
'Icons' => Array(
Index: units/coupons/coupons_event_handler.php
===================================================================
--- units/coupons/coupons_event_handler.php (revision 14103)
+++ units/coupons/coupons_event_handler.php (working copy)
@@ -24,38 +24,101 @@
parent::mapPermissions();
$permissions = Array(
'OnItemBuild' => Array('self' => true),
+ 'OnApplyClone' => Array('self' => 'add'),
+ 'OnPrepareClone' => Array('self' => 'view'),
);
$this->permMapping = array_merge($this->permMapping, $permissions);
}
+ /**
+ * Prepares coupon cloning
+ *
+ * @param kEvent $event
+ */
+ function OnPrepareClone(&$event)
+ {
+ $this->StoreSelectedIDs($event);
+ $event->CallSubEvent('OnNew');
+
+ $object =& $event->getObject();
+ /* @var $object kDBItem */
+
+ $this->setCloningRequired($object);
+ $clone_count = $this->Application->RecallVar('CoupLastCloneCount');
+
+ if ( is_numeric($clone_count) && $clone_count > 0 ) {
+ $object->SetDBField('CouponCount', $clone_count);
+ }
+
+ $expire_days = $this->Application->ConfigValue('Comm_DefaultCouponDuration');
+ $default_expiration = strtotime('+' . $expire_days . ' days');
+
+ $object->SetDBField('DefaultExpiration_date', $default_expiration);
+ $object->SetDBField('DefaultExpiration_time', $default_expiration);
+ }
+
function OnApplyClone(&$event)
{
- $item = &$event->getObject();
- $clone_count = $this->Application->GetVar('clone_items_count');
- $table = $this->Application->getUnitOption($event->Prefix, 'TableName');
- if ($clone_count && $clone_count>0){
- $this->Application->StoreVar('CoupLastCloneCount', $clone_count);
- for ($i=0; $i<$clone_count; $i++) {
- $this->SetNewCode($item);
+ $object =& $event->getObject( Array ('skip_autoload' => true) );
+ /* @var $object kDBItem */
- $item->SetField('Expiration_date', $this->Application->GetVar('clone_exp_date'));
- $item->SetField('Expiration_time', $this->Application->GetVar('clone_exp_time'));
+ $this->setCloningRequired($object);
+
+ $items_info = $this->Application->GetVar( $event->getPrefixSpecial(true) );
+ list($id, $field_values) = each($items_info);
+ $object->SetFieldsFromHash($field_values);
+ $object->setID($id);
+
+ if ( !$object->Validate() ) {
+ $event->status = erFAIL;
+
+ return ;
+ }
+
+ $item =& $this->Application->recallObject($event->Prefix . '.-item', null, Array ('skip_autoload' => true));
+ /* @var $item kDBItem */
+
+ $original_coupon_ids = $this->getSelectedIDs($event, true);
+
+ $clone_count = $object->GetDBField('CouponCount');
+ $this->Application->StoreVar('CoupLastCloneCount', $clone_count);
+ $default_expiration = $object->GetDBField('DefaultExpiration');
+
+ foreach ($original_coupon_ids as $original_coupon_id) {
+ $item->Load($original_coupon_id);
+
+ for ($i = 0; $i < $clone_count; $i++) {
$item->NameCopy();
- $validated = $item->Create();
+ $this->SetNewCode($item);
+ $item->SetDBField('Expiration_date', $default_expiration);
+ $item->SetDBField('Expiration_time', $default_expiration);
+ // remove original coupon usage statistics
+ $item->SetDBField('LastUsedBy', NULL);
+ $item->SetDBField('LastUsedOn_date', NULL);
+ $item->SetDBField('LastUsedOn_time', NULL);
+
+ if ( !$item->Create() ) {
+ $event->status = erFAIL;
+
+ return ;
+ }
}
}
- if ($validated){
- $this->finalizePopup($event);
- }else{
- $event->redirect = false;
- }
+ $this->finalizePopup($event);
}
+ function setCloningRequired(&$object)
+ {
+ $this->RemoveRequiredFields($object);
+ $object->setRequired('CouponCount');
+ $object->setRequired('DefaultExpiration');
+ }
+
function SetNewCode(&$item)
{
do{
Index: units/coupons/coupons_tag_processor.php
===================================================================
--- units/coupons/coupons_tag_processor.php (revision 14103)
+++ units/coupons/coupons_tag_processor.php (working copy)
@@ -15,24 +15,4 @@
class CouponsTagProcessor extends kDBTagProcessor {
- function LastCloneCount($params){
-
- $clone_count = $this->Application->RecallVar('CoupLastCloneCount');
- if (!$clone_count){
- $clone_count = 1;
- }
- return $clone_count;
- }
-
- function DefaultExpDate($params){
- $object = &$this->Application->recallObject($this->getPrefixSpecial());
- $formatter =& $this->Application->makeClass('kDateFormatter');
- return $formatter->Format( adodb_mktime() + $this->Application->ConfigValue('Comm_DefaultCouponDuration') * 3600 * 24, 'Expiration_date', $object);
- }
-
- function DefaultExpTime($params){
- $object = &$this->Application->recallObject($this->getPrefixSpecial());
- $formatter =& $this->Application->makeClass('kDateFormatter');
- return $formatter->Format( adodb_mktime() + $this->Application->ConfigValue('Comm_DefaultCouponDuration') * 3600 * 24, 'Expiration_time', $object);
- }
}
\ No newline at end of file