Index: trunk/kernel/units/general/helpers/permissions_helper.php =================================================================== diff -u -N -r5218 -r5325 --- trunk/kernel/units/general/helpers/permissions_helper.php (.../permissions_helper.php) (revision 5218) +++ trunk/kernel/units/general/helpers/permissions_helper.php (.../permissions_helper.php) (revision 5325) @@ -9,15 +9,15 @@ */ var $Permissions = Array(); - function LoadPermissions($prefix) + function LoadPermissions($group_id, $cat_id, $type = 1, $temp_mode = false) { - $object =& $this->Application->recallObject($prefix.'-perm', null, Array('skip_autoload' => true)); - - $foreign_key = $this->Application->getUnitOption($prefix.'-perm', 'ForeignKey'); - $foreign_value = $this->Application->GetVar($prefix.'_id'); + $perm_table = $this->Application->getUnitOption('perm', 'TableName'); + if ($temp_mode) { + $perm_table = $this->Application->GetTempName($perm_table); + } $sql = 'SELECT * - FROM '.$object->TableName.' - WHERE '.$foreign_key.' = '.$foreign_value; + FROM '.$perm_table.' + WHERE (GroupId = '.$group_id.') AND (CatId = '.$cat_id.') AND (Type = '.$type.')'; $permissions = $this->Conn->Query($sql, 'Permission'); $this->Permissions = Array(); @@ -30,12 +30,12 @@ function getPermissionValue($perm_name) { - return getArrayValue($this->Permissions, $perm_name) ? $this->Permissions[$perm_name]['value'] : 0; + return isset($this->Permissions[$perm_name]) ? $this->Permissions[$perm_name]['value'] : 0; } function getPermissionID($perm_name) { - return getArrayValue($this->Permissions, $perm_name) ? $this->Permissions[$perm_name]['id'] : 0; + return isset($this->Permissions[$perm_name]) ? $this->Permissions[$perm_name]['id'] : 0; } /** Index: trunk/kernel/units/permissions/permissions_tag_processor.php =================================================================== diff -u -N -r5322 -r5325 --- trunk/kernel/units/permissions/permissions_tag_processor.php (.../permissions_tag_processor.php) (revision 5322) +++ trunk/kernel/units/permissions/permissions_tag_processor.php (.../permissions_tag_processor.php) (revision 5325) @@ -49,7 +49,7 @@ { $permissions_helper =& $this->Application->recallObject('PermissionsHelper'); $prefix_parts = explode('-', $this->Prefix, 2); - $permissions_helper->LoadPermissions($prefix_parts[0]); + $permissions_helper->LoadPermissions($this->Application->GetVar('g_id'), 0, 1); } function LevelIndicator($params) Index: trunk/core/units/permissions/permissions_tag_processor.php =================================================================== diff -u -N -r5322 -r5325 --- trunk/core/units/permissions/permissions_tag_processor.php (.../permissions_tag_processor.php) (revision 5322) +++ trunk/core/units/permissions/permissions_tag_processor.php (.../permissions_tag_processor.php) (revision 5325) @@ -49,7 +49,7 @@ { $permissions_helper =& $this->Application->recallObject('PermissionsHelper'); $prefix_parts = explode('-', $this->Prefix, 2); - $permissions_helper->LoadPermissions($prefix_parts[0]); + $permissions_helper->LoadPermissions($this->Application->GetVar('g_id'), 0, 1); } function LevelIndicator($params) Index: trunk/admin/install/langpacks/english.lang =================================================================== diff -u -N -r5289 -r5325 --- trunk/admin/install/langpacks/english.lang (.../english.lang) (revision 5289) +++ trunk/admin/install/langpacks/english.lang (.../english.lang) (revision 5325) @@ -74,16 +74,20 @@ VmFsaWRhdGVkIE9u VmFsdWU= Vmlld3M= + QWNjZXNz QWRkaXRpb25hbA== QmFzZWQgT24= RGVzY3JpcHRpb24= RHVyYXRpb24= RHVyYXRpb24gVHlwZQ== + RWZmZWN0aXZl RW1haWw= RXZlbnQ= Rmlyc3QgTmFtZQ== R3JvdXAgTmFtZQ== SUQ= + SW5oZXJpdGVk + SW5oZXJpdGVkIEZyb20= U3lzdGVt TGFiZWw= TGFzdCBDaGFuZ2Vk Index: trunk/core/admin_templates/categories/permissions_tab.tpl =================================================================== diff -u -N -r5322 -r5325 --- trunk/core/admin_templates/categories/permissions_tab.tpl (.../permissions_tab.tpl) (revision 5322) +++ trunk/core/admin_templates/categories/permissions_tab.tpl (.../permissions_tab.tpl) (revision 5325) @@ -11,22 +11,43 @@ - - ', , this.checked, '')" type="checkbox" name="" value="1" checked/> - + + " + name="" + value="10" /> + + " + checked + onchange="update_checkbox(this, document.getElementById(''));" + onclick="inherited_click('', , this.checked, '_cb_')" /> - - ', this.checked)" type="checkbox" disabled="disabled" name="" id="" value="1" checked/> + + " + name="" + value="10" /> + + " + disabled="disabled" + checked + onchange="update_checkbox(this, document.getElementById(''));" + onclick="update_light('', this.checked)" /> - " src="/img/perm_greenred.gif"/> Index: trunk/kernel/admin_templates/categories/permissions_tab.tpl =================================================================== diff -u -N -r5322 -r5325 --- trunk/kernel/admin_templates/categories/permissions_tab.tpl (.../permissions_tab.tpl) (revision 5322) +++ trunk/kernel/admin_templates/categories/permissions_tab.tpl (.../permissions_tab.tpl) (revision 5325) @@ -11,22 +11,43 @@ - - ', , this.checked, '')" type="checkbox" name="" value="1" checked/> - + + " + name="" + value="10" /> + + " + checked + onchange="update_checkbox(this, document.getElementById(''));" + onclick="inherited_click('', , this.checked, '_cb_')" /> - - ', this.checked)" type="checkbox" disabled="disabled" name="" id="" value="1" checked/> + + " + name="" + value="10" /> + + " + disabled="disabled" + checked + onchange="update_checkbox(this, document.getElementById(''));" + onclick="update_light('', this.checked)" /> - " src="/img/perm_greenred.gif"/> Index: trunk/kernel/units/permissions/permissions_event_handler.php =================================================================== diff -u -N -r5302 -r5325 --- trunk/kernel/units/permissions/permissions_event_handler.php (.../permissions_event_handler.php) (revision 5302) +++ trunk/kernel/units/permissions/permissions_event_handler.php (.../permissions_event_handler.php) (revision 5325) @@ -9,16 +9,54 @@ */ function OnCategorySavePermissions(&$event) { - $group_id = $this->Application->GetVar('group_id'); + $group_id = $this->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]; - + $object =& $event->getObject( Array('skip_autoload' => true) ); + $permissions_helper =& $this->Application->recallObject('PermissionsHelper'); + $permissions_helper->LoadPermissions($group_id, $category_id, 0, true); + // 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))) { + // 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.')'; + } + + 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')); @@ -40,7 +78,7 @@ $object =& $event->getObject( Array('skip_autoload' => true) ); $group_id = $this->Application->GetVar('g_id'); $permissions_helper =& $this->Application->recallObject('PermissionsHelper'); - $permissions_helper->LoadPermissions('g'); + $permissions_helper->LoadPermissions($group_id, 0, 1); $delete_ids = Array(); $create_sql = Array(); @@ -70,32 +108,53 @@ } } + $this->UpdatePermissions($event, $create_sql, Array(), $delete_ids); + + if ($this->Application->GetVar('advanced_save') == 1) { + // advanced permission popup [save button] + $this->finalizePopup($event); +// $event->redirect = 'incs/just_close'; + } + elseif ($this->Application->GetVar('section_name') != '') { + // save simple permissions before opening advanced permission popup + $event->redirect = false; + } + + } + + /** + * Apply modification sqls to permissions table + * + * @param kEvent $event + * @param Array $create_sql + * @param Array $update_sql + * @param Array $delete_ids + */ + 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).')'; + WHERE '.$object->IDField.' IN ('.implode(',', $delete_ids).')'; $this->Conn->Query($delete_sql); } if ($create_sql) { $create_sql = ' INSERT INTO '.$object->TableName.' - VALUES '.implode(',', $create_sql); + VALUES '.implode(',', $create_sql); $this->Conn->Query($create_sql); } + + if ($update_sql) { + foreach ($update_sql as $sql) { + $this->Conn->Query($sql); + } + } - if ($delete_ids || $create_sql) { + if ($delete_ids || $create_sql || $update_sql) { $object->setModifiedFlag(); } - - if ($this->Application->GetVar('advanced_save') == 1) { - // advanced permission popup [save button] - $this->finalizePopup($event); -// $event->redirect = 'incs/just_close'; - } - elseif ($this->Application->GetVar('section_name') != '') { - // save simple permissions before opening advanced permission popup - $event->redirect = false; - } - } } Index: trunk/core/units/permissions/permissions_event_handler.php =================================================================== diff -u -N -r5302 -r5325 --- trunk/core/units/permissions/permissions_event_handler.php (.../permissions_event_handler.php) (revision 5302) +++ trunk/core/units/permissions/permissions_event_handler.php (.../permissions_event_handler.php) (revision 5325) @@ -9,16 +9,54 @@ */ function OnCategorySavePermissions(&$event) { - $group_id = $this->Application->GetVar('group_id'); + $group_id = $this->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]; - + $object =& $event->getObject( Array('skip_autoload' => true) ); + $permissions_helper =& $this->Application->recallObject('PermissionsHelper'); + $permissions_helper->LoadPermissions($group_id, $category_id, 0, true); + // 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))) { + // 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.')'; + } + + 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')); @@ -40,7 +78,7 @@ $object =& $event->getObject( Array('skip_autoload' => true) ); $group_id = $this->Application->GetVar('g_id'); $permissions_helper =& $this->Application->recallObject('PermissionsHelper'); - $permissions_helper->LoadPermissions('g'); + $permissions_helper->LoadPermissions($group_id, 0, 1); $delete_ids = Array(); $create_sql = Array(); @@ -70,32 +108,53 @@ } } + $this->UpdatePermissions($event, $create_sql, Array(), $delete_ids); + + if ($this->Application->GetVar('advanced_save') == 1) { + // advanced permission popup [save button] + $this->finalizePopup($event); +// $event->redirect = 'incs/just_close'; + } + elseif ($this->Application->GetVar('section_name') != '') { + // save simple permissions before opening advanced permission popup + $event->redirect = false; + } + + } + + /** + * Apply modification sqls to permissions table + * + * @param kEvent $event + * @param Array $create_sql + * @param Array $update_sql + * @param Array $delete_ids + */ + 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).')'; + WHERE '.$object->IDField.' IN ('.implode(',', $delete_ids).')'; $this->Conn->Query($delete_sql); } if ($create_sql) { $create_sql = ' INSERT INTO '.$object->TableName.' - VALUES '.implode(',', $create_sql); + VALUES '.implode(',', $create_sql); $this->Conn->Query($create_sql); } + + if ($update_sql) { + foreach ($update_sql as $sql) { + $this->Conn->Query($sql); + } + } - if ($delete_ids || $create_sql) { + if ($delete_ids || $create_sql || $update_sql) { $object->setModifiedFlag(); } - - if ($this->Application->GetVar('advanced_save') == 1) { - // advanced permission popup [save button] - $this->finalizePopup($event); -// $event->redirect = 'incs/just_close'; - } - elseif ($this->Application->GetVar('section_name') != '') { - // save simple permissions before opening advanced permission popup - $event->redirect = false; - } - } } Index: trunk/core/units/general/helpers/permissions_helper.php =================================================================== diff -u -N -r5218 -r5325 --- trunk/core/units/general/helpers/permissions_helper.php (.../permissions_helper.php) (revision 5218) +++ trunk/core/units/general/helpers/permissions_helper.php (.../permissions_helper.php) (revision 5325) @@ -9,15 +9,15 @@ */ var $Permissions = Array(); - function LoadPermissions($prefix) + function LoadPermissions($group_id, $cat_id, $type = 1, $temp_mode = false) { - $object =& $this->Application->recallObject($prefix.'-perm', null, Array('skip_autoload' => true)); - - $foreign_key = $this->Application->getUnitOption($prefix.'-perm', 'ForeignKey'); - $foreign_value = $this->Application->GetVar($prefix.'_id'); + $perm_table = $this->Application->getUnitOption('perm', 'TableName'); + if ($temp_mode) { + $perm_table = $this->Application->GetTempName($perm_table); + } $sql = 'SELECT * - FROM '.$object->TableName.' - WHERE '.$foreign_key.' = '.$foreign_value; + FROM '.$perm_table.' + WHERE (GroupId = '.$group_id.') AND (CatId = '.$cat_id.') AND (Type = '.$type.')'; $permissions = $this->Conn->Query($sql, 'Permission'); $this->Permissions = Array(); @@ -30,12 +30,12 @@ function getPermissionValue($perm_name) { - return getArrayValue($this->Permissions, $perm_name) ? $this->Permissions[$perm_name]['value'] : 0; + return isset($this->Permissions[$perm_name]) ? $this->Permissions[$perm_name]['value'] : 0; } function getPermissionID($perm_name) { - return getArrayValue($this->Permissions, $perm_name) ? $this->Permissions[$perm_name]['id'] : 0; + return isset($this->Permissions[$perm_name]) ? $this->Permissions[$perm_name]['id'] : 0; } /**