- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
您好,我想在 Liferay 的文档和媒体 portlet 中实现文件夹订阅功能。
liferay 提供的当前功能是,如果您订阅任何文件夹/父文件夹,那么您将收到有关添加/更新文件的电子邮件,但不会收到有关文件夹的电子邮件。
因此,如果您将子文件夹添加到订阅的文件夹中,您将不会收到任何电子邮件。
对此的任何帮助表示赞赏。
最佳答案
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) 创建一个钩子(Hook)并重写 addFolder、updateFolder 和 moveFolderToTrash 方法的 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)现在使用 addRuntimeSubscribers() 而不是 addPersistedSubscribers() ,原因如上所述,即由于权限检查问题。在此之前,请使用动态查询从订阅表中获取文件夹订阅。
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();
关于liferay - 订阅Liferay 6.2中添加/更新/删除文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27754398/
假设我正在向 Liferay Portal 内的不同 portlet 添加数据。所有这些数据都保存在哪里? 最佳答案 Liferay 附带的大多数开箱即用的 portlet,如博客、论坛、Wiki、W
我需要的是: Administrator-level-1(可以编辑所有2级和3级的简单用户和管理员) Administrator-level-2(可以编辑所有普通用户和3级管理员) 管理员级别 3(甚
我在 liferay 工作。我们在我们的项目中使用一个模块来创建 liferay 主题。我使用命令 ant -Ddeploy.war=true 将它部署在服务器中。 war 文件在 liferay 部
我需要一个简单的 Liferay Web 表单扩展,以增强 Liferay 7 Web 表单中填充的数据的文件附件。 还需要将此文件作为附件随电子邮件发送给注册用户。 我知道如何在 liferay 6
When Local Live staging is enabled for a site, a clone of the site is created containing copies of a
我在 liferay 工作。我们在我们的项目中使用一个模块来创建 liferay 主题。我使用命令 ant -Ddeploy.war=true 将它部署在服务器中。 war 文件在 liferay 部
插件的代码如何访问在其自己的 liferay-plugin-package.properties 文件中设置的属性? 最佳答案 您可以使用 DeployManagerUtil 首先导入以下内容: im
Liferay 7 GA1 刚刚发布,但文档尚未完成。如何将默认的 liferay Logo 更改为公司 Logo ?当然,我希望每个网站都有一个自定义 Logo 。 最佳答案 进入控制面板->配置-
我一直在阅读有关从 liferay 6 迁移到 liferay 7 的 liferay 文档 ( https://dev.liferay.com/develop/tutorials/-/knowled
我想问一个关于是否应该迁移到 Liferay 6.2 的问题。 我和我的团队从 4 个月开始就在使用 Liferay 6.1(CE 版)开发的一个相当大的门户网站上工作,现在,由于项目发布日期仍然提前
我是 liferay 的新手,我几乎确信这非常简单:使用速度标记,我希望能够生成指向 Liferay 网站内页面的链接,并将它们嵌入到不同页面上的 portlet 中。 我对如何完成它有一个模糊的想法
我想知道为用户分配的站点角色名称列表。所以我尝试如下, List userRolesList = RoleLocalServiceUtil.getUserRoles(userid);
同样,我们是否有任何可能的解决方案来避免使用扩展方法/自定义实现/ Hook /插件/扩展将用户信息填充到 liferay 数据库中以进行身份验证? 问候维沙尔 G 最佳答案 无法避免在 Life
只是想知道任何一个与 liferay 集成的 wicket 。 在启用 ajax 的情况下对 wicket portlet 进行编码有多难? 有人在生产中使用 wicket portlet 吗? 最佳
我们在liferay 中有一个叫做嵌套portlet 的东西。我想通过代码动态添加这个 portlet。有谁知道用于添加嵌套 portlet 并在其中添加其他 portlet 的代码? 谢谢 !!!
如何以编程方式获取 Liferay 默认语言或区域设置? 最佳答案 检查 com.liferay.portal.kernel.util.LocaleUtil 类方法: LocaleUtil.getDe
是否可以在 service.xml 文件中不配置任何数据库表的情况下创建 liferay 服务构建器。 实际上这里的目的是使用 liferay 服务构建器创建一个服务层。并且在这个服务层没有直接与数据
众所周知,Liferay 具有创建用户的内置功能。但我希望有一个创建用户的工作流程,其中涉及批准过程。我的意思是,用户将由管理员创建,但它应该由另一个授权人批准,然后只有用户帐户将处于事件状态。 有什
我正在使用liferay6.1 和Java SDK 开发liferay portlet。 当用户登录并单击控制面板时,他们可以看到各种选项。有没有办法隐藏这个选项? 我还是新手,但我认为您可以将它从
我发现了如何使用journalContentUtil.getContent方法将Web Content嵌入Liferay 6.2主题中。我的问题是在Liferay 7中如何做同样的事情? 最佳答案 我
我是一名优秀的程序员,十分优秀!