Index: branches/5.1.x/core/kernel/utility/temp_handler.php =================================================================== diff -u -N -r13086 -r13161 --- branches/5.1.x/core/kernel/utility/temp_handler.php (.../temp_handler.php) (revision 13086) +++ branches/5.1.x/core/kernel/utility/temp_handler.php (.../temp_handler.php) (revision 13161) @@ -1,6 +1,6 @@ GetTempName($master['TableName']).' WHERE '.$master['IdField'].' = 0'; $this->Conn->Query($query); + $this->UpdateChangeLogForeignKeys($master, $live_ids[$an_id], $an_id); } } @@ -677,23 +678,33 @@ function UpdateChangeLogForeignKeys($master, $live_id, $temp_id) { - $main_prefix = $this->Application->GetTopmostPrefix($master['Prefix']); - $ses_var_name = $main_prefix.'_changes_'.$this->Application->GetTopmostWid($this->Prefix); + if ($live_id == $temp_id) { + return ; + } + + $prefix = $master['Prefix']; + $main_prefix = $this->Application->GetTopmostPrefix($prefix); + $ses_var_name = $main_prefix . '_changes_' . $this->Application->GetTopmostWid($this->Prefix); $changes = $this->Application->RecallVar($ses_var_name); - $changes = $changes ? unserialize($changes) : array(); + $changes = $changes ? unserialize($changes) : Array (); foreach ($changes as $key => $rec) { - if ($rec['Prefix'] == $master['Prefix']) { - if ($rec['ItemId'] == $temp_id) { - $changes[$key]['ItemId'] = $live_id; - } + if ($rec['Prefix'] == $prefix && $rec['ItemId'] == $temp_id) { + // main item change log record + $changes[$key]['ItemId'] = $live_id; } - if ($rec['MasterPrefix'] == $master['Prefix']) { - if ($rec['MasterId'] == $temp_id) { - $changes[$key]['MasterId'] = $live_id; - } + + if ($rec['MasterPrefix'] == $prefix && $rec['MasterId'] == $temp_id) { + // sub item change log record + $changes[$key]['MasterId'] = $live_id; } + + if (in_array($prefix, $rec['ParentPrefix']) && $rec['ParentId'][$prefix] == $temp_id) { + // parent item change log record + $changes[$key]['ParentId'][$prefix] = $live_id; + } } + $this->Application->StoreVar($ses_var_name, serialize($changes)); } Index: branches/5.1.x/core/units/logs/change_logs/change_logs_config.php =================================================================== diff -u -N -r13159 -r13161 --- branches/5.1.x/core/units/logs/change_logs/change_logs_config.php (.../change_logs_config.php) (revision 13159) +++ branches/5.1.x/core/units/logs/change_logs/change_logs_config.php (.../change_logs_config.php) (revision 13161) @@ -1,6 +1,6 @@ 'change-log', 'ItemClass' => Array('class' => 'kDBItem', 'file' => '', 'build_event' => 'OnItemBuild'), 'ListClass' => Array('class' => 'kDBList', 'file' => '', 'build_event' => 'OnListBuild'), - 'EventHandlerClass' => Array ('class' => 'kDBEventHandler', 'file' => '', 'build_event' => 'OnBuild'), + 'EventHandlerClass' => Array ('class' => 'ChangeLogEventHandler', 'file' => 'change_log_eh.php', 'build_event' => 'OnBuild'), 'TagProcessorClass' => Array ('class' => 'kDBTagProcessor', 'file' => '', 'build_event' => 'OnBuild'), 'RegisterClasses' => Array ( @@ -36,7 +36,7 @@ ), 'IDField' => 'ChangeLogId', - 'StatusField' => Array ('Status'), + //'StatusField' => Array ('Status'), 'TableName' => TABLE_PREFIX.'ChangeLogs', 'TitlePresets' => Array ( @@ -47,7 +47,7 @@ 'change_log_list' => Array ( 'prefixes' => Array('change-log_List'), 'format' => '!la_tab_ChangeLog!', - 'toolbar_buttons' => Array ('edit', 'view'), + 'toolbar_buttons' => Array ('edit', 'delete', 'view'), ), 'change_log_edit' => Array ( @@ -96,6 +96,8 @@ ), ), + 'ForceDontLogChanges' => true, + 'Fields' => Array ( 'ChangeLogId' => Array ('type' => 'int', 'not_null' => 1, 'default' => 0), 'PortalUserId' => Array ('type' => 'int', 'not_null' => 1, 'default' => 0), @@ -137,19 +139,15 @@ 'UserLogin' => Array ('title' => 'la_col_Username', 'filter_block' => 'grid_like_filter', 'width' => 100, ), 'UserFirstName' => Array ('title' => 'la_col_FirstName', 'filter_block' => 'grid_like_filter', 'width' => 120, ), 'UserLastName' => Array ('title' => 'la_col_LastName', 'filter_block' => 'grid_like_filter', 'width' => 120, ), - 'SessionLogId' => Array ('title' => 'la_col_SessionLogId', 'filter_block' => 'grid_like_filter', 'width' => 120, ), + 'SessionLogId' => Array ('title' => 'la_col_SessionLogId', 'filter_block' => 'grid_range_filter', 'width' => 120, ), 'Action' => Array ('title' => 'la_col_Action', 'filter_block' => 'grid_options_filter', 'width' => 120, ), 'OccuredOn' => Array ('title' => 'la_col_OccuredOn', 'filter_block' => 'grid_date_range_filter', 'width' => 150, ), 'MasterPrefix' => Array ('title' => 'la_col_MasterPrefix', 'filter_block' => 'grid_options_filter', 'width' => 120, ), 'MasterId' => Array ('title' => 'la_col_MasterId', 'filter_block' => 'grid_range_filter', 'width' => 90, ), 'Prefix' => Array ('title' => 'la_col_ItemPrefix', 'filter_block' => 'grid_options_filter', 'width' => 120, ), 'ItemId' => Array ('title' => 'la_col_ItemId', 'filter_block' => 'grid_range_filter', 'width' => 120, ), - 'Changes' => Array ('title' => 'la_col_Changes', 'data_block' => 'grid_changes_td', 'filter_block' => 'grid_like_filter', 'width' => 100, ), + 'Changes' => Array ('title' => 'la_col_Changes', 'data_block' => 'grid_changes_td', 'filter_block' => 'grid_like_filter', 'format' => 'auto_cut', 'width' => 225, ), ), ), ), - - 'ConfigMapping' => Array( - 'PerPage' => 'Perpage_ChangeLog', - ), ); \ No newline at end of file Index: branches/5.1.x/core/units/logs/change_logs/change_log_eh.php =================================================================== diff -u -N --- branches/5.1.x/core/units/logs/change_logs/change_log_eh.php (revision 0) +++ branches/5.1.x/core/units/logs/change_logs/change_log_eh.php (revision 13161) @@ -0,0 +1,22 @@ +getObject(); + /* @var $object kDBItem */ + + $sql = 'UPDATE ' . $this->Application->getUnitOption('session-log', 'TableName') . ' + SET AffectedItems = AffectedItems - 1 + WHERE SessionLogId = ' . $object->GetDBField('SessionLogId'); + $this->Conn->Query($sql); + } + } \ No newline at end of file Index: branches/5.1.x/core/units/logs/change_logs/changes_formatter.php =================================================================== diff -u -N -r13086 -r13161 --- branches/5.1.x/core/units/logs/change_logs/changes_formatter.php (.../changes_formatter.php) (revision 13086) +++ branches/5.1.x/core/units/logs/change_logs/changes_formatter.php (.../changes_formatter.php) (revision 13161) @@ -1,6 +1,6 @@ Application->Phrase('la_fld_'.$field); // remove translation link (added in debug mode) - $fld_translation = preg_replace('/(.*?)<\/a>/', '\\2', $fld_translation); + $fld_translation = preg_replace('/(.*?)<\/a>/', '\\2', $fld_translation); if ($fld_translation == '!'.strtoupper('la_fld_'.$field).'!') { // when phrase is not translated use field name as label $fld_translation = $field; } - if (is_array($data) && isset($data['old']) && isset($data['new'])) { - $res .= "$fld_translation: {$data['old']} => {$data['new']}
\n"; + if (is_array($data)) { + if ($format == 'auto_cut') { + $data = array_map(Array (&$this, 'cutValue'), $data); + } + + if (array_key_exists('old', $data) && array_key_exists('new', $data)) { + $res .= "$fld_translation: {$data['old']} => {$data['new']}
\n"; + } + else { + $res .= "$fld_translation: {$data['new']}
\n"; + } } else { - $res .= "$fld_translation: {$data['new']}
\n"; + if ($format == 'auto_cut') { + $data = $this->cutValue($data); + } + + $res .= "$fld_translation: {$data}
\n"; } + } return $res; } + function cutValue($data) + { + if (strlen($data) > 200) { + $data = substr($data, 0, 50) . ' ...'; + } + + return $data; + } } \ No newline at end of file Index: branches/5.1.x/core/kernel/constants.php =================================================================== diff -u -N -r13086 -r13161 --- branches/5.1.x/core/kernel/constants.php (.../constants.php) (revision 13086) +++ branches/5.1.x/core/kernel/constants.php (.../constants.php) (revision 13161) @@ -1,6 +1,6 @@ Update(); } + /** + * Don't allow to delete other user's messages + * + * @param kEvent $event + */ + function customProcessing(&$event, $type) + { + if ($event->Name == 'OnMassDelete' && $type == 'before') { + $ids = $event->getEventParam('ids'); + if ($ids) { + $id_field = $this->Application->getUnitOption($event->Prefix, 'IDField'); + $table_name = $this->Application->getUnitOption($event->Prefix, 'TableName'); + + $sql = 'SELECT ' . $id_field . ' + FROM ' . $table_name . ' + WHERE ' . $id_field . ' IN (' . implode(',', $ids) . ') AND Status <> ' . SESSION_LOG_ACTIVE; + $allowed_ids = $this->Conn->GetCol($sql); + + $event->setEventParam('ids', $allowed_ids); + } + } + } + + /** + * Delete changes, related to deleted session + * + * @param kEvent $event + */ + function OnAfterItemDelete(&$event) + { + parent::OnAfterItemDelete($event); + + $object =& $event->getObject(); + /* @var $object kDBItem */ + + $sql = 'SELECT ' . $this->Application->getUnitOption('change-log', 'IDField') . ' + FROM ' . $this->Application->getUnitOption('change-log', 'TableName') . ' + WHERE SessionLogId = ' . $object->GetID(); + $related_ids = $this->Conn->GetCol($sql); + + if ($related_ids) { + $temp_handler =& $this->Application->recallObject('change-log_TempHandler', 'kTempTablesHandler'); + /* @var $temp_handler kTempTablesHandler */ + + $temp_handler->DeleteItems('change-log', '', $related_ids); + } + } + } \ No newline at end of file Index: branches/5.1.x/core/kernel/db/dbitem.php =================================================================== diff -u -N -r13086 -r13161 --- branches/5.1.x/core/kernel/db/dbitem.php (.../dbitem.php) (revision 13086) +++ branches/5.1.x/core/kernel/db/dbitem.php (.../dbitem.php) (revision 13161) @@ -1,6 +1,6 @@ Conn->ChangeQuery($sql); $affected_rows = $this->Conn->getAffectedRows(); - $this->setModifiedFlag(clDELETE); // will change affected rows, so get it before this line - if ($affected_rows > 0) { + $this->setModifiedFlag(clDELETE); // will change affected rows, so get it before this line + // something was actually deleted $this->raiseEvent('OnAfterItemDelete'); } @@ -1063,18 +1063,31 @@ $this->Conn->Query('UPDATE '.$this->TableName.' SET `'.$this->IDField.'` = '.$new_id.' WHERE `'.$this->IDField.'` = '.$this->GetID()); - if ($this->ShouldLogChanges()) { + if ($this->ShouldLogChanges(true)) { // Updating TempId in ChangesLog, if changes are disabled - $ses_var_name = $this->Application->GetTopmostPrefix($this->Prefix).'_changes_'.$this->Application->GetTopmostWid($this->Prefix); + $ses_var_name = $this->Application->GetTopmostPrefix($this->Prefix) . '_changes_' . $this->Application->GetTopmostWid($this->Prefix); $changes = $this->Application->RecallVar($ses_var_name); $changes = $changes ? unserialize($changes) : Array (); + if ($changes) { foreach ($changes as $key => $rec) { if ($rec['Prefix'] == $this->Prefix && $rec['ItemId'] == $this->GetID()) { + // change log for record, that's ID was just updated -> update in change log record too $changes[$key]['ItemId'] = $new_id; } + + if ($rec['MasterPrefix'] == $this->Prefix && $rec['MasterId'] == $this->GetID()) { + // master item id was changed + $changes[$key]['MasterId'] = $new_id; + } + + if (in_array($this->Prefix, $rec['ParentPrefix']) && $rec['ParentId'][$this->Prefix] == $this->GetID()) { + // change log record of given item's sub item + $changes[$key]['ParentId'][$this->Prefix] = $new_id; + } } } + $this->Application->StoreVar($ses_var_name, serialize($changes)); } @@ -1090,26 +1103,33 @@ function setModifiedFlag($mode = null) { $main_prefix = $this->Application->GetTopmostPrefix($this->Prefix); - $this->Application->StoreVar($main_prefix.'_modified', '1', !$this->Application->isAdmin); + $this->Application->StoreVar($main_prefix . '_modified', '1', !$this->Application->isAdmin); - if ($this->ShouldLogChanges()) { + if ($this->ShouldLogChanges(true)) { $this->LogChanges($main_prefix, $mode); + if (!$this->IsTempTable()) { - $handler =& $this->Application->recallObject($this->Prefix.'_EventHandler'); - $ses_var_name = $main_prefix.'_changes_'.$this->Application->GetTopmostWid($this->Prefix); - $handler->SaveLoggedChanges($ses_var_name); + $handler =& $this->Application->recallObject($this->Prefix . '_EventHandler'); + /* @var $handler kDBEventHandler */ + + $ses_var_name = $main_prefix . '_changes_' . $this->Application->GetTopmostWid($this->Prefix); + $handler->SaveLoggedChanges($ses_var_name, $this->ShouldLogChanges()); } } } /** * Determines, that changes made to this item should be written to change log * + * @param bool $log_changes * @return bool */ - function ShouldLogChanges() + function ShouldLogChanges($log_changes = null) { - $log_changes = $this->Application->getUnitOption($this->Prefix, 'LogChanges') || $this->Application->ConfigValue('UseChangeLog'); + if (!isset($log_changes)) { + // specific logging mode no forced -> use global logging settings + $log_changes = $this->Application->getUnitOption($this->Prefix, 'LogChanges') || $this->Application->ConfigValue('UseChangeLog'); + } return $log_changes && !$this->Application->getUnitOption($this->Prefix, 'ForceDontLogChanges'); } @@ -1120,69 +1140,209 @@ return ; } - $ses_var_name = $main_prefix.'_changes_'.$this->Application->GetTopmostWid($this->Prefix); + $ses_var_name = $main_prefix . '_changes_' . $this->Application->GetTopmostWid($this->Prefix); $changes = $this->Application->RecallVar($ses_var_name); - $changes = $changes ? unserialize($changes) : array(); + $changes = $changes ? unserialize($changes) : Array (); - $general = array( + $fields_hash = Array ( 'Prefix' => $this->Prefix, 'ItemId' => $this->GetID(), 'OccuredOn' => adodb_mktime(), 'MasterPrefix' => $main_prefix, - 'MasterId' => $this->Prefix == $main_prefix ? $this->GetID() : $this->Application->GetVar($main_prefix.'_id'), // is that correct (Kostja)?? 'Action' => $mode, ); + + if ($this->Prefix == $main_prefix) { + // main item + $fields_hash['MasterId'] = $this->GetID(); + $fields_hash['ParentPrefix'] = Array ($main_prefix); + $fields_hash['ParentId'] = Array ($main_prefix => $this->GetID()); + } + else { + // sub item + // collect foreign key values (for serial reset) + $foreign_keys = $this->Application->getUnitOption($this->Prefix, 'ForeignKey'); + $fields_hash['ParentId'] = $fields_hash['ParentPrefix'] = Array (); + + if (is_array($foreign_keys)) { + foreach ($foreign_keys as $prefix => $field_name) { + $fields_hash['ParentPrefix'][] = $prefix; + $fields_hash['ParentId'][$prefix] = $this->getParentId($prefix); + } + } + else { + $fields_hash['ParentPrefix'] = Array ( $this->Application->getUnitOption($this->Prefix, 'ParentPrefix') ); + $fields_hash['ParentId'][ $fields_hash['ParentPrefix'][0] ] = $this->getParentId('auto'); + } + + // works only, when main item is present in url, when subitem is changed + $master_id = $this->Application->GetVar($main_prefix . '_id'); + + if ($master_id === false) { + // works in case of we are not editing topmost item, when subitem is created/updated/deleted + $master_id = $this->getParentId('auto', true); + } + + $fields_hash['MasterId'] = $master_id; + } + switch ($mode) { case clUPDATE: - $changes[] = array_merge($general, Array( - 'Changes' => serialize(array_merge($this->GetTitleField(), $this->GetChangedFields())), - )); + $to_save = array_merge($this->GetTitleField(), $this->GetChangedFields()); break; + case clCREATE: - $changes[] = array_merge($general, Array( - 'Changes' => serialize($this->GetTitleField()), - )); + $to_save = $this->GetTitleField(); break; + case clDELETE: - $changes[] = array_merge($general, Array( - 'Changes' => serialize(array_merge($this->GetTitleField(), $this->GetRealFields())), - )); + $to_save = array_merge($this->GetTitleField(), $this->GetRealFields()); + break; } + $fields_hash['Changes'] = serialize($to_save); + $changes[] = $fields_hash; + $this->Application->StoreVar($ses_var_name, serialize($changes)); } + /** + * Returns current item parent's ID + * + * @param bool $top_most return topmost parent, when used + * @return int + */ + function getParentId($parent_prefix, $top_most = false) + { + $current_id = $this->GetID(); + $current_prefix = $this->Prefix; + + if ($parent_prefix == 'auto') { + $parent_prefix = $this->Application->getUnitOption($current_prefix, 'ParentPrefix'); + } + + if (!$parent_prefix) { + return $current_id; + } + + do { + // field in this table + $foreign_key = $this->Application->getUnitOption($current_prefix, 'ForeignKey'); + $foreign_key = is_array($foreign_key) ? $foreign_key[$parent_prefix] : $foreign_key; + + // get foreign key value for $current_prefix + if ($current_prefix == $this->Prefix) { + $foreign_key_value = $this->GetDBField($foreign_key); + } + else { + $id_field = $this->Application->getUnitOption($current_prefix, 'IDField'); + $table_name = $this->Application->getUnitOption($current_prefix, 'TableName'); + + if ($this->IsTempTable()) { + $table_name = $this->Application->GetTempName($table_name, 'prefix:' . $current_prefix); + } + + $sql = 'SELECT ' . $foreign_key . ' + FROM ' . $table_name . ' + WHERE ' . $id_field . ' = ' . $current_id; + $foreign_key_value = $this->Conn->GetOne($sql); + } + + // field in parent table + $parent_table_key = $this->Application->getUnitOption($current_prefix, 'ParentTableKey'); + $parent_table_key = is_array($parent_table_key) ? $parent_table_key[$parent_prefix] : $parent_table_key; + + $parent_id_field = $this->Application->getUnitOption($parent_prefix, 'IDField'); + $parent_table_name = $this->Application->getUnitOption($parent_prefix, 'TableName'); + + if ($this->IsTempTable()) { + $parent_table_name = $this->Application->GetTempName($parent_table_name, 'prefix:' . $current_prefix); + } + + if ($parent_id_field == $parent_table_key) { + // sub-item is related by parent item idfield + $current_id = $foreign_key_value; + } + else { + // sub-item is related by other parent item field + $sql = 'SELECT ' . $parent_id_field . ' + FROM ' . $parent_table_name . ' + WHERE ' . $parent_table_key . ' = ' . $foreign_key_value; + $current_id = $this->Conn->GetOne($sql); + } + + $current_prefix = $parent_prefix; + + if (!$top_most) { + break; + } + } while ( $parent_prefix = $this->Application->getUnitOption($current_prefix, 'ParentPrefix') ); + + return $current_id; + } + + /** + * Returns title field (if any) + * + * @return Array + */ function GetTitleField() { $title_field = $this->Application->getUnitOption($this->Prefix, 'TitleField'); - if ($title_field && $this->GetField($title_field)) { - return Array($title_field => $this->GetField($title_field)); + + if ($title_field) { + $value = $this->GetField($title_field); + return $value ? Array ($title_field => $value) : Array (); } + + return Array (); } + /** + * Returns only fields, that are present in database (no virtual and no calculated fields) + * + * @return Array + */ function GetRealFields() { if (function_exists('array_diff_key')) { $db_fields = array_diff_key($this->FieldValues, $this->VirtualFields, $this->CalculatedFields); } else { - $db_fields = array(); + $db_fields = Array(); + foreach ($this->FieldValues as $key => $value) { - if (array_key_exists($key, $this->VirtualFields) || array_key_exists($key, $this->CalculatedFields)) continue; + if (array_key_exists($key, $this->VirtualFields) || array_key_exists($key, $this->CalculatedFields)) { + continue; + } + $db_fields[$key] = $value; } } + return $db_fields; } + /** + * Returns only changed database field + * + * @return Array + */ function GetChangedFields() { - $changes = array(); - + $changes = Array (); $diff = array_diff_assoc($this->GetRealFields(), $this->OriginalFieldValues); + foreach ($diff as $field => $new_value) { - $changes[$field] = array('old' => $this->GetOriginalField($field, true), 'new' => $this->GetField($field)); + $old_value = $this->GetOriginalField($field, true); + $new_value = $this->GetField($field); + + if ($old_value != $new_value) { + // "0.00" and "0.0000" are stored as strings and will differ. Double check to prevent that. + $changes[$field] = Array ('old' => $old_value, 'new' => $new_value); + } } + return $changes; } Index: branches/5.1.x/core/install/upgrades.sql =================================================================== diff -u -N -r13151 -r13161 --- branches/5.1.x/core/install/upgrades.sql (.../upgrades.sql) (revision 13151) +++ branches/5.1.x/core/install/upgrades.sql (.../upgrades.sql) (revision 13161) @@ -1650,3 +1650,5 @@ DELETE FROM Phrase WHERE Phrase LIKE 'la_event_%'; DELETE FROM PersistantSessionData WHERE VariableName = 'phrases_columns_.'; + +UPDATE Category SET FormId = NULL WHERE FormId = 0; Index: branches/5.1.x/core/units/permissions/permissions_event_handler.php =================================================================== diff -u -N -r13086 -r13161 --- branches/5.1.x/core/units/permissions/permissions_event_handler.php (.../permissions_event_handler.php) (revision 13086) +++ branches/5.1.x/core/units/permissions/permissions_event_handler.php (.../permissions_event_handler.php) (revision 13161) @@ -1,6 +1,6 @@ Application->GetVar('current_group_id'); $category_id = $this->Application->GetVar('c_id'); $permissions = $this->Application->GetVar($event->getPrefixSpecial(true)); + if (isset($permissions[$group_id])) { $permissions = $permissions[$group_id]; @@ -72,9 +73,9 @@ // not inherited if (($perm_id != 0) && ($perm_value != $permissions_helper->getPermissionValue($perm_name))) { // record was found in db & new value differs from old one => UPDATE - $update_sql[] = ' UPDATE '.$object->TableName.' - SET PermissionValue = '.$perm_value.' - WHERE (PermissionId = '.$perm_id.')'; + $update_sql[$perm_id] = ' UPDATE '.$object->TableName.' + SET PermissionValue = '.$perm_value.' + WHERE (PermissionId = '.$perm_id.')'; } if ($perm_id == 0) { @@ -177,8 +178,12 @@ function UpdatePermissions(&$event, $create_sql, $update_sql, $delete_ids) { $object =& $event->getObject(); + /* @var $object kDBItem */ if ($delete_ids) { + $action = clDELETE; + $object->Load($delete_ids[count($delete_ids) - 1]); + $delete_sql = ' DELETE FROM '.$object->TableName.' WHERE '.$object->IDField.' IN ('.implode(',', $delete_ids).')'; $this->Conn->Query($delete_sql); @@ -188,16 +193,27 @@ $create_sql = ' INSERT INTO '.$object->TableName.' VALUES '.implode(',', $create_sql); $this->Conn->Query($create_sql); + + $sql = 'SELECT MIN(' . $object->IDField . ') + FROM ' . $object->TableName; + $id = $this->Conn->GetOne($sql); + + $action = clCREATE; + $object->Load($id); } if ($update_sql) { - foreach ($update_sql as $sql) { + foreach ($update_sql as $id => $sql) { $this->Conn->Query($sql); } + + $action = clUPDATE; + $object->Load($id); + $object->SetDBField('PermissionValue', $object->GetDBField('PermissionValue') ? 0 : 1); } if ($delete_ids || $create_sql || $update_sql) { - $object->setModifiedFlag(); + $object->setModifiedFlag($action); if ($event->Name == 'OnCategorySavePermissions') { $this->Application->StoreVar('PermCache_UpdateRequired', 1); Index: branches/5.1.x/core/kernel/db/db_event_handler.php =================================================================== diff -u -N -r13159 -r13161 --- branches/5.1.x/core/kernel/db/db_event_handler.php (.../db_event_handler.php) (revision 13159) +++ branches/5.1.x/core/kernel/db/db_event_handler.php (.../db_event_handler.php) (revision 13161) @@ -1,6 +1,6 @@ getObject(); + /* @var $object kDBItem */ + $id = $this->getPassedID($event); if ($object->isLoaded() && !is_array($id) && ($object->GetID() == $id)) { @@ -1511,9 +1513,13 @@ { $this->setTempWindowID($event); $ids = $this->StoreSelectedIDs($event); + $var_name = $event->getPrefixSpecial().'_file_pending_actions'.$this->Application->GetVar('m_wid'); $this->Application->RemoveVar($var_name); + $changes_var_name = $this->Prefix . '_changes_' . $this->Application->GetTopmostWid($this->Prefix); + $this->Application->RemoveVar($changes_var_name); + $temp =& $this->Application->recallObject($event->getPrefixSpecial().'_TempHandler', 'kTempTablesHandler'); /* @var $temp kTempTablesHandler */ @@ -1563,10 +1569,12 @@ $this->StoreSelectedIDs($event, $live_ids); } - $this->SaveLoggedChanges($changes_var_name); + $object =& $event->getObject(); + /* @var $object kDBItem */ + + $this->SaveLoggedChanges($changes_var_name, $object->ShouldLogChanges()); } else { - $this->Application->RemoveVar($changes_var_name); $event->status = erFAIL; } @@ -1580,40 +1588,43 @@ } } - function SaveLoggedChanges($changes_var_name) + function SaveLoggedChanges($changes_var_name, $save = true) { - $ses_log_id = $this->Application->RecallVar('_SessionLogId_'); - if (!$ses_log_id) { - return ; - } - + // 1. get changes, that were made $changes = $this->Application->RecallVar($changes_var_name); $changes = $changes ? unserialize($changes) : Array (); + $this->Application->RemoveVar($changes_var_name); + if (!$changes) { + // no changes, skip processing return ; } + // save changes to database + $sesion_log_id = $this->Application->RecallVar('_SessionLogId_'); + + if (!$save || !$sesion_log_id) { + // saving changes to database disabled OR related session log missing + return ; + } + $add_fields = Array ( 'PortalUserId' => $this->Application->RecallVar('user_id'), - 'SessionLogId' => $ses_log_id, + 'SessionLogId' => $sesion_log_id, ); - $changelog_table = $this->Application->getUnitOption('change-log', 'TableName'); - $sessionlog_table = $this->Application->getUnitOption('session-log', 'TableName'); + $change_log_table = $this->Application->getUnitOption('change-log', 'TableName'); foreach ($changes as $rec) { - $this->Conn->doInsert(array_merge($rec, $add_fields), $changelog_table); + $this->Conn->doInsert(array_merge($rec, $add_fields), $change_log_table); } - $sql = 'UPDATE '.$sessionlog_table.' - SET AffectedItems = AffectedItems + '.count($changes).' - WHERE SessionLogId = '.$ses_log_id; + $sql = 'UPDATE ' . $this->Application->getUnitOption('session-log', 'TableName') . ' + SET AffectedItems = AffectedItems + ' . count($changes) . ' + WHERE SessionLogId = ' . $sesion_log_id; $this->Conn->Query($sql); - - $this->Application->RemoveVar($changes_var_name); } - /** * Cancels edit * Removes all temp tables and clears selected ids @@ -1628,6 +1639,9 @@ $this->clearSelectedIDs($event); $event->redirect_params = Array('opener'=>'u'); $this->Application->RemoveVar($event->getPrefixSpecial().'_modified'); + + $changes_var_name = $this->Prefix . '_changes_' . $this->Application->GetTopmostWid($this->Prefix); + $this->Application->RemoveVar($changes_var_name); } @@ -1782,6 +1796,9 @@ $this->Application->SetVar($event->getPrefixSpecial().'_id', 0); $this->Application->SetVar($event->getPrefixSpecial().'_PreCreate', 1); + $changes_var_name = $this->Prefix . '_changes_' . $this->Application->GetTopmostWid($this->Prefix); + $this->Application->RemoveVar($changes_var_name); + $event->redirect = false; } Index: branches/5.1.x/core/admin_templates/logs/change_logs/change_log_list.tpl =================================================================== diff -u -N -r13086 -r13161 --- branches/5.1.x/core/admin_templates/logs/change_logs/change_log_list.tpl (.../change_log_list.tpl) (revision 13086) +++ branches/5.1.x/core/admin_templates/logs/change_logs/change_log_list.tpl (.../change_log_list.tpl) (revision 13161) @@ -3,42 +3,59 @@ - - - - - + + +
- - - + - - -
- -
-
+ + +