Liferay7 BPM门户开发之20: 理解Asset Framework
Asset框架用于将您开发的门户内容添加Liferay的核心系统功能。
打个比方,你开发了一个事件TodoList管理的插件,在列表显示的时候,你可以集成Asset框架,让你的自定义内容支持Tag标签、分类、评论、星标等功能。它可以关联任意的门户内容,文本、Int、Image、documents、blog entries, bookmarks,或者任何您自己定义的内容。
这带来门户的一致关联性,非常有益。
Asset框架主要有下列功能:
- 1.关联Tag标签到自定义的内容类型,可以创建或关联已存在的Tag。
- 2.关联类别到自定义的内容类型。作者只能在预定义的词汇中的类别中进行选择。
- 3.在控制面板中管理标签。管理员可以合并Tag。
- 4.在控制面板中管理类别,管理员管理类别层级。
- 5.将评论关联到内容。
- 6.通过0到5颗星的评级功能来对内容进行评级。
- 7.分配链接到内容的社交标签。
- 8.对asset增加自定义字段。
- 9.将一个asset与另一个asset设置为相关联(即相关文章 或类似的内容,有点像淘宝里的相似商品)。
- 10.标记不妥的文章。
- 11.追踪内容的浏览次数。
- 12.和工作流整合。
- 13.通过资源发布器(Asset Publisher)portlet来发布和管理内容。
为自定义内容注入Asset关联 (新增、修改、删除)
首先要在工程的service.xml文件增加一行
<reference package-path="com.liferay.portlet.asset" entity="AssetEntry" />
然后运行Service Builder。
比如修改一条AssetEntry,一般调用方法是assetEntryLocalService的updateEntry方法:
AssetEntry updateEntry(
long userId, long groupId, Date createDate, Date modifiedDate,
String className, long classPK, String classUuid, long classTypeId,
long[] categoryIds, String[] tagNames, boolean visible,
Date startDate, Date endDate, Date expirationDate, String mimeType,
String title, String description, String summary, String url,
String layoutUuid, int height, int width, Integer priority,
boolean sync)
throws PortalException, SystemException
如果不用Service Builder体系也可以用AssetLocalServiceUtil的静态方法。
参数的介绍:
- userId: 用户ID
获取userId可以通过2种方式:
long userId = PortalUtil.getUserId(request)
long userId = serviceContext.getUserId();
- groupId: 内容所处的范围维度,如果不支持界限范围,那么直接传0.
获取groupId的2种方式:
long groupId = serviceContext.getScopeGroupId();
long groupId = PortalUtil.getScopeGroupId(renderRequest)
- createDate: 创建日期
- modifiedDate: 修改日期
- className: 实体类型名称,比如[YourClassName].class.getName().
- classPK: 实体实例主键
- classUuid: 用于关联跨域的实体实例,方便与内容的导入导出需求,想像一下,如果用了int自增,就没法同步内容了
- classTypeId: 一般是0
- categoryIds: 分类IDs
- assetTagNames: 标签名称s,注意这是个数组
获取categoryIds和assetTagNames方式:
ServiceContext serviceContext = ServiceContextFactory.getInstance(
actionRequest);
long[] assetCategoryIds = serviceContext.getAssetCategoryIds();
String[] assetTagNames = serviceContext.getAssetTagNames();
- visible: 是否可见
- startDate: Asset Publisher显示内容的日期,一般是null
- endDate: Asset Publisher停止显示内容的日期,一般是null
- expirationDate: 过期时间,过期即不显示该实体内容,一般是null
- mimetype: 比如 ContentTypes.TEXT_HTML, 用于实体的展示格式
- title: 标题
- description:
- summary: 短介绍
- url: 实体关联的URL,一般是null
- layoutUuid: 布局ID,一般是null
- height: 可以是0
- width: 可以是0
- priority: 优先级,一般是null
- sync: 设置同步开关,一般false
一个例子更能简单说明问题:
比如在insult实例调用updateEntry方法. 在add-XXX方法中调用updateEntry在实体添加后,或者在update-XXX方法中。
注意2点:
- Insult是实体类
- insult是Insult的一个实例
long classTypeId = ;
boolean visible = true;
Date startDate = null;
Date endDate = null;
Date expirationDate = null;
String mimeType = ContentTypes.TEXT_HTML;
String title = insult.getInsultString();
String description = insult.getInsultString();
String summary = insult.getInsultString();
String url = null;
String layoutUuid = null;
int height = ;
int width = ;
Integer priority = null;
boolean sync = false; assetEntryLocalService.updateEntry(
userId, groupId, insult.getCreateDate(),
insult.getModifiedDate(), Insult.class.getName(),
insult.getInsultId(), insult.getUuid(), classTypeId,
serviceContext.getAssetCategoryIds(),
serviceContext.getAssetTagNames(), visible, startDate, endDate,
expirationDate, mimeType, title, description, summary, url,
layoutUuid, height, width, priority, sync); Indexer indexer = IndexerRegistryUtil.nullSafeGetIndexer(Insult.class);
indexer.reindex(insult);
在删除实体时,应同时删除相关的asset和索引。
assetEntryLocalService.deleteEntry(
Insult.class.getName(), insult.getInsultId()); Indexer indexer = IndexerRegistryUtil.nullSafeGetIndexer(Insult.class);
indexer.delete(insult);
在JSP页面中显示类型和标签Tag选择器

比如一个portlet中的 edit_XXXentry.jsp:
添加:
<liferay-ui:asset-categories-error />
<liferay-ui:asset-tags-error />
...
<aui:fieldset-group markupView="lexicon">
...
<aui:fieldset collapsed="<%= true %>" collapsible="<%= true %>" label="categorization">
<aui:input name="categories" type="assetCategories" />
<aui:input name="tags" type="assetTags" />
</aui:fieldset>
...
</aui:fieldset-group>
用于展示:
<p><liferay-ui:message key="categories" />:</p> <div class="entry-categories">
<liferay-ui:asset-categories-summary
className="<%= BlogsEntry.class.getName() %>"
classPK="<%= entry.getEntryId() %>"
portletURL="<%= renderResponse.createRenderURL() %>"
/>
</div>
...
<div class="entry-tags">
<p><liferay-ui:message key="tags" />:</p>
<liferay-ui:asset-tags-summary
className="<%= BlogsEntry.class.getName() %>"
classPK="<%= entry.getEntryId() %>"
portletURL="<%= renderResponse.createRenderURL() %>"
/>
</div>
在JSP页面中显示通用评论

<%
long insultId = ParamUtil.getLong(renderRequest, "insultId");
Insult ins = InsultLocalServiceUtil.getInsult(insultId);
%> <liferay-ui:panel-container extended="<%=false%>"
id="insultCommentsPanelContainer" persistState="<%=true%>"> <liferay-ui:panel collapsible="<%=true%>" extended="<%=true%>"
id="insultCommentsPanel" persistState="<%=true%>"
title='<%=LanguageUtil.get(pageContext, "comments")%>'> <portlet:actionURL name="invokeTaglibDiscussion" var="discussionURL" /> <%
String currentUrl = PortalUtil.getCurrentURL(request);
%> <liferay-ui:discussion className="<%=Insult.class.getName()%>"
classPK="<%=ins.getInsultId()%>"
formAction="<%=discussionURL%>" formName="fm2"
ratingsEnabled="<%=true%>" redirect="<%=currentUrl%>"
subject="<%=ins.getInsultString()%>"
userId="<%=ins.getUserId()%>" /> </liferay-ui:panel>
</liferay-ui:panel-container>
到这里,应该可以清楚的感觉到使用Asset框架的好处:只有用好它,才能继承Liferay的核心关联资产。
Liferay7 BPM门户开发之20: 理解Asset Framework的更多相关文章
- Liferay7 BPM门户开发之21: 理解消息总线(Message Bus)体系
Liferay Message Bus提供了松耦合的消息发送接收机制(生产和消费的设计模式),用于本地服务,不支持远程服务,支持集群. 主要用途: 两个或多个插件之间的通讯. 在事件中发送搜索索引,比 ...
- Liferay7 BPM门户开发之19: 理解Service Builder体系
Service Builder是Liferay为业务开发而设计的模型驱动(model-driven)平台工具,提供一系列的实体类.数据持久化.服务相关的代码自动生成服务.支持Hibernate and ...
- Liferay7 BPM门户开发之37: Liferay7下的OSGi Hook集成开发
hook开发是Liferay客制扩展的一种方式,比插件灵活,即可以扩展liferay门户,也能对原有特性进行更改,Liferay有许多内置的服务,比如用hook甚至可以覆盖Liferay服务. 可作为 ...
- Liferay7 BPM门户开发之10: 通用流程实现从Servlet到Portlet(Part1)
开发目的: 实现通用流程自动化处理(即实现不需要hardcode代码的bpm统一处理后台,仅需要写少量前端html form代码和拖拽设计BPM定义) 既可独立运行或可依托于Liferay或依托其它门 ...
- Liferay7 BPM门户开发之17: Portlet 生命周期
Portlet 生命周期 init() =〉 render() =〉 processAction() =〉 processEvent() =〉 serveResource() =〉destroy() ...
- Liferay7 BPM门户开发之12:acitiviti和liferay用户权限体系集成
写到第12章才出现Liferay的内容,希望可以厚积薄发. 我们的目标是不使用不维护Activiti的用户组织架构,只维护Liferay的体系,这样的好处是非常明显的,即不用做组织架构的同步工作. 原 ...
- Liferay7 BPM门户开发之32: 实现自定义认证登陆(定制Authentication Hook)
第一步:修改liferay-hook.xml <?xml version="1.0"?> <!DOCTYPE hook PUBLIC "-//Lifer ...
- Liferay7 BPM门户开发之15: Liferay开发体系简介
Liferay SDK 开发体系 主要分6种: Portlet Hook Theme Layout Templates Web Modules Ext Portlet :类似于servlet的web组 ...
- Liferay7 BPM门户开发之38: OSGi模块化Bndtools、Maven、Gradle开发构建入门
前言 OSGi是目前动态模块系统的事实上的工业标准,它适用于任何需要模块化.面向服务.面向组件的应用程序.Eclipse如此庞大和复杂的插件体系,就是基于OSGi.Liferay也是基于OSGi.OS ...
随机推荐
- spring cloud 总结
Finchley版本Spring Cloud Finchley; Spring Boot 2.0.3 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)(Fin ...
- k8s之创建etcd集群
主机规划 maste01——192.168.10.63 master02——192.168.10.64 node01——192.168.10.65 node02——192.168.10.66 1.为保 ...
- 数据库常用操作(mysql)
创建 create database 库名 create table 表名(列名 type(varchar(size),int(size),decimal(size,d))) "size&q ...
- matlab--二维画图及三维画图的相关命令
clc;clear all;close all; % plot3是最简单的三维图% mesh是网格图% surf是曲面图%plot3-------------------------t1=0:pi/3 ...
- python note 06 编码方式
1.有如下值li= [11,22,33,44,55,66,77,88,99,90],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中.即: {'k1': 大 ...
- 89. Gray Code返回位运算的所有生成值
[抄题]: The gray code is a binary numeral system where two successive values differ in only one bit. G ...
- 交叉编译bash
1 下载bash版本:[version 4.2.53]地址:http://ftp.gnu.org/gnu/bash/ 2 解压将下载的bash压缩包解压,命令: # mkdir /home/carri ...
- Tomcat9.0.13 Bug引发的java.io.IOException:(打开的文件过多 Too many open files)导致服务假死
问题背景: 笔者所在的项目组最近把生产环境Tomcat迁移到Linux,算是顺利运行了一段时间,最近一个低概率密度的(too many open files)问题导致服务假死并停止响应客户端客户端请求 ...
- osg探究补充:Node::accept(NodeVisitor& nv)及NodeVisitor简介
前言 在前几节中,我自己觉得讲的比较粗糙,因为实在是时间上不是很充足,今天我想弥补一下,希望不是亡羊补牢.我们在osgViewer::Viewer::eventTraversal()函数中经常看到这么 ...
- MongoDB、Hbase、Redis等NoSQL分析
NoSQL的四大种类 NoSQL数据库在整个数据库领域的江湖地位已经不言而喻.在大数据时代,虽然RDBMS很优秀,但是面对快速增长的数据规模和日渐复杂的数据模型,RDBMS渐渐力不从心,无法应对很多数 ...