2

我只是遗漏了一些明显的东西,还是没有合理或半可行的方法来为 Liferay 留言板中的消息添加过期日期?

第一个问题是如何在消息编辑器中输入过期日期。最明显的解决方案可能是 expando 属性,但似乎没有日期的 expando 数据类型(只有日期和时间),我找不到在 expando 属性中设置计算默认值的方法(例如今天 + 6 个月)。即使没有默认值,日期+时间属性默认为 1970 年 1 月 1 日,格林威治标准时间 0:00,并且使用日期选择器输入真正的到期日期是相当乏味的。输入过期日期后,没有明显的方法来验证它(例如,将其限制为今天和今天 + 6 个月之间的日期),当日期显示在消息视图中时,当前区域设置不用于格式化日期和时间。

即使我以某种方式设法将到期日期压缩到扩展属性中,也没有明显的方法来评估到期日期。

消息仍然保留,但不计算在内并显示在 MB portlet 中是可以接受的。MBThreadServiceUtil 中用于访问消息的方法没有提供任何额外的过滤条件,因此我要么必须加载所有消息并在 Java 代码中执行计数/过滤操作(这不是一个非常聪明的解决方案),要么我必须重写整个服务堆栈“自下而上”并添加 get 或 search 方法,这些方法能够将过滤转发到数据库。

首选的解决方案是有一个计划任务,它会定期完全删除过期的消息。由于 MB portlet 支持范围(消息与 portlet 的范围相关)并且计划任务不在 portlet 上下文中运行,因此我必须以某种方式访问​​范围 ID。如果我了解有关此主题的文档和可用讨论,则默认范围应该是页面所属的社区。另一方面,我们的“留言板页面”是在组织级别添加的,消息的范围 ID 与组织 ID 不匹配,也不匹配组织中社区的任何 ID。任何人都知道如何在这种情况下确定范围 ID?

4

1 回答 1

1

我会用计划任务来制作 - liferay 用于 Quartz; http://liferaysnippets.com/how-to-create-cron-job-in-liferay/

您可以使用 DynamicQueries 保存的过期消息:

    Calendar c = Calendar.getInstance();
    c.add(Calendar.MONTH, -6);
    Date halfYearAgo = c.getTime();
    ClassLoader portalClassLoader = PortalClassLoaderUtil.getClassLoader();
    DynamicQuery query = DynamicQueryFactoryUtil.forClass(MBThread.class, portalClassLoader)
            .add(PropertyFactoryUtil.forName("lastPostDate").le(halfYearAgo)).addOrder(OrderFactoryUtil.asc("lastPostDate"));

    try {
        List dynamicQuery = MBThreadLocalServiceUtil.dynamicQuery(query);
        for (Object object : dynamicQuery) {
            MBThread thread = (MBThread) object;
            MBThreadLocalServiceUtil.deleteMBThread(thread);
        }
    } catch (SystemException e) {
        e.printStackTrace();
    }
于 2012-05-04T01:02:51.863 回答