我正在創建一個網站,它將有一個「桌面」和「移動」主題。我有兩個主題包: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,他們猴補丁的皮膚選擇代碼本身。見:
備案:現今(2013年),您可以制定只適用於某些情況下的CSS規則。尋找「CSS媒體查詢」。使用該方法,您只需要一個CSS文件和一組HTML。 – 2013-02-15 13:06:51