我正在创建一个网站,它将有一个“桌面”和“移动”主题。我有两个主题包: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