【问题标题】:Assign site template to organization site programmatically in liferay 6.1.0在 liferay 6.1.0 中以编程方式将站点模板分配给组织站点
【发布时间】:2018-08-05 02:00:49
【问题描述】:

我分别使用 addUser() 和 addOrganization() 方法务实地创建了用户和组织。

我还可以使用 addOrganizationUsers() 方法将用户添加到该组织。

现在我已经从 liferay 控制面板创建了一个站点模板。

我们知道,我们可以为组织创建一个站点,并且在创建站点时,我们可以选择为公共和私人页面选择站点模板。

众所周知。 公共页面 - 对会员 + 非会员可见 私人页面 - 仅对成员可见。

所以我想创建一个只包含私人页面的组织网站,这样只有组织成员才能看到它。

OrganiztionLocalServiceUtil.addOrganization(
    long userId, long parentOrganizationId, String name, String type,
    boolean recursable, long regionId, long countryId, int statusId,
    String comments, boolean site, ServiceContext serviceContext)

使用上述方法,通过指定布尔站点值“true”,将创建一个站点。

现在我想实用地向这个组织站点添加一个站点模板,这是我从控制面板创建的。

那么是否有任何 API 可以将站点模板添加到组织的任何站点

【问题讨论】:

    标签: liferay-6


    【解决方案1】:

    很遗憾,它没有公共 API。

    使用 LayoutSetPrototypeLocalServiceUtil 获取 SiteTemplate 的 ID。要按名称获取 SiteTemplate,您必须使用 dynamicQuery 或迭代 LayoutSetPrototypeLocalServiceUtil.getLayoutSetPrototypes(-1, -1) 的结果

    然后在门户的上下文中调用 SitesUtil 的 applyLayoutSetPrototypes。

    MethodKey methodKey = new MethodKey("com.liferay.portlet.sites.util.SitesUtil","applyLayoutSetPrototypes", Group.class, long.class, long.class, ServiceContext.class);
    PortalClassInvoker.invoke(false, methodKey, organization.getGroup(), publicLayoutSetId, privateLayoutSetId, serviceContext);
    

    为 publicLayoutSetId 指定 -1。

    必须登录管理员才能执行此操作。 要在启动时或在后台执行此操作,需要一个新的 ServiceContext。

    类似下面的东西

    ServiceContext serviceContext = new ServiceContext();
    serviceContext.setAddGroupPermissions(true);
    serviceContext.setAddGuestPermissions(true);
    serviceContext.setSignedIn(false);
    // set the following to an admin user / company or default user
    User user = UserLocalServiceUtil.getDefaultUser(companyId); // or any user that has the permissions
    serviceContext.setUserId(user.getUserId());
    serviceContext.setCompanyId(companyId);
    

    而且很可能您还必须设置 ThreadPermissionChecker

    PrincipalThreadLocal.setName(user.getUserId());
    PermissionChecker adminPermissionChecker = PermissionCheckerFactoryUtil.create(user, false);
    PermissionThreadLocal.setPermissionChecker(adminPermissionChecker);
    

    不要忘记在最后一个块中重置权限检查器,否则相同的权限检查器可能会用于同一线程上的其他请求。

    【讨论】:

    • 您好 Schup,感谢您提供如此宝贵的反馈。现在我能够获取站点模板值并且还能够将正确的参数传递给这个 PortalClassInvoker.invoke() 方法,但是我也注意到要执行这个方法管理员需要登录,所以你能告诉我如何 cam pro - 以语法方式登录并执行此方法,然后也以编程方式注销?
    • 我已经用创建新 ServiceContext 并将其设置为 ThreadLocal 变量的信息更新了答案。
    猜你喜欢
    • 2021-12-08
    • 1970-01-01
    • 2015-12-25
    • 1970-01-01
    • 2019-06-15
    • 2015-06-07
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    相关资源
    最近更新 更多