Liferay 7:如何为Blogs Aggregator应用自定义模板
嘿,我来帮你搞定Blogs Aggregator Portlet自定义模板的事儿!既然ADT用不了,咱们有几个实用的方案可以尝试:
方案1:用JSP钩子(Hook)覆盖默认模板
这是最直接的路子,毕竟Liferay的Portlet大多默认用JSP渲染视图:
- 先找到Blogs Aggregator默认的JSP路径,一般是
/html/portlet/blogs_aggregator/view.jsp(不同Liferay版本可能略有差异,7.x及以上是在OSGi模块里,钩子路径对应上就行) - 接着创建一个Hook项目(7.x+的话要做OSGi Fragment模块),把你改好的自定义JSP放在和原路径完全一致的位置,比如Fragment里的
resources/META-INF/resources/html/portlet/blogs_aggregator/view.jsp - 然后就可以在自定义JSP里自由修改了:你能直接复用原JSP里的变量,比如通过
<% List<BlogsEntry> entries = (List<BlogsEntry>) request.getAttribute("blogsEntries"); %>拿到博客条目列表,然后调整排版、自定义显示字段,甚至加额外内容 - 要是用7.x+的Fragment,记得在
bnd.bnd文件里指定要挂钩的目标模块,比如写Fragment-Host: com.liferay.blogs.web;bundle-version="[你的Liferay版本范围]",不然Hook找不到对应的Portlet
方案2:扩展原Portlet,完全自定义视图
如果钩子满足不了你的需求,比如要加额外业务逻辑,那就直接扩展原Portlet:
- 先建一个新的OSGi Portlet模块,依赖原Blogs Aggregator的服务,比如
com.liferay.blogs.api和com.liferay.blogs.web - 然后继承原Portlet的类(比如
BlogsAggregatorPortlet),重写render方法,或者指定自己的JSP作为视图路径 - 最后在自定义JSP里实现完全自主的渲染逻辑:你可以调用Liferay的
BlogsEntryLocalService来获取博客条目,然后想怎么排版就怎么排版,还能加自定义的筛选、排序功能
方案3:借助Theme的自定义模板(适合7.x+版本)
如果只是调整样式和简单结构,用Theme改更方便:
- 先在你的Theme项目里创建
templates/portlet/blogs_aggregator目录 - 然后新建
view.ftl文件,用Freemarker语法写渲染逻辑,比如遍历博客条目:
<#list entries as entry> <div class="custom-blog-card"> <h3 class="blog-title">${entry.title}</h3> <div class="blog-excerpt">${entry.content}</div> <span class="blog-meta">发布于 ${entry.createDate?datetime}</span> </div> </#list>
- 部署Theme之后,Blogs Aggregator Portlet会自动用上这个自定义模板。不过要注意,这里能用的变量取决于Liferay的Theme模板上下文,可能需要调试确认可用的变量
小提醒
- 不管用哪种方法,先备份原文件,方便出问题了回滚
- 开发时打开Liferay的开发模式,改完JSP或FTL不用重启服务器,刷新页面就能看到效果
- 如果是Liferay DXP版本,要注意权限和版权问题,确保自定义模块符合要求
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

