2013-02-10 46 views
0

我有一个适用于我的桌面浏览器应用的grails webflow。现在我想重用我的移动网站的webflow。我宁愿不要有2个独立的webflows,只是改变每个州使用的页面。我试过以下内容:为手机和桌面站点重用Grails Webflow

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

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

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

+0

一种选择是使用根据客户端设备和分辨率进行不同呈现的响应页面。以Twitter Boostrap和响应功能为例。这可以用CSS来完成。 – droggo 2013-02-10 22:42:05

回答

0

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

http://adammonsen.com/post/548

+0

我喜欢这个解决方案,但afterInterceptor似乎并没有被解雇。我想知道Webflows是否处理不同。 – Chad 2013-02-11 03:20:53

0

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

但是,作为替代方案,您可能会让所有webflow用户转到相同的视图,但在该视图中,您可以使用自己的taglib覆盖g:layout taglib,作为移动用户重新运行或不运行,因此可以应用适当的布局。

在这种情况下它可能有点沉重,但它会给你一个解决方案,可以在整个应用程序中重用,而不仅仅是在webflow中,它将移动专用代码保存在一个地方。

在你的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布局文件 - 一个内/布局/ mobileLayout和一个内/布局/桌面布局(虽然我很欣赏这些可能不会动态匹配你现有的结构)

上面taglib中的代码只是一个粗略的指导,它需要加强处理g:applyLayout需要的其他参数。