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. 简单了解pytorch的forward

    import torch.nn as nn import torch.nn.functional as F import torch.optim as optim from torch.autogra ...

  2. 二维树状数组poj1195

    题目链接:https://vjudge.net/problem/POJ-1195 题意:一开始输入0和一个s,0代表开始,s代表这是一个s*s的图,接下来会输入1或2,1代表进行单点修改,后面会接3个 ...

  3. PEiD中识别虚拟地址和物理地址

    可通过PEiD中的信息计算文件偏移地址,从而修改PE文件的关键内容,达到破解目的. 文件偏移地址=相对虚拟地址-节偏移. PEiD中有: 节偏移=虚拟地址VOffset-物理地址ROffset.  

  4. input text 只能输入数字

    添加 onkeyup="value=value.replace(/[^\d]/g,'')"

  5. [leetcode]19. Remove Nth Node From End of List删除链表倒数第N个节点

    Given a linked list, remove the n-th node from the end of list and return its head. Example: Given l ...

  6. [leetcode]22. Generate Parentheses生成括号

    Given n pairs of parentheses, write a function to generate all combinations of well-formed parenthes ...

  7. Sass入门及知识点整理

    Sass 快速入门 | SASS 中文网 文档链接:https://www.sasscss.com/getting-started/ 前言 之前整理了一篇关于Less的,现在就来整理一下关于Sass的 ...

  8. Solidity合约间的调用 -Solidity通过合约转ERC20代币

    Solidity通过合约转ERC20代币   ERC20代币并不能像Ether一样使用sendTo.transfer(amt)来转账,ERC20代币只能通过token中定义的transfer方法来转账 ...

  9. MySQL开发——【联合查询、多表连接、子查询】

    联合查询 所谓的联合查询就是将满足条件的结果进行拼接在同一张表中. 基本语法: select */字段 from 数据表1 union [all | distinct] select */字段 fro ...

  10. linux就该这么学,第十一天了

    今天讲了,网卡绑,定,两块网卡同时工作,自动备源,理论上速度提升一倍,工作中可以用到的技术 还有sshd服务,端口22,远程连接使用,还可以设置root是否可以直接登录,主要配置文件在,/etc/ss ...