如何根据 portlet 中的值在 liferay 主题中创建动态项目

how to create dynamic items in liferay theme as per the values in the portlet

我在 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主题里做呢(我用的是velocity主题)

您的问题的评论中已经对此进行了相当多的讨论。您的主题无法访问 "your portlet's controller",这是错误的思考问题的方式:如果 portlet 决定要显示的内容,您应该将 portlet 嵌入到主题中。毕竟,您可能想要与其进行交互,这是最简单的方法。

即使 portlet 出现在页面上,主题也不能任意使用任何 portlet 的请求属性 - 它们在设计上很好地避免了相互访问:否则流氓 portlet 和主题之间会有各种冲突。

只要您不能保证页面上有一个 portlet,您就不能随便调用 portlet 上的任意方法。 (不是你可以否则)。

如果您想在主题中实现此功能,请与 "the portlet controller" 说再见。您应该将代码放在一个独立的实用程序 class 中,因为在这种情况下 portlet 只是错误的实现位置。

我没有完全理解你的完整用例,所以我不能告诉你哪个实现最有意义。只是你在问题中概述的组合对我来说最没有意义。

根据 Olaf 的回复,您可能应该采用更好的方法来解决此问题 design.You 但是可以在主题中使用 Servlet 上下文中的属性。 在您的 portlet class:

    HttpServletRequest request=PortalUtil.getHttpServletRequest(req);
    ServletContext servletContext=request.getSession().getServletContext();
    servletContext.setAttribute("param", "Product3");

然后可以通过主题速度模板中可用的请求变量在主题中检索:

    $request.getSession().getServletContext().getAttribute("param")