【问题标题】:Subscribe to Add/update/delete of folder in Liferay 6.2在 Liferay 6.2 中订阅添加/更新/删除文件夹
【发布时间】:2015-07-13 14:13:17
【问题描述】:

您好,我想为 Liferay 的文档和媒体 portlet 中的文件夹实现订阅功能

liferay 提供的当前功能是,如果您订阅任何文件夹/父文件夹,那么您将收到有关添加/更新文件的电子邮件,但不会收到文件夹的电子邮件。

因此,如果您将子文件夹添加到订阅的文件夹中,您将不会收到任何电子邮件。

对此的任何帮助表示赞赏。

【问题讨论】:

  • 我认为你可以通过 Liferay 的服务实现类中的通知方法的钩子来做到这一点。

标签: liferay liferay-6


【解决方案1】:

SubscriptionPermissionImpl 中的 hasPermission 方法仅检查 MBDiscussion、BlogsEntry、BookmarksEntry、DLFileEntry、JournalArticle、MBCategory、MBThread、WikiPage 的权限

检查SubscriptionPermissionImpl.java

的以下方法
protected Boolean hasPermission(
            PermissionChecker permissionChecker, String className, long classPK,
            String actionId)
        throws PortalException, SystemException {...}

因此,在实施自定义解决方案时当我们说 subscriptionSender.flushNotificationsAsync() 时,它不会为文件夹发送电子邮件,因为 hasPermisson 返回 false

由于 Liferay 不支持添加/更新/删除文件夹的电子邮件订阅,我们必须实施自己的解决方案。

以下是实现此功能的步骤。

1) 为 addFolderupdateFoldermoveFolderToTrash 方法创建一个挂钩并覆盖 DLAppService。 这里我将展示如何添加文件夹订阅,其余的都是一样的。

@Override
    public Folder addFolder(long repositoryId, long parentFolderId,
        String name, String description, ServiceContext serviceContext)
        throws PortalException, SystemException {

    Folder folder = null;

    folder =
        super
            .addFolder(
                repositoryId, parentFolderId, name, description,
                serviceContext);

    MySubscriptionUtil.notifySubscribersForFolders(
        folder, serviceContext, MyDLConstants.EVENT_TYPE_ADD);

    return folder;
}

2) 这里的 MySubcriptionUtil 是一个使用静态方法创建的实用程序类。

现在在 notifySubscribersForFolders 方法中,使用文件夹对象,然后通过设置所需的数据创建 subscriptionSender 对象。 例如:

SubscriptionSender subscriptionSender = new SubscriptionSender();

subscriptionSender.setCompanyId(folder.getCompanyId());
subscriptionSender.setContextAttributes(
    "[$FOLDER_NAME$]", folder.getName(), "[$PARENT_FOLDER_NAME$]",
    parentFolderName, "[$SITE$]", group.getDescriptiveName());
subscriptionSender.setContextUserPrefix("FOLDER");
subscriptionSender.setFrom(fromAddress, fromName);
subscriptionSender.setHtmlFormat(true);
subscriptionSender.setBody(body);
subscriptionSender.setSubject(subject);
subscriptionSender.setMailId("folder", folder.getFolderId());
subscriptionSender.setPortletId(PortletKeys.DOCUMENT_LIBRARY);
subscriptionSender.setReplyToAddress(fromAddress);
subscriptionSender.setScopeGroupId(folder.getGroupId());
subscriptionSender.setServiceContext(serviceContext);
subscriptionSender.setUserId(folder.getUserId());

3) 现在代替 addPersistedSubscribers(),使用 addRuntimeSubscribers() 原因同上,即由于权限检查问题。 在此之前,请使用 Dynamic Query 从订阅表中获取文件夹订阅。

    List<Long> folderIds //set this list with all parents folder ids of the folder

    // adding group id for parent folder
    /*
    * This is the default parent of any folder.
    * So if user is subscribed to home folder then 
    * he will have entry in subscription table with classPK as groupId
    */
    folderIds.add(folder.getGroupId());

    long classNameId = PortalUtil.getClassNameId(Folder.class.getName());

    DynamicQuery dynamicQuery =
        DynamicQueryFactoryUtil.forClass(Subscription.class);
    dynamicQuery.add(RestrictionsFactoryUtil.in("classPK", folderIds));
    dynamicQuery
        .add(RestrictionsFactoryUtil.eq("classNameId", classNameId));

    List<Subscription> subscriptionList =
        SubscriptionLocalServiceUtil.dynamicQuery(dynamicQuery);

    for(Subscription subscription : subscriptionList) {
        try {
            User user =
                UserLocalServiceUtil.getUser(subscription.getUserId());

            if(user.isActive()) {

                if(_log.isDebugEnabled()) {
                    _log.debug("User added to subscription list : "
                        + user.getEmailAddress());
                }

                /*
                * This is the key method call as this adds all the 
                *users to whom we need to send an email.
                */
                subscriptionSender.addRuntimeSubscribers(
                    user.getEmailAddress(), user.getFirstName()
                        + StringPool.SPACE + user.getLastName());
            }
        }
        catch(Exception e) {
            _log.error("Exception occured while fetching user @_notifySubscribersForFolders : "
                + e.getMessage());
        }
    }

    //This is the last call which will trigger the send email event
    subscriptionSender.flushNotificationsAsync();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-13
    • 2014-10-14
    • 2020-07-18
    • 2018-12-12
    • 2015-12-01
    • 1970-01-01
    • 2019-12-05
    相关资源
    最近更新 更多