2011-06-06 74 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