2013-02-10 47 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需要的其他參數。