function save_member_permissions($member) { $permissionsString = array_var($_POST, 'permissions'); if ($permissionsString && $permissionsString != '') { $permissions = json_decode($permissionsString); } $sharingTablecontroller = new SharingTableController(); $changed_pgs = array(); if (isset($permissions) && is_array($permissions)) { $allowed_pg_ids = array(); foreach ($permissions as &$perm) { $cmp = ContactMemberPermissions::findById(array('permission_group_id' => $perm->pg, 'member_id' => $member->getId(), 'object_type_id' => $perm->o)); if (!$cmp instanceof ContactMemberPermission) { $cmp = new ContactMemberPermission(); $cmp->setPermissionGroupId($perm->pg); $cmp->setMemberId($member->getId()); $cmp->setObjectTypeId($perm->o); } $cmp->setCanWrite($perm->w); $cmp->setCanDelete($perm->d); if ($perm->r) { $allowed_pg_ids[$perm->pg] = array(); if (isset($allowed_pg_ids[$perm->pg]['w'])) { if (!$allowed_pg_ids[$perm->pg]['w']) { $allowed_pg_ids[$perm->pg]['w'] = $perm->w; } } else { $allowed_pg_ids[$perm->pg]['w'] = $perm->w; } if (isset($allowed_pg_ids[$perm->pg]['d'])) { if (!$allowed_pg_ids[$perm->pg]['d']) { $allowed_pg_ids[$perm->pg]['d'] = $perm->d; } } else { $allowed_pg_ids[$perm->pg]['d'] = $perm->d; } $cmp->save(); } else { $cmp->delete(); } $perm->m = $member->getId(); $changed_pgs[] = $perm->pg; } foreach ($changed_pgs as $pg_id) { $sharingTablecontroller->afterPermissionChanged($pg_id, $permissions); } foreach ($allowed_pg_ids as $key => $mids) { $root_cmp = ContactMemberPermissions::findById(array('permission_group_id' => $key, 'member_id' => $member->getId(), 'object_type_id' => $member->getObjectTypeId())); if (!$root_cmp instanceof ContactMemberPermission) { $root_cmp = new ContactMemberPermission(); $root_cmp->setPermissionGroupId($key); $root_cmp->setMemberId($member->getId()); $root_cmp->setObjectTypeId($member->getObjectTypeId()); } $root_cmp->setCanWrite($mids['w'] == true ? 1 : 0); $root_cmp->setCanDelete($mids['d'] == true ? 1 : 0); $root_cmp->save(); } } // check the status of the dimension to set 'allow_all', 'deny_all' or 'check' $dimension = $member->getDimension(); $mem_ids = $dimension->getAllMembers(true); if (count($mem_ids) == 0) { $mem_ids[] = 0; } foreach ($changed_pgs as $pg_id) { $count = ContactMemberPermissions::count(array('conditions' => "`permission_group_id`={$pg_id} AND `member_id` IN (" . implode(",", $mem_ids) . ") AND `can_delete` = 0")); if ($count > 0) { $dimension->setContactDimensionPermission($pg_id, 'check'); } else { $count = ContactMemberPermissions::count(array('conditions' => "`permission_group_id`={$pg_id} AND `member_id` IN (" . implode(",", $mem_ids) . ")")); if ($count == 0) { $dimension->setContactDimensionPermission($pg_id, 'deny all'); } else { $allow_all = true; $dim_obj_types = $dimension->getAllowedObjectTypeContents(); $members = Members::findAll("`id` IN (" . implode(",", $mem_ids) . ")"); foreach ($dim_obj_types as $dim_obj_type) { $mem_ids_for_ot = array(); foreach ($members as $member) { if ($dim_obj_type->getDimensionObjectTypeId() == $member->getObjectTypeId()) { $mem_ids_for_ot[] = $member->getId(); } } if (count($mem_ids_for_ot) == 0) { $mem_ids_for_ot[] = 0; } $count = ContactMemberPermissions::count(array('conditions' => "`permission_group_id`={$pg_id} AND \n\t\t\t\t\t\t`object_type_id` = " . $dim_obj_type->getContentObjectTypeId() . " AND `can_delete` = 1 AND `member_id` IN (" . implode(",", $mem_ids_for_ot) . ")")); if ($count != count($mem_ids_for_ot)) { $allow_all = false; break; } } if ($allow_all) { $dimension->setContactDimensionPermission($pg_id, 'allow all'); } else { $dimension->setContactDimensionPermission($pg_id, 'check'); } } } } }