重用Grails Webflow用于移动和桌面站点

时间:2013-02-10 22:02:25

标签: grails

我有一个grails webflow,适用于我的桌面浏览器应用程序。现在我想重新使用我的移动网站的webflow。我不希望有2个单独的Web流,只需更改用于每个州的页面。我尝试了以下方法:

viewState{
    String view = 'viewState'
    boolean isMobile = this.isMobileUser()
    if(isMobile){
        view = "/flowDir/mobile/viewState"
    }       
    render(view:view)       
}

然而这不起作用。如果首先访问移动网站,则桌面将获得移动页面,反之亦然。

有没有人遇到过这个问题?我真的很讨厌有2个webflows做同样的事情。我也讨厌入侵Sitemesh。任何有关如何重用此流程的想法或建议将不胜感激。

2 个答案:

答案 0 :(得分:0)

尝试将移动视图分辨率放入后置过滤器,以便您的Web流程执行相同的操作,但您可以截取正在渲染的视图并重命名它。

http://adammonsen.com/post/548

答案 1 :(得分:0)

我同意droggo的观点,即响应式设计是最佳解决方案。

但是,作为替代方案,您可能会让所有webflow用户访问相同的视图,但在该视图中,您可以使用自己的taglib覆盖g:layout taglib,以确定您是否是是否以移动用户身份运行,因此可以应用适当的布局。

在这种情况下,它可能有点沉重,但它会为您提供一个可以在整个应用程序中重复使用的解决方案,而不仅仅是在Webflow中,并且它将特定于移动设备的代码保存在一个位置。

所以在你的网络流程中:

viewState{
    String view = 'viewState'
    [snip] The rest of your code goes here     
    render(view:view)       
}

然后你的观点:

<myapp:applyLayout name="someWebflowLayout">
    [snip] Your non-layout GSP code goes here    
</myapp:applyLayout>

然后你的taglib:

class MyAppTagLib {
    static namespace = "myapp"

    def applyLayout = { attrs, body ->

        boolean mobileUser = false
        [snip] some logic to determine if this is a mobile user or not goes here

        if (mobileUser) {
            attrs.name = "mobileLayout/${attrs.name}"
        } else {
            attrs.name = "desktopLayout/${attrs.name}"
        }

        out << g.applyLayout(attrs, body)
    }
}

然后你会有两个名为someWebflowLayout的布局文件 - 一个在/ layouts / mobileLayout中,一个在/ layouts / desktopLayout内(虽然我很欣赏这些可能与你现有的结构不完全匹配)

上面的taglib中的代码只是一个粗略的指南,它需要支持来处理g:applyLayout所需的其他参数。