Index: trunk/kernel/units/general/helpers/permissions_helper.php
===================================================================
diff -u -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 -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 -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 -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 -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 -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 -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 -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 -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;
}
/**