Index: trunk/core/units/general/cat_event_handler.php =================================================================== diff -u -N -r8420 -r8422 --- trunk/core/units/general/cat_event_handler.php (.../cat_event_handler.php) (revision 8420) +++ trunk/core/units/general/cat_event_handler.php (.../cat_event_handler.php) (revision 8422) @@ -1822,7 +1822,71 @@ */ function OnUpdate(&$event) { - parent::OnUpdate($event); + $use_pending_editing = $this->Application->getUnitOption($event->Prefix, 'UsePendingEditing'); + if ($this->Application->IsAdmin() || !$use_pending_editing) { + parent::OnUpdate($event); + 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 */ + + foreach ($items_info as $id => $field_values) { + $object->Load($id); + $object->SetFieldsFromHash($field_values); + + if ($use_pending_editing && !$object->GetDBField('OrgId')) { + // PENDING EDITING enabled & not previously edited -> clone item & change cloned item instead + if ($perm_helper->ModifyCheckPermission($object->GetDBField('CreatedById'), $object->GetDBField('CategoryId'), $event->Prefix) == 2) { + // 1. clone original item + $cloned_ids = $temp_handler->CloneItems($event->Prefix, $event->Special, Array($object->GetID()), null, null, null, true); + + $original_id = $object->GetID(); + $original_resource_id = $object->GetDBField('ResourceId'); + $ci_table = $this->Application->getUnitOption('ci', 'TableName'); + + // 2. apply all operations to cloned item + $object->Load($cloned_ids[0]); + $object->SetFieldsFromHash($field_values); + + // 2. delete record from CategoryItems (about cloned item) that was automatically created during call of Create method of kCatDBItem + $sql = 'DELETE FROM '.$ci_table.' + WHERE ItemResourceId = '.$object->GetDBField('ResourceId').' 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, '.$object->GetDBField('ResourceId').' AS ItemResourceId, PrimaryCat, ItemPrefix, Filename + FROM '.$ci_table.' + WHERE ItemResourceId = '.$original_resource_id; + $this->Conn->Query($sql); + + // 4. put cloned id to OrgId field of item being cloned + $object->SetDBField('Status', STATUS_PENDING_EDITING); + $object->SetDBField('OrgId', $original_id); + $this->Application->SetVar($event->getPrefixSpecial().'_id', $object->GetID()); + } + } + + if ($object->Update()) { + $event->status = erSUCCESS; + } + else { + $event->status = erFAIL; + $event->redirect = false; + break; + } + } + } + $this->SetFrontRedirectTemplate($event, 'modify'); } @@ -1838,11 +1902,29 @@ return ; } - $event->SetRedirectParam('opener', 's'); - + // prepare redirect template $object =& $event->getObject(); - $next_template = $object->GetDBField('Status') == STATUS_ACTIVE ? 'confirm_template' : 'pending_confirm_template'; + $is_active = ($object->GetDBField('Status') == STATUS_ACTIVE); + + $next_template = ($object->GetDBField('Status') == STATUS_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'; + $this->Application->EmailEventAdmin($perm_prefix.'.'.$event_suffix); // there are no ADD.PENDING event for admin :( + $this->Application->EmailEventUser($perm_prefix.'.'.$event_suffix, $object->GetDBField('CreatedById')); + 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; + } } /**