我已经用Kentico devnet和Kentico的支持提出了这个问题,并且还没有得到解决方案。我希望更广泛的SO社区能够提出一些建议。
供参考,这是devnet线程:http://devnet.kentico.com/questions/content-staging-how-can-i-stage-role-changes-but-ignore-user-changes
总而言之,我正在使用Kentico构建一个大型多站点Web平台。登台模块配置为通过从开发到UAT以及生产的线性环境链来部署Kentico对象更改。这些环境中的每一个自然具有不同的用户集。因此,我从登台过程中排除了用户和用户角色关系,如下所示:
public class KingspanUserEvents : CMSLoaderAttribute
{
public override void Init()
{
UserInfo.TYPEINFO.LogSynchronization = CMS.DataEngine.SynchronizationTypeEnum.None;
UserRoleInfo.TYPEINFO.LogSynchronization = CMS.DataEngine.SynchronizationTypeEnum.None;
}
}
但是,我发现当更改的角色记录为暂存任务时,部分序列化角色数据是其用户关联。请记住,这些用户将是仅存在于源环境中的用户。
这样可以在同步环境时,在目标上更新角色,并从角色中删除所有用户。
Kentico支持说"我们已经意识到这一点,它已列入未来的改进名单。"。然而,对我来说,这是CMS的一个根本缺陷,它具有企业愿望。未能在应用程序体系结构(角色)和实时数据(用户)之间保持分离意味着我无法为应用程序的核心部分创建可靠的部署。
所以我的问题是,有没有人找到解决这个问题的方法?我想知道是否有可能挂钩StagingEvents.ProcessTask.Before
事件处理程序以某种方式阻止用户被删除。
答案 0 :(得分:1)
我刚刚找到了另外一个属性,根据描述,它应该按照您的要求进行:
UserRoleInfo.TYPEINFO.IncludeToSynchronizationParentDataSet = false;
答案 1 :(得分:0)
但是,我发现当更改的角色被记录为登台任务时,部分序列化角色数据就是其用户关联。
我认为这是因为RoleInfoProvider.SetRoleInfo()
在内部将UserInfo更改记录为暂存任务,无论它是否实际对这些用户进行了更改。
您可以看到的是更改SaveRole()
中的/CMSModules/Membership/Controls/Roles/RoleEdit.ascx
方法:
private void SaveRole(RoleInfo ri, string codeName, string displayName)
{
bool newRole = false;
// Get object
if (ri == null)
{
ri = RoleInfoProvider.GetRoleInfo(ItemID);
if (ri == null)
{
ri = new RoleInfo();
// indicate this is new role and should be redirected after safe
newRole = true;
}
}
if (ri.DisplayName != displayName)
{
// Refresh a breadcrumb if used in the tabs layout
ScriptHelper.RefreshTabHeader(Page, string.Empty);
}
// Set the fields
ri.DisplayName = displayName;
ri.RoleName = codeName;
ri.RoleID = ItemID;
ri.Description = txtDescription.Text;
ri.SiteID = mSiteId;
ri.RoleIsDomain = chkIsDomain.Checked;
// If group id is present then it's group role
if (GroupID > 0)
{
ri.RoleGroupID = mGroupId;
ri.RoleIsGroupAdministrator = chkIsAdmin.Checked;
}
RoleInfoProvider.SetRoleInfo(ri);
ItemID = ri.RoleID;
ShowChangesSaved();
// if new group was created redirect to edit page
if (newRole)
{
RoleID = ri.RoleID;
RaiseOnSaved();
}
}
这是在CMSSiteManager中单击“保存”时调用的方法。请记住我在这里使用的是版本7,因此在v8和9中可能会略有不同,但如果在这些版本中使用不同的控件,您可以始终“查看帧源”以确定正在加载的ASPX页面Kentico UI中的控件。
无论如何,在该方法中,正在调用RoleInfoProvider.SetRoleInfo()
。您可以看到的一件事是creating a custom InfoProvider class并覆盖SetRoleInfo()方法或创建自己的方法,然后只记录您要记录的同步任务。
但是,作为快速修复,直到您能够实现此功能,您还可以按对象&gt;过滤同步日志任务。全球对象&gt; <给药>用户在删除之前删除所有这些任务。