Index: trunk/core/units/permissions/permissions_event_handler.php =================================================================== diff -u -N -r5431 -r6093 --- trunk/core/units/permissions/permissions_event_handler.php (.../permissions_event_handler.php) (revision 5431) +++ trunk/core/units/permissions/permissions_event_handler.php (.../permissions_event_handler.php) (revision 6093) @@ -14,7 +14,7 @@ ); $this->permMapping = array_merge($this->permMapping, $permissions); } - + /** * Save category permissions * @@ -27,31 +27,31 @@ $permissions = $this->Application->GetVar($event->getPrefixSpecial(true)); if (isset($permissions[$group_id])) { $permissions = $permissions[$group_id]; - + $object =& $event->getObject( Array('skip_autoload' => true) ); $permissions_helper =& $this->Application->recallObject('PermissionsHelper'); - $permissions_helper->LoadPermissions($group_id, $category_id, 0, true); - + $permissions_helper->LoadPermissions($group_id, $category_id, 0); + // format: ['inherited'] || ['value'] - + $delete_ids = Array(); $create_sql = Array(); $update_sql = Array(); $create_mask = '(%s,%s,'.$group_id.',%s,0,'.$category_id.')'; $new_id = (int)$this->Conn->GetOne('SELECT MIN('.$object->IDField.') FROM '.$object->TableName); if($new_id > 0) $new_id = 0; --$new_id; - + foreach ($permissions as $perm_name => $perm_data) { $inherited = $perm_data['inherited']; $perm_value = isset($perm_data['value']) ? $perm_data['value'] : false; $perm_id = $permissions_helper->getPermissionID($perm_name); - + if ($inherited && ($perm_id != 0)) { // permission become inherited (+ direct value was set before) => DELETE $delete_ids[] = $permissions_helper->getPermissionID($perm_name); } - + if (!$inherited) { // not inherited if (($perm_id != 0) && ($perm_value != $permissions_helper->getPermissionValue($perm_name))) { @@ -60,22 +60,22 @@ SET PermissionValue = '.$perm_value.' WHERE (PermissionId = '.$perm_id.')'; } - + if ($perm_id == 0) { // not found in db, but set directly => INSERT $create_sql[] = sprintf($create_mask, $new_id--, $this->Conn->qstr($perm_name), $this->Conn->qstr($perm_value)); } } // permission state was not changed in all other cases } - + $this->UpdatePermissions($event, $create_sql, $update_sql, $delete_ids); } - + $event->MasterEvent->SetRedirectParam('item_prefix', $this->Application->GetVar('item_prefix')); $event->MasterEvent->SetRedirectParam('group_id', $this->Application->GetVar('group_id')); } - + /** * Saves permissions while editing group * @@ -87,7 +87,7 @@ // no permission to save permissions return false; } - + $permissions = $this->Application->GetVar($event->getPrefixSpecial(true)); if (!$permissions) { return false; @@ -108,11 +108,11 @@ foreach ($permissions as $section_name => $section_permissions) { foreach ($section_permissions as $perm_name => $perm_value) { - + if (!$permissions_helper->isOldPermission($section_name, $perm_name)) { $perm_name = $section_name.'.'.$perm_name; } - + $db_perm_value = $permissions_helper->getPermissionValue($perm_name); if ($db_perm_value == 1 && $perm_value == 0) { // permission was disabled => delete it's record @@ -127,7 +127,7 @@ } $this->UpdatePermissions($event, $create_sql, Array(), $delete_ids); - + if ($this->Application->GetVar('advanced_save') == 1) { // advanced permission popup [save button] $this->finalizePopup($event); @@ -139,7 +139,7 @@ } } - + /** * Apply modification sqls to permissions table * @@ -151,7 +151,7 @@ function UpdatePermissions(&$event, $create_sql, $update_sql, $delete_ids) { $object =& $event->getObject(); - + if ($delete_ids) { $delete_sql = ' DELETE FROM '.$object->TableName.' WHERE '.$object->IDField.' IN ('.implode(',', $delete_ids).')'; @@ -163,7 +163,7 @@ VALUES '.implode(',', $create_sql); $this->Conn->Query($create_sql); } - + if ($update_sql) { foreach ($update_sql as $sql) { $this->Conn->Query($sql); @@ -172,12 +172,36 @@ if ($delete_ids || $create_sql || $update_sql) { $object->setModifiedFlag(); - + if ($event->Name == 'OnCategorySavePermissions') { $this->Application->StoreVar('PermCache_UpdateRequired', 1); } } } + + /** + * Don't delete permissions from live table in case of new category creation. + * Called as much times as permission count for categories set, so don't + * perform any sql queries here! + * + * @param kEvent $event + */ + function OnBeforeDeleteFromLive(&$event) + { + if ($event->Prefix == 'c-perm') { + // only when saving category permissions, not group permissions + $foreign_keys = $event->getEventParam('foreign_key'); + + if ((count($foreign_keys) == 1) && ($foreign_keys[0] == 0)) { + // parent item has zero id + $temp_object =& $this->Application->recallObject('c'); + if ($temp_object->isLoaded()) { + // category with id = 0 found in temp table + $event->status = erFAIL; + } + } + } + } } ?> \ No newline at end of file