Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从给定URL获取有效的Liferay布局_Liferay_Hook_Url Routing_Liferay 6 - Fatal编程技术网

如何从给定URL获取有效的Liferay布局

如何从给定URL获取有效的Liferay布局,liferay,hook,url-routing,liferay-6,Liferay,Hook,Url Routing,Liferay 6,要求很简单: 给定一个URL,如何确定它对应于哪个布局? 我需要这样做的原因是,对于满足特定条件的某些布局,我需要根据用户的角色/用户组将它们重定向到某个其他布局。我使用过滤器挂钩来实现这一点 例如: 所有这些都是相同的布局: http://localhost:8080/web/guest/home转到来宾的主页 偶数http://localhost:8080/home如果设置了虚拟主机,也会转到来宾的主页 http://localhost:8080/web/guest/home?someth

要求很简单:

给定一个URL,如何确定它对应于哪个
布局?

我需要这样做的原因是,对于满足特定条件的某些布局,我需要根据用户的角色/用户组将它们重定向到某个其他布局。我使用过滤器挂钩来实现这一点

例如:

所有这些都是相同的布局:

  • 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
目前,我正在使用过滤器钩子中的字符串操作获取布局,比如获取URL的路径元素,然后搜索布局的友好URL等;但这种方法充其量也似乎容易出错

了解liferay如何处理所有这些场景会很好,任何指向代码或方法的指针都会有所帮助


谢谢

在上面的示例中,/home是布局的友好url。第二个url再次转到/home,因为/home是默认的公共登录页。第三个url再次返回主url,因为它与第一个url相同,但有一些附加参数(在“?”之后)

你可以看看:

LayoutLocalServiceUtil.fetchLayoutByFriendlyURL(long groupId, boolean privateLayout, String friendlyURL) LayoutLocalServiceUtil.fetchLayoutByFriendlyURL(长组ID、布尔私有布局、字符串friendlyURL) 这里的“groupId”是友好url为“/guest”的组。您可以使用GroupLocalServiceUtil.fetchFriendlyURLGroup(长公司ID,字符串friendlyURL)获取该组

只要“/web”通常指向公共区域,这里的“privateLayout”就是错误的

这里的“friendlyURL”是您的“/家”


希望这有帮助

此代码允许从您拥有的友好URL获取完整的URL。假设您有一个友好的URL,其格式为
/view/users
,现在您需要执行一个来自bean的重定向方法。您将无法执行上下文重定向(“/view/users”)
。您需要完整的URL,为此您可以使用此代码。优点是它可以找到当前的groupID,而无需硬编码。第一步是获得主题。接下来,根据您的友好URL获得目标页面的布局。最后,从这个布局中可以得到它的URL

  • 其中
    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;
    }
    

  • 如果在
    processFilter
    方法中编写此逻辑,则可以直接从
    request
    参数获取
    Layout
    对象,如:

    import com.liferay.portal.kernel.util.WebKeys;
    import com.liferay.portal.model.Layout;
    ...
    Layout layout = (Layout)request.getAttribute(WebKeys.LAYOUT);
    

    这不允许您仅在给定字符串URL的情况下获取
    布局
    对象,但如果您在过滤器挂钩中,这可能就是您想要做的。

    谢谢。但这是我已经在做的,我正在解析URL,以获得组和最后一个路径作为友好URL传递。如果这个问题不清楚,请原谅。但也有类似
    http://localhost:8080/combo?someparameters
    等类似于
    http://localhost:8080/home?someparameters
    但liferay在内部使用它们来打包一些css和js。因此,我如何知道这是否是一个有效的布局或liferay关键字或其他内容。我没有使用任何
    ,但我仍然无法理解代码。请详细说明您正在尝试做什么?谢谢你,你打算在哪里写这段代码?正如我所说,我正在使用过滤器,这将在过滤器挂钩工作?我还是会试试这个。谢谢您可以在托管bean中编写它。不确定面上下文是否在过滤器中可用
    String completeUrl = PortalUtil.getLayoutFullURL(destinationLayout , theme);
    
    private PortletRequest getPortletRequest() {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        Object obj = facesContext.getExternalContext().getRequest();
        if (obj instanceof PortletRequest) {
            PortletRequest pr = (PortletRequest) obj;
            return pr;
        }
        return null;
    }
    
    import com.liferay.portal.kernel.util.WebKeys;
    import com.liferay.portal.model.Layout;
    ...
    Layout layout = (Layout)request.getAttribute(WebKeys.LAYOUT);