要求很简单:
根据网址,如何确定与哪个Layout
对应?
我需要这样做的原因是某些布局满足特定条件我需要根据用户的角色/用户组将它们重定向到某个其他布局。我正在使用过滤器钩来实现这一目标。
例如:
所有这些都是相同的布局:
http://localhost:8080/web/guest/home
转到访客的主页http://localhost:8080/home
也会转到访客的主页http://localhost:8080/web/guest/home?something=isSomething&etc
也会转到主页然后还有其他类似的URL模式,但用于从主题提供CSS,JS和图像,然后有不同资产的友好URL,例如:
http://localhost:8080/combo?someparameters
目前我在Filter钩子中使用字符串操作获取布局,比如获取URL的path元素,然后搜索布局的friendly-url等;但这种方法似乎最容易出错。
了解liferay如何处理所有这些场景会很好,任何指向代码或方法的指针都会有所帮助。
由于
答案 0 :(得分:1)
此代码允许从您拥有的友好URL获取完整的URL。我们假设您有一个格式为/view/users
的友好URL,现在您想要从bean方法进行重定向。您将无法执行context.redirect("/view/users")
。您需要完整的URL,为此您可以使用此代码。优点是它找到当前的groupID而不对其进行硬编码。第一步是获得主题。接下来,您将根据友好URL获取目标页面的布局。最后,通过此布局,您可以获得它的URL。
ThemeDisplay theme = (ThemeDisplay) getPortletRequest().getAttribute(WebKeys.THEME_DISPLAY);
final long GROUP_ID = theme.getLayout().getGroupId();
Layout destinationLayout = LayoutLocalServiceUtil.getFriendlyURLLayout(GROUP_ID, false, friendlyUrl);`
String completeUrl = PortalUtil.getLayoutFullURL(destinationLayout , theme);
其中getPortletRequest
是:
private PortletRequest getPortletRequest() {
FacesContext facesContext = FacesContext.getCurrentInstance();
Object obj = facesContext.getExternalContext().getRequest();
if (obj instanceof PortletRequest) {
PortletRequest pr = (PortletRequest) obj;
return pr;
}
return null;
}
答案 1 :(得分:1)
如果您在processFilter
方法中编写此逻辑,则可以直接从Layout
参数获取request
对象,例如:
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.portal.model.Layout;
...
Layout layout = (Layout)request.getAttribute(WebKeys.LAYOUT);
这不允许你只给出一个字符串URL来获取Layout
对象,但是如果你在一个过滤器钩子中,这可能就是你想要做的。
答案 2 :(得分:0)
在上面的示例中,/ home是Layout的友好URL。第二个网址再次进入/ home,因为/ home是默认的公共登录页面。第三个网址再次带回家,因为它与第一种情况相同,但有一些额外的参数(一切都在'?'之后)。
你可以看一下:
LayoutLocalServiceUtil.fetchLayoutByFriendlyURL(long groupId, boolean privateLayout, String friendlyURL)
" groupId"这是友好网址是" / guest"的集团。您可以使用GroupLocalServiceUtil.fetchFriendlyURLGroup(long companyId,String friendlyURL)获取该组。
" privateLayout"只要" / web"这里就是假的。通常指向公共区域。
" friendlyURL"这是你的" / home"。
希望这有帮助!