以编程方式获取liferay中页面的URL

ber*_*rdn 18 liferay liferay-6

我想在portlet中创建一个链接,以便我可以导航到liferay门户中的另一个页面.我命令这样做我正在寻找一个给定页面名称的API(可以是liferay特定的),它将返回它的url(它也可以是friendlyURL).

mvm*_*vmn 12

Liferay中的Portal页面确实Layouts在API和DB表中调用.它们是按plid字段标识的,可以使用LayoutLocalServiceUtil相关的API 获得,也可以通过其他一些调用获得themeDisplay.getLayout().

但是,为了构建包含页面URL的String,您必须连接门户网站,组和布局本身的友好URL(即/web/guest/home- web是公共页面的门户网站URL,guest默认情况下home是来宾组的友好URL,是家庭的友好URL页面/布局默认情况下).这可能很棘手,因为您必须检查这是公共页面还是私人页面等.

一旦您开始使用具有友好URL的虚拟主机,组就会发生变化.所以这不是一个好方法.

为了避免手动创建URL并确保URL保证正确,您应该使用com.liferay.portal.util.PortalUtil.getLayoutFriendlyURL(Layout layout, ThemeDisplay themeDisplay)静态方法PortalUtil- 它将为您完成所有必要的工作.虽然您还需要提供ThemeDisplay而不仅仅是布局.


p.m*_*ten 8

在Liferay中访问页面的API是LayoutService.但是,页面名称在Liferay中并不是唯一的,而且它们是国际化的.因此,除了名称之外,您还需要页面的一些唯一属性来检索其URL.

如果您确实只有页面名称,则可以使用LayoutLocalServiceUtil.getLayouts(...)循环遍历所有布局并检查某些属性(在本例中为其名称).

  • groupId + friendlyURL的组合虽然是独一无二的. (4认同)
  • FriendlyURL不是唯一的AFAIK.不同组中的两个页面(布局)可以具有相同的友好URL.实际上他们会,因为当你创建新的组时,你通常会创建一个带有"/ home"友好URL的页面.问题是页面的友好URL(布局)不包含完整路径(如"/ web/guest/home","/ web/user/home"),但只包含其中的一部分. (2认同)