2011-06-06 83 views
2

我正在創建一個網站,它將有一個「桌面」和「移動」主題。我有兩個主題包:mysite.theme和mysite.mobile_theme。 mobile_theme是桌面主題的精簡版,帶有新視圖和一組縮小視圖。我想根據網站訪問的網址(即mobile.mysite.com與www.mysite.com)在這兩個主題之間切換。基於URL改變皮膚層

隨着移動和桌面主題將分享大量的代碼,mysite.mobile_theme從mysite.theme下降在以下幾個方面:

1)mobile_theme GS skins.xml有基於舊的主題皮膚路徑,所以桌面主題的CSS等用於:

<skin-path name="mysite.mobile_theme" based-on="mysite.theme"> 

2)IThemeSpecific標記子類原單,所以它的觀點我不覆蓋的移動網站回退在mysite.theme的那些:

from mysite.theme.browser.interfaces import IThemeSpecific as IBaseTheme 
class IThemeSpecific(IBaseTheme): 
    """Marker interface that defines a Zope 3 browser layer. 
    """ 

3)我在mysite.mobile_theme中註冊了各種視圖來覆蓋mysite.theme中的某些視圖。

4)我已經使用通用設置爲每個主題進行不同的Viewlet註冊。

在這個階段,如果我在「默認皮膚」選項門戶skins-選擇mysite.mobile_theme>性質,一切正常:使用我的看法,並從mobile_theme的GS配置文件中的Viewlets設置是否正確回升。所以看起來主題設置正確。

但是,如上所述,我想根據URL在這兩個主題之間進行交換。

首先,我將「Default skin」換成了「mysite.theme」。然後,我在我的Plone站點的根目錄中創建了一個access_rule,大致遵循these instructions以基於URL選擇皮膚。這是一個在plonesite/access_rule並設置爲access_rule爲Plone站點:

url = context.REQUEST.get('ACTUAL_URL', '') 

if 'mobile' in url: 
    context.changeSkin('mysite.mobile_theme', context.REQUEST) 
else: 
    context.changeSkin('mysite.theme', context.REQUEST) 

我也使用context.REQUEST.set('plone_skin', 'mysite.theme')而不是調用​​嘗試。

使用此設置,顯示的視圖會根據我使用的URL正確更改 - 因此看起來皮膚在某個時刻正在更改 - 但mysite.mobile_theme的視圖類/模板未被使用而不是mysite.theme的。總結:

  • 如果我從包含「移動」的URL調用,我得到mysite.theme的意見,但mysite.mobile_theme的viewlet註冊。
  • 否則,我得到mysite.theme的意見和mysite.theme的viewlet註冊。

它看起來像我可能要掛鉤到遍歷機制來改變它,如果「移動」在URL中,mysite.mobile_theme的觀點註冊兌IThemeSpecific被選擇,而不是mysite.theme的,但我不確定這是否正確,也不知道如何去做。

任何人都可以給我一些指針嗎?

UPDATE 3小時後,最初問

要回答我的問題(我不能爲5小時,由於SO的規則做):

「」」 這樣看來,你必須修補低得多倒在堆棧,使這項工作,我看着它是如何在做plone.gomobile,他們猴補丁的皮膚選擇代碼本身。見:

http://code.google.com/p/plonegomobile/source/browse/gomobile.mobile/trunk/gomobile/mobile/monkeypatch.py 「」」

+0

備案:現今(2013年),您可以制定只適用於某些情況下的CSS規則。尋找「CSS媒體查詢」。使用該方法,您只需要一個CSS文件和一組HTML。 – 2013-02-15 13:06:51

回答

2

你可以使用collective.editskinswitcher。它的主要用例是在edit.example.com上使用Plone默認主題,在www.example.com上使用我的自定義主題。你可以調整它的屬性表來適應你的用例。

由於「移動主題」用例相當普遍,我會接受修補程序以使其更容易;或者我可以在一段時間內爲此工作。 (請注意,有一個修復 - 瀏覽器 - 圖層分支可以幫助您在錯過某些爲特定瀏覽器層註冊的項目時看起來準備合併,只是我想先添加一些測試。 )

+1

該產品看起來像它所需要的。我特別喜歡使用IBeforeTraverseEvent而不是猴子補丁。將此答覆標記爲已接受的答案。 – 2011-06-07 09:04:18

0

我是否正確理解在移動URL上您的皮膚是正確的,但您的Zope3視圖不是?這對我來說很有意義,因爲視圖類是基於接口的。以上述相同的代碼,在您使用context.changeSkin,添加:

from zope.interface import alsoProvides 
alsoProvides(context, IMobileView) 

,有你的觀點ZCML指定for ... IMobileView

[編輯:轉念一想,這確實應該是當你改變皮膚會發生什麼 - 那裏的額外接口將是你的「IThemeSpecific」 - 所以我不確定這裏有什麼玩,但它不會傷害嘗試alsoProvides(context, IThemeSpecific)]

+0

我試着將其添加到我的access_rule(這是一個腳本(Python)對象,所以我需要取消限制某些模塊)。不幸的是,這對我的結果沒有任何影響。 – 2011-06-06 13:22:02

2

我已經在一些手機主題原型中做了這個。請考慮放入系統2個插件不能用於生產:

相關的代碼是:

+1

這裏肯定有一些有用的代碼,謝謝! – 2011-06-07 09:05:18