You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:13:51