0

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

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

但是,这是行不通的。如果首先访问移动站点,则桌面将获取移动页面,反之亦然。

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

4

2 回答 2

0

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

但是,作为替代方案,您可能会让所有 webflow 用户进入同一个视图,但在该视图本身内,您可以使用自己的 taglib 覆盖 g:layout taglib,该 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>

然后你的标签库:

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 采用的其他参数。

于 2013-03-14T17:03:44.817 回答
0

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

http://adammonsen.com/post/548

于 2013-02-11T00:46:37.440 回答