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的更多相关文章

  1. Liferay7 BPM门户开发之21: 理解消息总线(Message Bus)体系

    Liferay Message Bus提供了松耦合的消息发送接收机制(生产和消费的设计模式),用于本地服务,不支持远程服务,支持集群. 主要用途: 两个或多个插件之间的通讯. 在事件中发送搜索索引,比 ...

  2. Liferay7 BPM门户开发之19: 理解Service Builder体系

    Service Builder是Liferay为业务开发而设计的模型驱动(model-driven)平台工具,提供一系列的实体类.数据持久化.服务相关的代码自动生成服务.支持Hibernate and ...

  3. Liferay7 BPM门户开发之37: Liferay7下的OSGi Hook集成开发

    hook开发是Liferay客制扩展的一种方式,比插件灵活,即可以扩展liferay门户,也能对原有特性进行更改,Liferay有许多内置的服务,比如用hook甚至可以覆盖Liferay服务. 可作为 ...

  4. Liferay7 BPM门户开发之10: 通用流程实现从Servlet到Portlet(Part1)

    开发目的: 实现通用流程自动化处理(即实现不需要hardcode代码的bpm统一处理后台,仅需要写少量前端html form代码和拖拽设计BPM定义) 既可独立运行或可依托于Liferay或依托其它门 ...

  5. Liferay7 BPM门户开发之17: Portlet 生命周期

    Portlet 生命周期 init() =〉 render() =〉 processAction() =〉 processEvent() =〉 serveResource() =〉destroy() ...

  6. Liferay7 BPM门户开发之12:acitiviti和liferay用户权限体系集成

    写到第12章才出现Liferay的内容,希望可以厚积薄发. 我们的目标是不使用不维护Activiti的用户组织架构,只维护Liferay的体系,这样的好处是非常明显的,即不用做组织架构的同步工作. 原 ...

  7. Liferay7 BPM门户开发之32: 实现自定义认证登陆(定制Authentication Hook)

    第一步:修改liferay-hook.xml <?xml version="1.0"?> <!DOCTYPE hook PUBLIC "-//Lifer ...

  8. Liferay7 BPM门户开发之15: Liferay开发体系简介

    Liferay SDK 开发体系 主要分6种: Portlet Hook Theme Layout Templates Web Modules Ext Portlet :类似于servlet的web组 ...

  9. Liferay7 BPM门户开发之38: OSGi模块化Bndtools、Maven、Gradle开发构建入门

    前言 OSGi是目前动态模块系统的事实上的工业标准,它适用于任何需要模块化.面向服务.面向组件的应用程序.Eclipse如此庞大和复杂的插件体系,就是基于OSGi.Liferay也是基于OSGi.OS ...

随机推荐

  1. 浅析AnyCast网络技术

    什么是BGP AnyCast? BGP anycast就是利用一个(多个) as号码在不同的地区广播相同的一个ip段.利用bgp的寻路原则,短的as path 会选成最优路径(bgp寻路原则之n),从 ...

  2. 【VBA】ExcelファイルのOpen

    ※変数の定義を強制する方法: 一番上に.「Option Explicit」を追加して.変数の定義が必須となる. ソース Private Sub CommandButton2_Click() //スクリ ...

  3. c++中被忽视的隐藏

    稍微懂得点oop的人都知道重载,那是多态性的重要体现!可是在c++中你能分清成员函数的重载.覆盖吗?这个好像也不难,重载存在与同一个类中,而覆盖存在于派生类于基类中!可是如果再加上隐藏呢?说实话,以前 ...

  4. Selenium 学习汇总

    Commands (命令) Action 对当前状态进行操作 失败时,停止测试 Assertion 校验是否有产生正确的值 Element Locators 指定HTML中的某元素 Patterns ...

  5. 【.Net】 大文件可使用的文本分组统计工具(附带源码,原创)

    本工具可实现的效果: 1.读取大文件(大于1GB) 2.根据分隔符分割后的列分组 3.速度快. 4.处理过程中,可以随时停止处理,操作不卡死. 5.有对当前内存的实时监测,避免过多占用内存,影响系统运 ...

  6. django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call

    Error info: django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE, ...

  7. DVR NVR

    1.NVR: 是(Network Video Recorder即网络硬盘录像机)的缩写.NVR最主要的功能是通过网络接收IPC(网络摄像机)设备传输的数字视频码流,并进行存储.管理,从而实现网络化带来 ...

  8. Eclipse Python 开发环境搭建 pydev 插件

    已安装: python 3.6 JDK Eclispe 在 Eclipse 中安装 pydev Pydev 的下载网址 http://www.pydev.org/download.html 安装完成后 ...

  9. JPanel JScrollPanel

    JPanel 和 JScrollPanel 都属于面板,也是 Swing 中间容器,可以作为容器存放组件,但必须被添加到其他容器中. JPanel 可以聚集一些组件来布局, JScrollPanel ...

  10. small_trick_on_IT/PC

    1.浏览器下ctrl+F可实现文本查找 其余还有 2.将软件目录放到环境变量Path下,Ctrl+R输入.exe软件名即可调用. (tips:可把常用软件建立快捷方式,统一放在某一目录下噢!)