我在liferay中有一个主题,侧面菜单中有一些项目,我想根据我在portlet控制器中获得的值动态地向菜单中添加一些项目。
我的主题是这样的:
<div id="menu">
<ul class="link" style="height: 609px;">
<li><a href="$themeDisplay.getPortalURL()/x" id="x" class="active">My Account<i class="pull-right" ></i></a></li>
<li><a href="$themeDisplay.getPortalURL()/y" id="y" class="active">Settings<i class="pull-right" ></i></a></li>
</ul>
</div>
我有一个portlet,我从列表中获取了一些值
List<String> list= new ArrayList<String>();
list.add("test1");
renderRequest.setAttribute("list", list);
列表可能有不同的值。
我想要的是如果我在列表中有一个名为test1的参数,我想在主题中添加一个新参数,以供该特定用户使用。
<li><a href="$themeDisplay.getPortalURL()/z" id="z" class="active">Bonus<i class="pull-right" ></i></a></li>
如果是JSP,我会使用但是如何在liferay主题中完成。(我使用的是速度主题)。
答案 0 :(得分:2)
在您的问题评论中已经对此进行了相当多的讨论。您的主题无法访问“您的portlet的控制器”,这是思考问题的错误方法:如果portlet确定要显示的内容,则应将portlet嵌入主题中。毕竟,您可能希望与它进行交互,这是最简单的方法。
即使在页面上存在一个portlet,主题也不能随意使用任何portlet的请求属性 - 它们可以很好地避免通过设计相互访问:否则你将拥有所有流氓portlet和主题之间的各种冲突。
只要你不能保证页面上有一个portlet,你就不能只调用portlet上的任意方法。 (不是你可以的话)。
如果您想在主题中实现此功能,请告别“portlet控制器”。您应该将代码放在一个独立的实用程序类中,因为在这种情况下,portlet只是实现的错误位置。
我不完全理解你的完整用例,所以我不能告诉你哪个实现最有意义。只有你在问题中勾勒出的组合对我来说才是最不合理的。
答案 1 :(得分:2)
根据奥拉夫的回复,您可能应该采用更好的方法来进行此设计。但是,您可以在主题中使用Servlet上下文中的属性。 在您的portlet类中:
HttpServletRequest request=PortalUtil.getHttpServletRequest(req);
ServletContext servletContext=request.getSession().getServletContext();
servletContext.setAttribute("param", "Product3");
然后可以通过主题速度模板中提供的请求变量在主题中检索:
$request.getSession().getServletContext().getAttribute("param")