【发布时间】:2011-06-06 23:52:19
【问题描述】:
我正在创建一个具有“桌面”和“移动”主题的网站。我有这个站点的两个主题包:mysite.theme 和 mysite.mobile_theme。 mobile_theme 是桌面主题的精简版,具有新视图和精简的视图集。我想根据访问网站的 URL(即 mobile.mysite.com 与 www.mysite.com)在这两个主题之间切换。
由于移动和桌面主题将共享大量代码,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 注册。
在这个阶段,如果我在“默认皮肤”选项门户皮肤->属性中选择 mysite.mobile_theme,一切正常:使用我的视图和来自 mobile_theme 的 GS 配置文件的视图设置被正确拾取。所以看起来主题的整体设置是正确的。
不过,如上所述,我想根据 URL 在这两个主题之间进行交换。
首先,我将“默认皮肤”换回“mysite.theme”。然后我在我的 Plone 站点的根目录中创建了一个 access_rule,大致遵循 these instructions 以根据 URL 选择皮肤。它位于 plonesite/access_rule 并设置为 plone 站点的 access_rule:
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'),而不是调用context.changeSkin(...)。
使用此设置,显示的 viewlet 会根据我使用的 URL 正确更改 - 所以看起来皮肤在某些时候正在更改 - 但 mysite.mobile_theme 的视图类/模板没有被使用偏好 mysite.theme 的。总结:
- 如果我从包含“mobile”的 URL 调用,我会得到 mysite.theme 的视图,但 mysite.mobile_theme 的 viewlet 注册。
- 否则,我会得到 mysite.theme 的视图和 mysite.theme 的 viewlet 注册。
看起来我可能不得不挂钩到遍历机制来更改它,所以如果 URL 中有“mobile”,则选择针对其 IThemeSpecific 注册的 mysite.mobile_theme 的视图,而不是 mysite.theme 的视图,但我我不确定这是正确的,也不知道我会怎么做。
谁能给我一些指点?
在最初询问后 3 小时更新
回答我自己的问题(由于 SO 的规定,我不能再等 5 个小时):
""" 看来您必须在堆栈中打低得多的补丁才能完成这项工作。我在 plone.gomobile 中查看了它是如何完成的,他们对皮肤选择代码本身进行了猴子补丁。见:
【问题讨论】:
-
记录在案:现在(2013 年)您可以制定仅在某些情况下应用的 CSS 规则。寻找“CSS 媒体查询”。使用该方法,您只需要一个 CSS 文件和一组 HTML。